KST-51单片机:c语言编程实现数码管动态显示秒表的倒计时

/*60S倒计时*/
/*个位每1S变一次,从0~9*/
/*十位,个位为0的下一秒十位发生变化*/

#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
};

void main()
{
	unsigned int cnt=0; //记录中断次数
	unsigned int sec=0; //记录秒数
	unsigned char g=0;   //个位数码管
	unsigned char s=6;   //十位数码管 

	ENLED=0;			 //使能U3 选中数码管DS1
	TMOD=0x01;			 //T0为模式1
	TH0=0xB8;			 //T0赋初值0xB800
	TL0=0x00;
	TR0=1;				 //启动T0

	while(1)
	{
		ADDR3=1;
		P0=0xff;
		ADDR2=0;
		ADDR1=0;
		ADDR0=0;
		P0=LedChar[g];   //选中个位数码管
				
		if(TF0==1)		 //判断T0是否溢出
		{
			TF0=0;		 //T0溢出后清零中断标志
			TH0=0xB8;        //并重新赋值
			TL0=0x00;
			cnt++;
		}
		if(cnt>=50)	  //判断溢出是否达到50次
		{
			cnt=0;    //达到五十次(1s)清零
			sec++;    //秒数累加
		}

		P0=0xff;
		ADDR0=1;
		P0=LedChar[s];   //选中十位数码管,并显示当前秒数下的数字

		if(s==0&&g==0)    //避免00状态的出现,状态60~60时间为60s
			s=6;
		if(g==0&&sec%10==1)
			s--;
		if(sec%10!=0)
		{
			g=10-sec%10;
		}
		if(sec%10==0)
		{
			g=0;
		}
	}
}

(1)实际上数码管状态变化为01~00~60,只不过00存在的时间过短,无法被人眼识别。

(2)在切换数码管前先让 P0=0xff 避免了前一个数码管留下的余辉。

猜你喜欢

转载自blog.csdn.net/Wapiti_y/article/details/83472464