1. 程式人生 > >數碼管倒計時

數碼管倒計時

time ++ nbsp 記錄 加載 聲明 i++ 動態 bsp

//全部數碼管計時

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

}

}

數碼管倒計時