第十一届 蓝桥杯 单片机设计与开发项目 省赛

第十一届 蓝桥杯 单片机设计与开发项目 省赛

01 核心框架(多界面显示,界面切换,参数设置)




c 复制代码
bit Seg_Disp_Mode;//0-数据界面 1-参数界面
float Temperature;
unsigned char Temp_Disp[2];
unsigned char Temp_Disp_Ctrol[2] = {30,20};

//参数选择一般会用一个数组指针变量index来实现,这个变量需要在参数调整(自加或者自减)时被调用
bit Temperature_Params_Index;//0-max 1-min

/* 键盘处理函数 */
void Key_Proc()
{
	if(Key_Slow_Down) return;
	Key_Slow_Down = 1;//键盘减速程序

	Key_Val = Key_Read();//实时读取键码值
	Key_Down = Key_Val & (Key_Old ^ Key_Val);//捕捉按键下降沿
	Key_Up = ~Key_Val & (Key_Old ^ Key_Val);//捕捉按键上降沿
	Key_Old = Key_Val;//辅助扫描变量
	
	switch(Key_Down)
	{
		case 4:
			Seg_Disp_Mode ^= 1;
		//Seg_Disp_Mode 是一个位(bit)型变量。在一些C编译器中,位型变量可能被视为右值,因此不能直接进行赋值操作。
			if(Seg_Disp_Mode == 1)
			{
				//每次到参数界面都默认选择温度下限
				//参数设置
				Temperature_Params_Index = 1;
				Temp_Disp[0] = Temp_Disp_Ctrol[0];
				Temp_Disp[1] = Temp_Disp_Ctrol[1];
				
			}
			if(Seg_Disp_Mode == 0)
			{
//				if(Temp_Disp_Ctrol[0]>Temp_Disp_Ctrol[1])
				//这里又写错啦!这里应该拿着刚刚还没保存的Temp_Disp数组中的数据来比较而不是ctrol(保存之后的数据)来比较
				if(Temp_Disp[0]>=Temp_Disp[1])
				{
					//切换到数据页面进行参数保存
					Temp_Disp_Ctrol[0] = Temp_Disp[0];
					Temp_Disp_Ctrol[1] = Temp_Disp[1];
				}
			}
		break;
		
		case 5:
			if(Seg_Disp_Mode == 1)
			{
				Temperature_Params_Index ^= 1;
			}
		break;
		
		case 6:
			//注意只有处在参数界面才可以修改
		//注意这里修改的是Temp_Disp数组而不是Temp_Disp_Ctrol数组,此时仅进行参数设置而没有保存,待切换到数据页面自动保存
			if(Seg_Disp_Mode == 1)
			{
				if(++Temp_Disp[Temperature_Params_Index]==100) Temp_Disp[Temperature_Params_Index] = 99;//上线卡死在99
			}
		break;
		
		case 7:
			if(Seg_Disp_Mode == 1)
			{
				if(--Temp_Disp[Temperature_Params_Index]==255) Temp_Disp[Temperature_Params_Index] = 0;//下线卡死在0
			}
		break;
	}
}

/* 信息处理函数 */
void Seg_Proc()
{
	if(Seg_Slow_Down) return;
	Seg_Slow_Down = 1;//数码管减速程序
	
	Temperature = rd_temperature();
	
	if(Seg_Disp_Mode == 0)
	{
		Seg_Buf[0] = 11;
		Seg_Buf[3] = 10;
		Seg_Buf[4] = 10;
		Seg_Buf[6] = (unsigned char)(Temperature)/10%10;
		Seg_Buf[7] = (unsigned char)(Temperature)%10;
	}
	else
	{
		Seg_Buf[0] = 12;
		Seg_Buf[3] = Temp_Disp[0]/10%10;
		Seg_Buf[4] = Temp_Disp[0]%10;
		Seg_Buf[6] = Temp_Disp[1]/10%10;
		Seg_Buf[7] = Temp_Disp[1]%10;
	}

}

02 其他输出功能(LED和DAC)

c 复制代码
/* 其他显示函数 */
void Led_Proc()
{
	/*DAC相关输出*/
//	Temperature = rd_temperature();
	if(Temperature>Temp_Disp_Ctrol[0])
	{
		Da_Write(51*4);
	}
	else if(Temperature<Temp_Disp_Ctrol[1])
	{
		Da_Write(51*2);
	}
	else
	{
		Da_Write(51*3);
	}
	/*数码管相关输出*/
	ucLed[0] = (Temperature>Temp_Disp_Ctrol[0]);
	ucLed[1] = (Temperature<=Temp_Disp_Ctrol[0]&&Temperature>=Temp_Disp_Ctrol[1]);
	ucLed[2] = (Temperature<Temp_Disp_Ctrol[1]);
	ucLed[3] = Error_Flag;
}
相关推荐
悠哉悠哉愿意6 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
qq_459234426 天前
【题库】| 商用密码应用安全性评估从业人员考核题库(四十)
职场和发展·密码学·学习方法·考核·商用密码·商用密码应用安全性评估·密评
敲敲了个代码6 天前
[特殊字符] 空数组的迷惑行为:为什么 every 为真,some 为假?
前端·javascript·react.js·面试·职场和发展
Lester_11016 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制
三佛科技-187366133976 天前
120W小体积碳化硅电源方案(LP8841SC极简方案12V10A/24V5A输出)
单片机·嵌入式硬件
z20348315206 天前
STM32F103系列单片机定时器介绍(二)
stm32·单片机·嵌入式硬件
Alaso_shuang6 天前
STM32 核心输入、输出模式
stm32·单片机·嵌入式硬件
2501_918126916 天前
stm32死锁是怎么实现的
stm32·单片机·嵌入式硬件·学习·个人开发
诚思报告YH6 天前
视频面试软件市场洞察:2026 - 2032年复合年均增长率(CAGR)为10.3%
面试·职场和发展
重生之后端学习6 天前
74. 搜索二维矩阵
开发语言·数据结构·算法·职场和发展·深度优先