#include <STC12C5A60S2.H>
sbit ENLED = P1^1;
sbit ADDR0 = P2^0;
sbit ADDR1 = P2^1;
sbit ADDR2 = P2^2;
unsigned char code LedChar[]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
};//数码管显示转换表
unsigned char LedBuff[] = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};//数码管显示缓冲区,初值0xFF确保启动时都不亮
unsigned char i = 0; //动态扫描的索引
unsigned int cnt = 0;//记录中断次数
void main()
{
unsigned long sec = 0;//记录经过的秒数
ENLED = 0; //使能74HC245
TMOD = 0x01;//选择定时器模式为模式1
TH0 = 0xF5;
TL0 = 0x55;//定初始值1毫秒
TR0 = 1;//启动定时器
EA = 1; //使能总中断
ET0 = 1;//使能T0中断
while(1)
{
if(cnt>=1000)//中断1000次,即为1秒
{
cnt = 0;//清零中断,开始下一次的中断
sec++; //秒数自加1
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];//将sec按十进制从高到低依次提取并转化为数码管显示字符
}
}
}
void InterruptTimer0() interrupt 1 //定时器0中断服务函数
{
TH0 = 0xF5;
TL0 = 0x55;//重新加载初值
cnt++;
P0 = 0xFF;//显示消隐
switch(i)
{
case 5:ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;i=00=LedBuff[5];break;
case 4:ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;i++0=LedBuff[4];break;
case 3:ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;i++0=LedBuff[3];break;
case 2:ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;i++0=LedBuff[2];break;
case 1:ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;i++0=LedBuff[1];break;
case 0:ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;i++0=LedBuff[0];break;
default:break;
}//数码管动态扫描刷新
}
|