1. 程式人生 > >KST-51微控制器:c語言程式設計實現數碼管動態顯示秒錶的倒計時

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存在的時間過短,無法被人眼識別。

     在切換數碼管前先讓 P0=0xff 避免了前一個數碼管留下的餘輝