数码管显示倒计时c语言程序,第32节:数码管中的倒计时程序

开场白:

上一节讲了一二级菜单的综合程序,这一节要教会大家三个知识点:

第一个:通过本程序,继续加深理解按键与数码管的关联方法。

第二个:复习一下我在第五节教给大家的时间校正法。

第三个:继续加深熟悉鸿哥首次提出的“一二级菜单显示理论”:凡是人机界面显示,不管是数码管还是液晶屏,都可以把显示的内容分成不同的窗口来显示,每个显示的窗口中又可以分成不同的局部显示。其中窗口就是一级菜单,用ucWd变量表示。局部就是二级菜单,用ucPart来表示。不同的窗口,会有不同的更新显示变量ucWdXUpdate来对应,表示整屏全部更新显示。不同的局部,也会有不同的更新显示变量ucWdXPartYUpdate来对应,表示局部更新显示。

具体内容,请看源代码讲解。

(1)硬件平台:基于朱兆祺51单片机学习板。启动和暂停键对应S1键,复位键对应S5键。

(2)实现功能:按下启动暂停按键时,倒计时开始工作,再按一次启动暂停按键时,则暂停倒计时。在任何时候,按下复位按键,倒计时将暂停工作,并且恢复倒计时当前默认值99。

(3)源代码讲解如下:

#include "REG52.H"

#define const_voice_short40 //蜂鸣器短叫的持续时间

#define const_voice_long 200 //蜂鸣器长叫的持续时间

#define const_key_time120 //按键去抖动延时的时间

#define const_key_time220 //按键去抖动延时的时间

#define const_dpy_time_half200//数码管闪烁时间的半值

#define const_dpy_time_all 400//数码管闪烁时间的全值 一定要比const_dpy_time_half 大

/* 注释一:

* 如何知道1秒钟需要多少个定时中断?

* 这个需要编写一段小程序测试,得到测试的结果后再按比例修正。

* 步骤:

* 第一步:在程序代码上先写入1秒钟大概需要200个定时中断。

* 第二步:把程序烧录进单片机后,上电开始测试,手上同步打开手机里的秒表。

* 如果单片机倒计时跑完了99秒,而手机上的秒表才走了45秒。

* 第三步:那么最终得出1秒钟需要的定时中断次数是:const_1s=(200*99)/45=440

*/

#define const_1s440 //大概一秒钟所需要的定时中断次数

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_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 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 ucDigDo

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值