#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
uchar Count,Sec,shift,n;
uchar code LEDData[ ] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,
0x82,0xF8,0x80,0x90,0xff};
uchar data display[2];
/********************************************************
主函數
*********************************************************/
main()
{
P0 = 0xff; //端口初始化
P2 = 0xff;
Count = 0x00;
Sec = 0x00;
n = 0x00;
shift = 0xfe; //送位碼初值
TMOD = 0x01;
TH0 = 0x4c; //50ms定時
TL0 = 0x00;
ET0 = 1;
T2CON = 0x00; //設置T2CON寄存器
TH2 = 0xf8; //2ms定時
TL2 = 0xcc;
ET2 = 1; //啟用Timer2中斷
EA = 1; //總中斷允許
TR2 = 1; //啟動定時器2
TR0 = 1; //啟動定時器0
while(1) ;
}
/*********************************************************
Timer0中斷函數 (負責定時)
**********************************************************/
void Timer0() interrupt 1
{
TH0 = 0x4c; //50ms定時
TL0 = 0x00;
++Count; //中斷計數單元加1
if(Count == 20) //50ms×20=1s
{
Count = 0; //清中斷計數單元
++Sec; //秒單元加1
if(Sec == 100)
Sec = 0; //清秒單元
}
}
/*********************************************************
Timer2中斷函數 (負責數碼管顯示)
**********************************************************/
void timer2() interrupt 5
{
TR2 = 0;
TF2 = 0; //手工清中斷標志
TH2 = 0xf8; //2ms定時常數
TL2 = 0xcc;
if(n >= 2) //兩位數碼管顯示
{
n = 0;
shift = 0x7f; //送位碼初值
P2 = 0xff; //關閉顯示
}
else
{
display[0] = Sec%10; //個位
display[1] = Sec/10; //十位
P0 = LEDData[display[n++]]; //送段碼
P2 = shift; //送位碼
shift = (shift>>1)|0x80; //調整位碼
}
TR2 = 1;
}
/**********************************************************/
|