第37节:数码管作为仪表盘显示跑马灯的方向,速度和状态
时间:11-22
来源:互联网
点击:
开场白:
我在第24节中讲过按键控制跑马灯的方向,速度和运行状态的项目程序,只可惜那个程序不能直观地显示运行中的三种状态,这节我决定在24节的基础上,增加一个数码管显示作为类似汽车仪表盘的界面,实时显示跑马灯的方向,速度,和运行状态。
这一节要教会大家一个知识点:继续加深理解运动,按键与数码管三者之间的关联程序框架。
具体内容,请看源代码讲解。
(1)硬件平台:
基于朱兆祺51单片机学习板。用S1键作为控制跑马灯的方向按键,S5键作为控制跑马灯方向的加速度按键,S9键作为控制跑马灯方向的减速度按键,S13键作为控制跑马灯方向的启动或者暂停按键。记得把输出线P0.4一直输出低电平,模拟独立按键的触发地GND。
(2)实现功能:
跑马灯运行:第1个至第8个LED灯一直不亮。在第9个至第16个LED灯,依次逐个亮灯并且每次只能亮一个灯。每按一次独立按键S13键,原来运行的跑马灯会暂停,原来暂停的跑马灯会运行。用S1来改变方向。用S5和S9来改变速度,每按一次按键的递增或者递减以10为单位。
数码管显示:本程序只有1个窗口,这个窗口分成3个局部显示。8,7,6位数码管显示运行状态,启动时显示“on”,停止时显示“oFF”。5位数码管显示数码管方向,正向显示“n”,反向显示“U”。4,3,2,1位数码管显示速度。数值越大速度越慢,最慢的速度是550,最快的速度是50。
(3)源代码讲解如下:
- #include "REG52.H"
- #define const_voice_short40 //蜂鸣器短叫的持续时间
- #define const_key_time120 //按键去抖动延时的时间
- #define const_key_time220 //按键去抖动延时的时间
- #define const_key_time320 //按键去抖动延时的时间
- #define const_key_time420 //按键去抖动延时的时间
- 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 led_flicker_09_16(); //第9个至第16个LED的跑马灯程序,逐个亮并且每次只能亮一个.
- void led_update();//LED更新函数
- void T0_time();//定时中断函数
- void key_service(); //按键服务的应用程序
- void key_scan();//按键扫描函数 放在定时中断里
- sbit beep_dr=P2^7; //蜂鸣器的驱动IO口
- sbit key_sr1=P0^0; //对应朱兆祺学习板的S1键
- sbit key_sr2=P0^1; //对应朱兆祺学习板的S5键
- sbit key_sr3=P0^2; //对应朱兆祺学习板的S9键
- sbit key_sr4=P0^3; //对应朱兆祺学习板的S13键
- sbit key_gnd_dr=P0^4; //模拟独立按键的地GND,因此必须一直输出低电平
- 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 intuiKeyTimeCnt4=0; //按键去抖动延时计数器
- unsigned char ucKeyLock4=0; //按键触发后自锁的变量标志
- unsigned intuiVoiceCnt=0;//蜂鸣器鸣叫的持续时间计数器
- unsigned char ucLed_dr1=0; //代表16个灯的亮灭状态,0代表灭,1代表亮
- unsigned char ucLed_dr2=0;
- unsigned char ucLed_dr3=0;
- unsigned char ucLed_dr4=0;
- unsigned char ucLed_dr5=0;
- unsigned char ucLed_dr6=0;
- unsigned char ucLed_dr7=0;
- unsigned char ucLed_dr8=0;
- unsigned char ucLed_dr9=0;
- unsigned char ucLed_dr10=0;
- unsigned char ucLed_dr11=0;
- unsigned char ucLed_dr12=0;
- unsigned char ucLed_dr13=0;
- unsigned char ucLed_dr14=0;
- unsigned char ucLed_dr15=0;
- unsigned char ucLed_dr16=0;
- unsigned char ucLed_update=0;//刷
数码管仪表盘跑马 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)