10【模块学习】LCD1602(二):6路温度显示+实时时钟
项目:6路温度显示+实时时钟
- 1、6路温度显示
- ①TempMenu.c文件的代码
- ②TempMenu.h文件的代码
- ③main.c文件的代码
- ④Timer.c文件的代码
- ⑤Delay.c文件的代码
- ⑥Key.c文件的代码
- 2、实时时钟显示
- ①BeiJingTime.c文件的代码
- ②BeiJingTime.h文件的代码
- ③main.c文件的代码如下
- ④Timer.c文件的代码
1、6路温度显示
项目描述:
①单片机启动时,LCD1602显示启动界面 “TEMP MENU”
②显示1s后,自动跳转到显示温度数据。一次显示界面显示2路温度数据
③LCD1602显示温度分为自动模式和手动模式,在自动模式下:每隔1s跳转显示。
④使用按键KEY2切换自动模式和手动模式,切换时显示为“Automa”表示切换为自动模式,显示为“Manual”表示手动模式
⑤在手动模式下:按键KEY1用于切换温度显示
⑥按键KEY4用于切换为设置不同通道温度阈值模式,进入设置模式后,按键KEY1为增加温度阈值,KEY2为减小温度阈值,KEY3确定阈值并且退出设置模式
项目演示:
QQ2025415-112215
①TempMenu.c文件的代码
#include "TempMenu.h"/* 定义6路 CH1~CH6 温度缓存区 */
float Temp[] = {15.23, 21.55, 25.41, 22.77, 27.14, 22.34};/* 定义CH1~CH6通道温度阈值 */
unsigned char ThreTemp[] = {11, 12, 13, 14, 15, 16};unsigned char Waring_CHNum = 0;/*** 温度菜单开机显示*/
void Temp_StartMenu(void)
{LCD_ShowString(1,1," TEMP MENU ");LCD_ShowString(2,1," V1.0 ");
}/*** 显示℃字符函数*/
void SHOW_C(unsigned char Hang, unsigned char Lie)
{LCD_ShowChar(Hang, Lie, 0xdf);LCD_ShowChar(Hang, Lie + 1, 0x43);
}/*** 显示CH1 CH2通道的温度*/
void SHOW_CH1_CH2(void)
{/* 显示CH1通道的温度 */LCD_ShowString(1,1,"CH1:");LCD_ShowFloat(1,5,Temp[0],2,2);SHOW_C(1,11);LCD_ShowString(1,14," ");//清除上一次显示的残留字符/* 显示CH2通道的温度 */LCD_ShowString(2,1,"CH2:");LCD_ShowFloat(2,5,Temp[1],2,2);SHOW_C(2,11);LCD_ShowString(2,13," ");
}/*** 显示CH3 CH4通道的温度*/
void SHOW_CH3_CH4(void)
{/* 显示CH3通道的温度 */LCD_ShowString(1,1,"CH3:");LCD_ShowFloat(1,5,Temp[2],2,2);SHOW_C(1,11);/* 显示CH4通道的温度 */LCD_ShowString(2,1,"CH4:");LCD_ShowFloat(2,5,Temp[3],2,2);SHOW_C(2,11);
}/*** 显示CH5 CH6通道的温度*/
void SHOW_CH5_CH6(void)
{/* 显示CH5通道的温度 */LCD_ShowString(1,1,"CH5:");LCD_ShowFloat(1,5,Temp[4],2,2);SHOW_C(1,11);/* 显示CH6通道的温度 */LCD_ShowString(2,1,"CH6:");LCD_ShowFloat(2,5,Temp[5],2,2);SHOW_C(2,11);
}/*** 显示设置CH1通道阈值界面*/
void SHOW_SetCH1Temp(void)
{LCD_ShowString(1,1," SETING ");/* 显示被设置CH1通道的温度 */LCD_ShowString(2,1,"CH1:");LCD_ShowFloat(2,5,ThreTemp[0],2,2);SHOW_C(2,11);LCD_ShowString(2,13," ");
}/*** 显示设置CH2通道阈值界面*/
void SHOW_SetCH2Temp(void)
{LCD_ShowString(1,1," SETING ");/* 显示被设置CH2通道的温度 */LCD_ShowString(2,1,"CH2:");LCD_ShowFloat(2,5,ThreTemp[1],2,2);SHOW_C(2,11);LCD_ShowString(2,13," ");
}/*** 显示设置CH3通道阈值界面*/
void SHOW_SetCH3Temp(void)
{LCD_ShowString(1,1," SETING ");/* 显示被设置CH3通道的温度 */LCD_ShowString(2,1,"CH3:");LCD_ShowFloat(2,5,ThreTemp[2],2,2);SHOW_C(2,11);LCD_ShowString(2,13," ");
}/*** 显示设置CH4通道阈值界面*/
void SHOW_SetCH4Temp(void)
{LCD_ShowString(1,1," SETING ");/* 显示被设置CH4通道的温度 */LCD_ShowString(2,1,"CH4:");LCD_ShowFloat(2,5,ThreTemp[3],2,2);SHOW_C(2,11);LCD_ShowString(2,13," ");
}/*** 显示设置CH5通道阈值界面*/
void SHOW_SetCH5Temp(void)
{LCD_ShowString(1,1," SETING ");/* 显示被设置CH5通道的温度 */LCD_ShowString(2,1,"CH5:");LCD_ShowFloat(2,5,ThreTemp[4],2,2);SHOW_C(2,11);LCD_ShowString(2,13," ");
}/*** 显示设置CH6通道阈值界面*/
void SHOW_SetCH6Temp(void)
{LCD_ShowString(1,1," SETING ");/* 显示被设置CH6通道的温度 */LCD_ShowString(2,1,"CH6:");LCD_ShowFloat(2,5,ThreTemp[5],2,2);SHOW_C(2,11);LCD_ShowString(2,13," ");
}/*** 显示报警界面*/
void SHOW_Waring(void)
{LCD_ShowString(1,1," WARING ");/* 显示被设置CH6通道的温度 */LCD_ShowString(2,1,"WaR CH Num:");LCD_ShowNum(2, 12, Waring_CHNum,2);
}
②TempMenu.h文件的代码
#ifndef __TempMen_H
#define __TempMen_H
#include "LCD1602.h"void Temp_StartMenu(void);
void SHOW_C(unsigned char Hang, unsigned char Lie);
void SHOW_CH1_CH2(void);
void SHOW_CH3_CH4(void);
void SHOW_CH5_CH6(void);void SHOW_SetCH1Temp(void);
void SHOW_SetCH2Temp(void);
void SHOW_SetCH3Temp(void);
void SHOW_SetCH4Temp(void);
void SHOW_SetCH5Temp(void);
void SHOW_SetCH6Temp(void);void SHOW_Waring(void);#endif
③main.c文件的代码
#include "LCD1602.h"
#include "TempMenu.h"
#include "Key.h"
#include "Delay.h"
#include "Timer.h"extern char ThreTemp[]; //CH1~CH6通道温度阈值
static char SET_Channel = 0; //设置模式下通道切换变量
static char Seting_Flag = 0; //进入设置模式标志位
char Menu_Status = 0; //状态变量
bit Mode = 0; //0表示自动模式,1表示手动模式void KEY_ChangeMenu(void);
void SHOW_CHange(void);void main(void)
{LCD_Init(); Time0_Intrrupt_Init();Temp_StartMenu(); //开机显示1sDelay_s(1);LCD_WriteCommand(0x01); //清屏while(1){KEY_ChangeMenu();SHOW_CHange();}
}/*** 按键切换菜单函数*/
void KEY_ChangeMenu(void)
{switch(Key_Scanf()){case 1: //按键1按下if(!Seting_Flag) //没有进入设置模式{Menu_Status++; //按下KEY1改变Menu_Statusif(Menu_Status >= 4)Menu_Status = 0;}else //在设置模式下{switch(SET_Channel) //按下KEY1增加温度阈值{case 1:ThreTemp[0]++;break; //增加CH1的温度阈值case 2:ThreTemp[1]++;break; //增加CH2的温度阈值case 3:ThreTemp[2]++;break; //增加CH3的温度阈值case 4:ThreTemp[3]++;break; //增加CH4的温度阈值case 5:ThreTemp[4]++;break; //增加CH5的温度阈值case 6:ThreTemp[5]++;break; //增加CH6的温度阈值default:break;}}break;case 2: //按键2按下if(!Seting_Flag) //没有进入设置模式{Mode = !Mode; //切换模式if(Mode == 0) //表示自动模式{LCD_ShowString(1,1," Automa ");LCD_ShowString(2,1," Automa ");}else //手动模式{LCD_ShowString(1,1," Manual ");LCD_ShowString(2,1," Manual ");}Delay_s(1);}else //在设置模式下{switch(SET_Channel) //按下KEY1减小温度阈值{case 1:ThreTemp[0]--;break; //减小CH1的温度阈值case 2:ThreTemp[1]--;break; //减小CH2的温度阈值case 3:ThreTemp[2]--;break; //减小CH3的温度阈值case 4:ThreTemp[3]--;break; //减小CH4的温度阈值case 5:ThreTemp[4]--;break; //减小CH5的温度阈值case 6:ThreTemp[5]--;break; //减小CH6的温度阈值default:break;}}break;case 3: //按键3按下,切换到初始界面if(!Seting_Flag) //没有进入设置模式{Menu_Status = 0; //复位显示}else //在设置模式下{Seting_Flag = 0; //退出设置模式Mode = 0; //退出手动模式LCD_ShowString(1,1," SET OK ");LCD_ShowString(2,1," SET OK ");Delay_s(1);}break;case 4: //按键4按下,切换到设置界面Seting_Flag = 1; //进入设置模式Mode = 1; //进入手动模式,关闭定时器改变Menu_StatusMenu_Status = 4; SET_Channel++; //切换设置通道if(SET_Channel == 7){SET_Channel = 1;}break;default:break;}
}/*** 在不同的Menu_Status下的显示不同的界面*/
void SHOW_CHange(void)
{switch(Menu_Status){case 0:SHOW_CH1_CH2();break; //显示CH1-CH2通道的温度case 1:SHOW_CH3_CH4();break; //显示CH3-CH4通道的温度case 2:SHOW_CH5_CH6();break; //显示CH5-CH6通道的温度case 3:SHOW_Waring(); break; //显示报警界面case 4: //显示设置温度阈值界面switch(SET_Channel){case 1:SHOW_SetCH1Temp();break; //显示设置CH1通道的界面case 2:SHOW_SetCH2Temp();break; //显示设置CH2通道的界面case 3:SHOW_SetCH3Temp();break; //显示设置CH3通道的界面case 4:SHOW_SetCH4Temp();break; //显示设置CH4通道的界面case 5:SHOW_SetCH5Temp();break; //显示设置CH5通道的界面case 6:SHOW_SetCH6Temp();break; //显示设置CH6通道的界面}break;default:break;}
}
④Timer.c文件的代码
#include "Timer.h"/*** 定时器T0的初始化*/
void Time0_Intrrupt_Init(void)
{/* 设置T0的计数器为16,且时钟来源为晶振 TMOD = xxxx 0001 */TMOD &= 0xF0; //将低4位置0TMOD |= 0x01; //最低位置1/* 设置定时计数器的初始值,定时1ms */TH0 = ((65535 - (1000 - 1)) >> 8);TL0 = (65535 - (1000 - 1)) & 0x00FF;/* 启动T0 */TF0 = 0; //清除标志位TR0 = 1; //启动定时器0/* 开启中断 */PT0 = 1; //优先级较高ET0 = 1; //使能定时器溢出中断EA = 1; //开启总开关
}/********中断服务函数*******/
/*** T0的中断服务函数(每隔1ms对TimeCount加1)*/
static unsigned long TimeCount = 0;
static unsigned char StatusFlag = 0;
static unsigned long GetTimeCon = 0;
extern char Menu_Status;
extern bit Mode;
void Time0_Rountine(void) interrupt 1
{//这里不用清除标志位,硬件会自动清除/* 设置定时计数器的初始值,定时1ms */TH0 = ((65535 - (1000 - 1)) >> 8);TL0 = (65535 - (1000 - 1)) & 0x00FF;TimeCount++;/* 每隔2s改变一次Menu_Status */switch(StatusFlag){case 0:GetTimeCon = TimeCount;StatusFlag = 1;case 1:if(TimeCount - GetTimeCon == 2000){GetTimeCon = TimeCount;if(!Mode) //自动模式下{Menu_Status++;if(Menu_Status >= 4){Menu_Status = 0;}}}break;}
}/*** 对外暴露TimeCount的值*/
unsigned long Get_TimeCount(void)
{return TimeCount;
}
⑤Delay.c文件的代码
#include "Delay.h"
#include "Timer.h"/*** 使用T0构造延时函数ms*/
void Delay_ms(unsigned int nms)
{unsigned long time = Get_TimeCount();//获取此时的TimeCount值while((Get_TimeCount() - time) < nms);
}/*** 使用T0构造延时函数s*/
void Delay_s(unsigned char s)
{while(s--){Delay_ms(1000);}
}
⑥Key.c文件的代码
#include "Key.h"
#include "Delay.h"/*** 按键检测函数(按下按下,引脚输入低电平)* Position:需要检测那个按键* 返回值:不同的按键按下,返回值不同*/
unsigned char Key_Scanf(void)
{ unsigned char Key_Number = 0;if(!GPIO3_0 || !GPIO3_1 || !GPIO3_2|| !GPIO3_3){Delay_ms(10);//延时消抖if(!GPIO3_0)Key_Number = 1;if(!GPIO3_1)Key_Number = 2;if(!GPIO3_2)Key_Number = 3;if(!GPIO3_3)Key_Number = 4;while(!GPIO3_0 || !GPIO3_1 || !GPIO3_2|| !GPIO3_3);//按键松手,跳出此循环Delay_ms(10);//延时消抖}return Key_Number;//返回键值
}
2、实时时钟显示
项目描述:
①单片机启动时,LCD1602显示启动界面 “BeiJing Time”
②按键KEY4用于切换为设置时钟秒/分/时模式,进入设置模式后,按键KEY1为增加时钟,KEY1为减小时钟,KEY3确定时钟并且退出设置模式
项目演示:
QQ2025415-115636
①BeiJingTime.c文件的代码
#include "BeijingTime.h"/* 定义存储时分秒的缓存区 */
char Current_Time[] = {10, 10 ,10};//时分秒/*** 北京时间开机显示界面*/
void Beijing_Start(void)
{LCD_ShowString(1,1," BeiJing Time ");LCD_ShowString(2,1," V1.0 ");
}/*** 显示当前时间*/
void SHOW_Current_Time(void)
{LCD_ShowString(1,1," Current Time ");LCD_ShowNum(2, 5, Current_Time[0],2);LCD_ShowChar(2,7,':');LCD_ShowNum(2, 8, Current_Time[1],2);LCD_ShowChar(2,10,':');LCD_ShowNum(2, 11, Current_Time[2],2);
}/*** 显示设置小时*/
void Set_Hour(void)
{LCD_ShowString(1,1," SET Hour ");LCD_ShowNum(2, 5, Current_Time[0],2);LCD_ShowChar(2,7,':');LCD_ShowNum(2, 8, Current_Time[1],2);LCD_ShowChar(2,10,':');LCD_ShowNum(2, 11, Current_Time[2],2);
}/*** 显示设置分钟*/
void Set_Min(void)
{LCD_ShowString(1,1," SET Min ");LCD_ShowNum(2, 5, Current_Time[0],2);LCD_ShowChar(2,7,':');LCD_ShowNum(2, 8, Current_Time[1],2);LCD_ShowChar(2,10,':');LCD_ShowNum(2, 11, Current_Time[2],2);
}/*** 显示设置秒*/
void Set_Second(void)
{LCD_ShowString(1,1," SET Second ");LCD_ShowNum(2, 5, Current_Time[0],2);LCD_ShowChar(2,7,':');LCD_ShowNum(2, 8, Current_Time[1],2);LCD_ShowChar(2,10,':');LCD_ShowNum(2, 11, Current_Time[2],2);
}
②BeiJingTime.h文件的代码
#ifndef __BeijingTime_H
#define __BeijingTime_H
#include "LCD1602.h"void Beijing_Start(void);
void SHOW_Current_Time(void);
void Set_Hour(void);
void Set_Min(void);
void Set_Second(void);#endif
③main.c文件的代码如下
#include "LCD1602.h"
#include "BeijingTime.h"
#include "Key.h"
#include "Delay.h"
#include "Timer.h"extern char Current_Time[];
static unsigned char SET = 0;
unsigned char Seting_Flag = 0; //进入设置模式标志位void KEY_ChangeStatues(void);
void SHOW_TIME(void);void main(void)
{LCD_Init(); Time0_Intrrupt_Init();Beijing_Start(); //开机显示1sDelay_s(1);LCD_WriteCommand(0x01); //清屏while(1){KEY_ChangeStatues();SHOW_TIME();}
}/*** KEY4改变状态*/
void KEY_ChangeStatues(void)
{switch(Key_Scanf()){case 1:if(Seting_Flag) //在设置模式下{switch(SET){case 1:Current_Time[2]++; //KEY1按键按下增加秒if(Current_Time[2] > 60)Current_Time[2] = 0;break;case 2:Current_Time[1]++; //KEY1按键按下增加分if(Current_Time[1] > 60)Current_Time[1] = 0;break;case 3:Current_Time[0]++; //KEY1按键按下增加时if(Current_Time[0] > 24)Current_Time[0] = 0;break;default:break;}}break;case 2:if(Seting_Flag) //在设置模式下{switch(SET){case 1:Current_Time[2]--; //KEY2按键按下减少秒if(Current_Time[2] < 0)Current_Time[2] = 59;break;case 2: Current_Time[1]++; //KEY2按键按下减少分if(Current_Time[1] < 0)Current_Time[1] = 59;break;case 3:Current_Time[0]++; //KEY2按键按下减少时if(Current_Time[0] < 24)Current_Time[0] = 0;break;default:break;}}break;case 3: //按键KEY3按键按下if(Seting_Flag) //在设置模式下{LCD_ShowString(1,1," SET OK ");LCD_ShowString(2,1," SET OK ");Delay_s(1);LCD_WriteCommand(0x01); //清屏Seting_Flag = 0; //退出设置模式}break;case 4: //按键KEY4按键按下Seting_Flag = 1; //进入设置模式SET++;if(SET >= 4){SET = 1;}break;}
}void SHOW_TIME(void)
{if(Seting_Flag){switch(SET){case 1:Set_Second();break;case 2:Set_Min();break;case 3:Set_Hour();break;}}else{SHOW_Current_Time();//显示当前时间}
}
④Timer.c文件的代码
#include "Timer.h"/*** 定时器T0的初始化*/
void Time0_Intrrupt_Init(void)
{/* 设置T0的计数器为16,且时钟来源为晶振 TMOD = xxxx 0001 */TMOD &= 0xF0; //将低4位置0TMOD |= 0x01; //最低位置1/* 设置定时计数器的初始值,定时1ms */TH0 = ((65535 - (1000 - 1)) >> 8);TL0 = (65535 - (1000 - 1)) & 0x00FF;/* 启动T0 */TF0 = 0; //清除标志位TR0 = 1; //启动定时器0/* 开启中断 */PT0 = 1; //优先级较高ET0 = 1; //使能定时器溢出中断EA = 1; //开启总开关
}/********中断服务函数*******/
/*** T0的中断服务函数(每隔1ms对TimeCount加1)*/
static unsigned long TimeCount = 0;
static unsigned char StatusFlag = 0;
static unsigned long GetTimeCon = 0;
extern unsigned char Seting_Flag;
extern char Current_Time[];
void Time0_Rountine(void) interrupt 1
{//这里不用清除标志位,硬件会自动清除/* 设置定时计数器的初始值,定时1ms */TH0 = ((65535 - (1000 - 1)) >> 8);TL0 = (65535 - (1000 - 1)) & 0x00FF;TimeCount++;/* 每隔1s秒变量增加1 */switch(StatusFlag){case 0:GetTimeCon = TimeCount;StatusFlag = 1;case 1:if(TimeCount - GetTimeCon == 1000){GetTimeCon = TimeCount;if(!Seting_Flag) //没有进入设置模式{Current_Time[2]++; //每隔1s秒变量增加if(Current_Time[2] >= 60){Current_Time[2] = 0; Current_Time[1]++; //每隔60s分变量增加if(Current_Time[1] >= 60){Current_Time[1] = 0;Current_Time[0]++; //每隔60min时变量增加if(Current_Time[0] >= 24){Current_Time[0] = 0;}}}}}break;}
}/*** 对外暴露TimeCount的值*/
unsigned long Get_TimeCount(void)
{return TimeCount;
}
相关文章:
10【模块学习】LCD1602(二):6路温度显示+实时时钟
项目:6路温度显示实时时钟 1、6路温度显示①TempMenu.c文件的代码②TempMenu.h文件的代码③main.c文件的代码④Timer.c文件的代码⑤Delay.c文件的代码⑥Key.c文件的代码 2、实时时钟显示①BeiJingTime.c文件的代码②BeiJingTime.h文件的代码③main.c文件的代码如下④…...
Embedding在RAG中的核心作用及其几何类比-来自DeepSeek
1. 核心概念映射 Embedding的本质:将文本、图像等非结构化数据转化为高维空间中的坐标点(向量),例如: 句子A → 向量 [0.2, -1.5, 3.0, ..., 0.7](假设维度为768) 句子B → 向量 [0.3, -1.4, 2…...
前端快速入门——JavaScript函数、DOM
1.JavaScript函数 函数是一段可重复使用的代码块,它接受输入(参数)、执行特定任务,并返回输出。 <scricpt>function add(a,b){return ab;}let cadd(5,10);console.log(c); </script>2.JavaScript事件 JavaScript绑定事件的方法࿱…...
AOSP14 Launcher3——最近任务TaskViewSimulator详解
前言:TaskViewSimulator 这个类在最近任务中起到了一个非常重要的作用。 从字面意思上理解,这个单词是由TaskViewSimulator组合而来,字面意思就是TaskView的模拟器,顾名思义,就是一个用来模拟TaskView的类。 为什么要模…...
层次式架构核心:中间层的功能、优势与技术选型全解析
层次式架构中的中间层是整个架构的核心枢纽,承担着多种重要职责,在功能实现、优势体现以及技术选型等方面都有丰富的内容,以下为你详细介绍: 一、功能 1.业务逻辑处理 复杂规则运算:在许多企业级应用中,…...
MySQL主从同步原理及面试回答
1. 什么是主从结构 主从复制、读写分离(分库)解决的是访问的压力 2. Mysql主从复制的原理 Mysql主从复制的核心是binlog日志文件(二进制日志文件) 二进制日志(BINLOG)记录了所有的 DDL(数据定…...
利用quartus的DDS函数信号发生器设计
一、功能要求 采用数字频率合成(Direct Digital FrequencySynthesis,简称DDS)设计制作一个波形发生器,仿真后,在DE2-115开发板上实践。 要求: 1、利用DDS技术合成正弦波和方波; 2、输出信号的…...
2.1 腾讯校招通关指南-算法与数据结构
2.1腾讯校招算法与数据结构通关攻略:高频题型真题拆解实战技巧 在腾讯技术岗面试中,算法与数据结构是占比30%的核心考核项,直接决定了面试通过率的「生死线」。本文结合腾讯近三年校招真题,拆解4大高频题型的解题套路、专项训练方…...
数据一致性的守护神:深入Spring声明式事务管理 (@Transactional)
在前面几篇文章中,我们一路打怪升级,掌握了Spring IoC/DI、Bean管理、AOP,并用JdbcTemplate和Spring Data JPA简化了数据库访问。我们的代码越来越简洁、高效。但想象一下这个场景: 用户A向用户B转账100元。这至少需要两个数据库…...
神经网络复习
1 机器学习 1.1 定义 机器学习是人工智能的一个分支领域,它致力于让计算机系统能够自动从数据中学习规律,并利用这些规律对新的数据进行预测或决策,而无需显式地编写针对特定任务的规则。 1.2 分类 全监督学习 全监督学习是指在训练模型时…...
从代码学习深度学习 - 自注意力和位置编码 PyTorch 版
这里写自定义目录标题 前言一、自注意力:Transformer 的核心1.1 多头注意力机制的实现1.2 缩放点积注意力1.3 掩码和序列处理1.4 自注意力示例二、位置编码:为序列添加位置信息2.1 位置编码的实现2.2 可视化位置编码总结前言 深度学习近年来在自然语言处理、计算机视觉等领域…...
Web前端开发——图像与多媒体文件(上)
学习目标: 优秀的商业网站往往通过为页面添加大量的图像、声音、视频、动画等多媒体信息来丰富网站的内容,吸引更多网络访问者的关注。目前大型商业网站非常注重对Web前端开发技术的研究,通过组合各类前端开发技术来改善用户体验和增加用户互…...
C#核心学习(三)常见的泛型数据结构类(1)List和Dictionary
前面我们刚刚学习了,什么是泛型。今天我们就来看看C#中有哪些,常见的泛型数据结构,今天要介绍的是List,和Dictionary。 引言 在C#编程中,泛型集合是高效管理数据的核心工具。List<T>和Dictionary<TKey, TValue>作为两…...
运行时数据区
运行时数据区 Java 虚拟机在运行 Java 程序过程中管理的内存区域称之为运行时数据区,运行时数据区负责管理 JVM 使用到的内存,例如创建对象和销毁对象。 程序计数器 程序计数器又叫 PC 寄存器,每个线程都会通过程序计数器记录当前要执行的字…...
union all 关联查询
UNION ALL 并非用于表的关联查询,而是用于将多个 SELECT 语句的结果集合并成一个结果集。它会保留所有重复的行,不像 UNION 会去除重复行。下面为你提供几种使用 UNION ALL 的场景示例。 示例表结构 假设存在两个表 sales_2024 和 sales_2025ÿ…...
npm ERR! vue-admin-beautiful@1.0.0 dev: `vue-cli-service serve` 问题解决
笔者在跑实习公司的前端时,老是报这个错,并且网上(csdn)并没有好的解决方法,于是这篇文章就诞生了。[吐槽一下]:小公司的实习生干的活是真的多啊。。。 解决方案 依赖有些包装不上,换个源就行了,这里采用…...
玩转Docker | 使用Docker部署Xnote笔记工具
玩转Docker | 使用Docker部署Xnote笔记工具 前言一、Xnote介绍Xnote简介1.2 Xnote特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署Xnote服务下载镜像编辑配置文件编辑部署文件创建容器检查容器状态检查服务端口安全设置四、访问Xnote服务访问Xnote首页…...
TDengine 与其他时序数据库对比:InfluxDB/TimescaleDB 选型指南(二)
四、应用场景分析 (一)TDengine 适用场景 TDengine 适用于对写入性能和存储效率要求极高的物联网设备数据采集场景。在一个拥有数百万个传感器的智能工厂中,每个传感器每秒都会产生多条数据,TDengine 能够高效地处理这些高并发的…...
ARM Cortex汇编宏定义
在ARM架构(尤其是Cortex-M系列MCU)的汇编中,**宏定义(Macro)**用于复用代码片段,支持参数化编程,简化重复逻辑(如寄存器操作、循环、条件判断等)。以下是ARM汇编宏定义的核心语法、用法及示例: 一、宏定义的基本语法 使用 MACRO 和 MEND 伪指令包裹宏体,通过 参数…...
【含文档+PPT+源码】基于Python心理健康管理系统
项目视频介绍: 毕业作品心理健康管理系统 课程简介: 本课程演示的是一款基于Python心理健康管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Python学习者。 1.包含:项目源码、项目文档、数据库脚本、软…...
Dockerfile项目实战-单阶段构建Vue2项目
单阶段构建镜像-Vue2项目 1 项目层级目录 以下是项目的基本目录结构: 2 Node版本 博主的Windows电脑安装了v14.18.3的node.js版本,所以直接使用本机电脑生成项目,然后拷到了 Centos 7 里面 # 查看本机node版本 node -v3 创建Vue2项目 …...
大数据驱动的供应链透明化:从数据孤岛到智能协同
大数据驱动的供应链透明化:从数据孤岛到智能协同 在全球化供应链环境下,透明化不仅是一种企业责任,更是提高效率、降低成本和增强供应链韧性的关键举措。然而,传统供应链体系因数据孤岛、信息滞后、信任缺失等问题,常常导致生产过剩、库存积压、资源浪费,甚至供应链断裂…...
第四篇:[特殊字符] 深入理解MyBatis[特殊字符] 掌握MyBatis Generator ——入门与实战
引言 什么是 MyBatis Generator? MyBatis Generator (MBG) 是一个代码生成工具,专为 MyBatis 框架设计。它可以根据数据库表结构自动生成 Java 实体类、Mapper 接口、Mapper XML 文件以及 Example 类。通过使用 MBG,开发者可以显著减少编写…...
LeetCode算法题(Go语言实现)_48
题目 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂的橘子。 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单元格中…...
ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(核心API详解之单个外设管理)
目录 单个外设管理APIesp_periph_createesp_periph_set_functionesp_periph_startesp_periph_stopesp_periph_set_dataesp_periph_get_dataesp_periph_get_stateesp_periph_get_idesp_periph_set_idesp_periph_initesp_periph_runesp_periph_destroy 单个外设管理API esp_peri…...
基于vue2+ElementUI的el-tree封装一个带搜索的树形组件
需求 实现一个如图带搜索框的下拉树形组件。 解决方案 利用el-inputel-tree实现自定义带搜索的下拉树形组件。 具体实现步骤 1、创建TreeSelect组件 <template><div class"tree-select-wrapper" v-clickoutside"handleClose"><el-inpu…...
G2学习打卡
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 DCGAN实践 import torch, random, random, os import torch.nn as nn import torch.nn.parallel import torch.optim as optim import torch.utils.data im…...
【广州华锐互动】汽车生产引入数字孪生系统,优化生产流程,提升汽车产品质量
数字孪生系统的应用为企业带来了生产流程的革命性变革。以汽车制造企业为例,该企业在生产过程中引入数字孪生系统,实现了生产流程的全面优化和产品质量的显著提升 。 在生产流程优化方面,数字孪生系统对汽车生产线进行了全方位的模拟和实时…...
从Gradio App创建Discord Bot/Slack Bot/Website Widget(2)——从Gradio App创建Slack Bot
从Gradio App创建Discord Bot/Slack Bot/Website Widget(2)——从Gradio App创建Slack Bot 本篇摘要18. 从Gradio App创建Discord Bot/Slack Bot/Website Widget18.2 从Gradio App创建Slack Bot18.2.1 运作原理及前置条件1. 运作原理2. 前置条件 18.2.2 …...
基于STM32G474的SPI获取MT6816编码器绝对角度配置指南
前言:最近上手使用了一款编码器芯片,也是先艰难阅读了一下全英文版本的编码器的规格手册,然后通过SPI读取了一下绝对值角度。虽然发现使用起来还是挺简单的,但使用后还是会产生一个对其原理层面的好奇,比如磁编码器内部…...
深入学习ReentrantLock
ReentrantLock 0. 前言:为什么需要 ReentrantLock?1. 基础概念与核心特性1.1 什么是 ReentrantLock?1.2 ReentrantLock vs. synchronized1.3 核心特性详解1.3.1 可重入性 (Reentrancy)1.3.2 公平性选择 (Fairness Choice)1.3.3 可中断获取锁 …...
Spring Boot 集成金蝶 API 演示
✨ Spring Boot 集成金蝶 API 演示:登录 / 注销 Cookie 保存 本文将通过 Spring Boot 完整实现一套金蝶接口集成模型,包括: ✅ 普通登录✅ AppSecret 登录✅ 注销✅ Cookie 保存与复用 📅 项目结构 src/ ├── controller/ │…...
适用于 HAL 的 AIDL
目录 设计初衷 注意 编写AIDLHAL接口 查找AIDLHAL接口 扩展接口 将现有HAL从HIDL转换为AIDL AIDL与HIDL之间的主要差异 针对HAL的供应商测试套件(VTS)测试 Android 11 中引入了在 Android 中使用 AIDL 实现 HAL 的功能, 从而可以在不使用 HIDL 的情况下实现 Android 的部分…...
49、Spring Boot 详细讲义(六)(SpringBoot2.x整合Mybatis实现CURD操作和分页查询详细项目文档)
项目文档:银行借据信息CURD操作和分页查询 一、项目概述 1. 项目简介 本项目旨在使用Spring Boot框架整合MyBatis连接Mysql数据库实现借据信息的增加、删除、修改和查询功能,同时支持分页查询,并提供对应的Restful风格的接口。 2.环境准备 2.1.工具和软件准备 JDK(建议…...
C# 运行web项目
1、web项目直接点击顶部运行...
GPU服务器声音很响可以怎么处理
当GPU服务器运行时噪音过大,通常是由于高负载下散热风扇高速运转所致。以下是分步骤的解决方案,帮助您有效降低噪音并保持设备稳定运行: 一、排查噪音来源 定位声源 • 使用 声级计 或手机分贝检测APP,确定最大噪音位置࿰…...
Java如何选择ojdbc驱动
如何选择ojdbc驱动? 取决于短板。 如果JDK版本高,数据库版本低,根据Oracle数据库版本选择。如果JDK版本低,数据库版本高,根据Java版本选择。 Oracle官网OJDBC驱动和受支持的JDK版本 23ai 21c 19c 驱动类型选择 oj…...
【微思就业推荐 】T岗位-北京,福州,厦门等地
到微思学习,免费推荐就业!学员内推! 原创 厦门微思网络 2025年04月 有哪些大公司在招OCP认证人才? 有哪些大公司在招聘拥有HCIE认证的人才 ① 委托单位:润欣商业管理(厦门)有限公司 央企-华润资产的子公司 岗位&am…...
Linux 命令全解析:从零开始掌握 Linux 命令行
Linux 作为一款强大的开源操作系统,广泛应用于服务器、嵌入式系统以及超级计算机领域。掌握 Linux 命令行技能,是每一位开发者和系统管理员的必备能力。本文将从基础开始,为你详细介绍常用的 Linux 命令,以及它们的使用场景和示例…...
2025年4月份生活有感
今天在5000B培训的下午,一起入所来的小伙伴,有个申请了深圳大学的博士,已录取。哎,想起了当年申博时候信心和决心不足,导致后面匆匆的拿了offer去工作。看到同事的选择还是非常羡慕,想到自己5月份的婚礼&am…...
鸿蒙系统开发状态更新字段区别对比
在鸿蒙系统开发中,状态管理是构建响应式UI的核心机制,主要通过装饰器(Decorators)实现字段的状态观测与更新。根据鸿蒙的版本(V1稳定版和V2试用版),支持的装饰器及其特性有所不同。以下是主要状…...
CEPH OSD_SLOW_PING_TIME_FRONT/BACK 警告处理
ceph config set mgr mon_warn_on_slow_ping_time 2000说明:mon_warn_on_slow_ping_time 该值默认为0,那么只要 osd 心跳超过 mon_warn_on_slow_ping_ratio of osd_heartbeat_grace. 也就是超过 mon_warn_on_slow_ping_ratio和mon_warn_on_slow_ping_rat…...
HTML应用指南:利用POST请求获取全国小菜园门店位置信息
小菜园作为一家以徽菜为主的快餐品牌,自2013年成立以来,凭借其独特的烹饪理念和精致的东方口味菜品,在中国市场上迅速崛起。该品牌强调少油少盐、减少调味品使用,旨在传承并发扬徽州风味的独特魅力。这种健康且不失美味的烹饪方式…...
Python在去中心化物联网中的应用:数据安全、智能合约与边缘计算的融合
Python在去中心化物联网中的应用:数据安全、智能合约与边缘计算的融合 在万物互联的时代,传统物联网(IoT)架构依赖于集中式服务器来管理数据、设备互联与身份认证。然而,随着设备数量激增,中心化架构的可扩展性、安全性和隐私问题逐渐暴露。去中心化物联网(DeIoT)通过…...
CEPH配置优化建议
一、硬件配置优化 磁盘选择: SSD 与 HDD 搭配:使用 SSD 作为 OSD 日志盘(Journal)或元数据存储,HDD 作为数据盘。推荐 SSD 与 HDD 的比例为 1:3~5,具体根据业务负载调整。 RAID 禁用:避免使用硬…...
深度学习入门:神经网络的学习
目录 1 从数据中学习1.1 数据驱动1.2 训练数据和测试数据 2损失函数2.1 均方误差2.2 交叉熵误差2.3 mini-batch学习2.4 mini-batch版交叉熵误差的实现2.5 为何要设定损失函数 3 数值微分3.1 数值微分3.3 偏导数 4 梯度4.1 梯度法4.2 神经网络的梯度 5 学习算法的实现5.1 2层神经…...
机器学习_决策树
决策树的特点 可以处理非线性的问题可解释强,没有θ模型简单,模型预测效率高 if else不容易显示的使用函数表达,不可微 决策树的生成和预测 生成:通过大量数据生成一颗非常好的树,用这棵树来预测新来的数据。 预测&…...
深入理解UML动态图:系统行为建模全景指南
目录 前言1. 动态图概述2. 用例图(Use Case Diagram)2.1 定义与作用2.2 应用价值2.3 实践建议 3. 顺序图(Sequence Diagram)3.1 定义与特征3.2 应用优势3.3 建模建议 4. 活动图(Activity Diagram)4.1 定义与…...
Linux驱动开发进阶(九)- SPI子系统BSP驱动
文章目录 1、前言2、SPI总线注册3、SPI设备注册4、SPI驱动注册5、SPI BSP驱动 1、前言 学习参考书籍以及本文涉及的示例程序:李山文的《Linux驱动开发进阶》本文属于个人学习后的总结,不太具备教学功能。 2、SPI总线注册 驱动源码文件:dri…...
wabpack学习记录
wabpack学习记录 前言 项目写了不少 对webpack了解甚少 只记住一些 必要的概念以及指令 所以像深究一下具体是什么 可以做什么 如何做等 package.json 文件详解 name: 项目的名称。 version: 项目的版本号。 description: 项目的描述。 author: 项目的作者或维护者信息。 l…...