第十一届 蓝桥杯 单片机设计与开发项目 省赛
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;
}