要求:60S倒计时
个位每1S变一次,从0~9
十位,个位为0的下一秒十位发生变化
(1)实际上数码管状态变化为01~00~60,只不过00存在的时间过短,无法被人眼识别。
( 2)在切换数码管前先让 P0=0xff 避免了前一个数码管留下的余辉。
上面程序较为繁琐,以下为更新程序:
/*60倒计时*/
#include<reg52.h>
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
unsigned char code LedChar[]=
{
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90
};
unsigned int cnt=0; //记录中断次数
unsigned char flag=0; //中断标志位
unsigned char i=0; //遍历
unsigned char g=0xff; //初始化个位数码管
unsigned char s=0xff; //初始化十位数码管
unsigned int sec=61; //秒数
void main()
{
EA=1; //定时器总中断
ENLED=0; //使能U3
ADDR3=1; //T0模式为1
TMOD=0x01; //定时1ms
TH0=0xfc;
TL0=0x67;
ET0=1;
TR0=1; //启动T0
while(1)
{
if(flag==1) //中断标志
{
g=sec%10;
s=sec/10;
flag=0; //标志清0
if(sec==0) //重新倒计时
sec=61;
}
}
}
void Inte

该博客介绍了如何使用中断和switch遍历优化60秒倒计时程序,使得数码管显示更加流畅。程序通过改变定时时间从20ms变为1ms,实现了个位和十位数码管的快速切换,避免了余辉问题。在中断服务函数中,利用中断标志位控制数码管的更新,并确保在切换前清除上一数码管的显示,从而提高显示效果。
最低0.47元/天 解锁文章
925

被折叠的 条评论
为什么被折叠?



