數碼管倒計時
//全部數碼管計時
#include<reg52.h>
/**聲明使能IO口
*/
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,0x88,0x83,0xc6,0xa1,0x86,0x8e
};
/**數碼管緩沖區
*/
unsigned char LedBuff[6]={
0xff,0xff,0xff,0xff,0xff,0xff
};
unsigned char i=0; //動態掃描的索引
unsigned int cnt=0;
void main(){
unsigned long sec=0; //記錄經過秒書
EA=1; //使能總開關
ENLED=0; //使能U3,選擇數碼管
ADDR3=1; //使能38譯碼器的真值表
TMOD=0x01; //設置T0為模式1
TH0=0xfc; //味T0賦初值0xfc67,定時1ms
TL0=0x67;
ET0=1; // 使能T0中斷
TR0=1; // 啟動T0
while(1){
if(cnt >= 1000){ //判斷T0是否溢出1000次(1000ms=1s)
cnt=0;
sec++;
//以下代碼將sec按十進制從低到高一次提取並轉換為數碼管顯示的字符
LedBuff[0]=LedChar[sec%10];
LedBuff[1]=LedChar[sec/10%10];
LedBuff[2]=LedChar[sec/100%10];
LedBuff[3]=LedChar[sec/1000%10];
LedBuff[4]=LedChar[sec/10000%10];
LedBuff[5]=LedChar[sec/100000%10];
}
}
}
/**定時器中斷服務函數
*/
void interRuptTimer0()interrupt 1 {
//重新加載賦值
TH0= 0xfc;
TL0= 0x67;
cnt++; //中斷次數加1
P0=0xFF; //顯示消隱
switch(i){//調用相應數碼管IO口顯示
case 0: ADDR0=0; ADDR1=0; ADDR2=0; i++; P0=LedBuff[0];break;
case 1: ADDR0=1; ADDR1=0; ADDR2=0; i++; P0=LedBuff[1];break;
case 2: ADDR0=0; ADDR1=1; ADDR2=0; i++; P0=LedBuff[2];break;
case 3: ADDR0=1; ADDR1=1; ADDR2=0; i++; P0=LedBuff[3];break;
case 4: ADDR0=0; ADDR1=0; ADDR2=1; i++; P0=LedBuff[4];break;
case 5: ADDR0=1; ADDR1=0; ADDR2=1; i=0; P0=LedBuff[5];break;
default: break;
}
}
數碼管倒計時