开场白: 上一节讲了数码管的驱动程序,这节在上节的基础上,通过按键切换不同的窗口来设置不同的参数。 这一节要教会大家三个知识点: 第一个:鸿哥首次提出的“一二级菜单显示理论”:凡是人机界面显示,不管是数码管还是液晶屏,都可以把显示的内容分成不同的窗口来显示,每个显示的窗口中又可以分成不同的局部显示。其中窗口就是一级菜单,用ucWd变量表示。局部就是二级菜单,用ucPart来表示。不同的窗口,会有不同的更新显示变量ucWdXUpdate来对应,表示整屏全部更新显示。不同的局部,也会有不同的更新显示变量ucWdXPartYUpdate来对应,表示局部更新显示。 第二个:如何通过一个窗口变量来把按键,数码管,被设置的参数关联起来。 第三个:需要特别注意,在显示被设置参数时,应该先分解出每一位,然后再把分解出来的数据过渡到显示缓冲变量里。
具体内容,请看源代码讲解。
(1)硬件平台:基于朱兆祺51单片机学习板。加按键对应S1键,减按键对应S5键,切换窗口按键对应S9键
(2)实现功能: 通过按键设置4个不同的参数。 一共有4个窗口。每个窗口显示一个参数。 第8,7,6,5位数码管显示当前窗口,P-1代表第1个窗口,P-2代表第2个窗口,P-3代表第3个窗口,P-4代表第1个窗口。 第4,3,2,1位数码管显示当前窗口被设置的参数。范围是从0到9999。 有三个按键。一个是加按键,按下此按键会依次增加当前窗口的参数。一个是减按键,按下此按键会依次减少当前窗口的参数。一个是切换窗口按键,按下此按键会依次循环切换不同的窗口。
(3)源代码讲解如下: #include "REG52.H" #define const_voice_short40 //蜂鸣器短叫的持续时间 #define const_key_time120 //按键去抖动延时的时间 #define const_key_time220 //按键去抖动延时的时间 #define const_key_time320 //按键去抖动延时的时间 void initial_myself(); void initial_peripheral(); void delay_short(unsigned int uiDelayShort); void delay_long(unsigned int uiDelaylong); //驱动数码管的74HC595 void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01); void display_drive(); //显示数码管字模的驱动函数 void display_service(); //显示的窗口菜单服务程序 //驱动LED的74HC595 void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01); void T0_time();//定时中断函数 void key_service(); //按键服务的应用程序 void key_scan();//按键扫描函数 放在定时中断里 sbit key_sr1=P0^0; //对应朱兆祺学习板的S1键 sbit key_sr2=P0^1; //对应朱兆祺学习板的S5键 sbit key_sr3=P0^2; //对应朱兆祺学习板的S9键 sbit key_gnd_dr=P0^4; //模拟独立按键的地GND,因此必须一直输出低电平 sbit beep_dr=P2^7; //蜂鸣器的驱动IO口 sbit led_dr=P3^5;//作为中途暂停指示灯 亮的时候表示中途暂停 sbit dig_hc595_sh_dr=P2^0; //数码管的74HC595程序 sbit dig_hc595_st_dr=P2^1; sbit dig_hc595_ds_dr=P2^2; sbit hc595_sh_dr=P2^3; //LED灯的74HC595程序 sbit hc595_st_dr=P2^4; sbit hc595_ds_dr=P2^5; unsigned char ucKeySec=0; //被触发的按键编号 unsigned intuiKeyTimeCnt1=0; //按键去抖动延时计数器 unsigned char ucKeyLock1=0; //按键触发后自锁的变量标志 unsigned intuiKeyTimeCnt2=0; //按键去抖动延时计数器 unsigned char ucKeyLock2=0; //按键触发后自锁的变量标志 unsigned intuiKeyTimeCnt3=0; //按键去抖动延时计数器 unsigned char ucKeyLock3=0; //按键触发后自锁的变量标志 unsigned intuiVoiceCnt=0;//蜂鸣器鸣叫的持续时间计数器 unsigned char ucDigShow8;//第8位数码管要显示的内容 unsigned char ucDigShow7;//第7位数码管要显示的内容 unsigned char ucDigShow6;//第6位数码管要显示的内容 unsigned char ucDigShow5;//第5位数码管要显示的内容 unsigned char ucDigShow4;//第4位数码管要显示的内容 unsigned char ucDigShow3;//第3位数码管要显示的内容 unsigned char ucDigShow2;//第2位数码管要显示的内容 unsigned char ucDigShow1;//第1位数码管要显示的内容 unsigned char ucDigDot8;//数码管8的小数点是否显示的标志 unsigned char ucDigDot7;//数码管7的小数点是否显示的标志 unsigned char ucDigDot6;//数码管6的小数点是否显示的标志 unsigned char ucDigDot5;//数码管5的小数点是否显示的标志 unsigned char ucDigDot4;//数码管4的小数点是否显示的标志 unsigned char ucDigDot3;//数码管3的小数点是否显示的标志 unsigned char ucDigDot2;//数码管2的小数点是否显示的标志 unsigned char ucDigDot1;//数码管1的小数点是否显示的标志 |