#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[6] = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};//数码管显示缓冲区,初始值位0xFF确保启动时都不亮
void main()
{
unsigned int cnt = 0; //中断的次数
unsigned long sec = 0; //记录经过的秒数
unsigned char i = 0; //动态扫描的索引
ENLED = 0; //打开使能74HC245
TMOD = 0x01; //选择中断模式为1
TH0 = 0xF5;
TL0 = 0x95; //定时1毫秒
TR0 = 1; //启动定时
while (1)
{
if(TF0 == 1)
{
TF0 = 0; //判断是否溢出,溢出后清零中断标志
TH0 = 0xF5;
TL0 = 0x95; //重新赋初始值
cnt++; //计数值自加1
if(cnt >=1000)//判断溢出是否达到1000次,即到达1秒
{
cnt = 0; //计数清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按十进制位从低到高依次提取并转化为数码管显示字符
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;
}//完成数码管动态扫描刷新
}
}
}
|