KST-51微控制器:c語言程式設計實現數碼管動態顯示秒錶的倒計時
阿新 • • 發佈:2018-12-18
/*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 避免了前一個數碼管留下的餘輝