#include<reg52.h>
sbit ADDR0 = P2^0;
sbit ADDR1 = P2^1;
sbit ADDR2 = P2^2;
sbit ADDR3 = P2^3;
sbit ENLED = P1^1;
unsigned char i = 0;
unsigned int cnt = 0;
unsigned char code ledchar[]={
0xC0,0xF9,0xA4,0xB0,0x99,
0X92,0x82,0xf8,0x80,0x90,
}; //将数据存入缓存区
unsigned char ledBuff[]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
}; //配置缓存区
void main()
{
unsigned long sec = 0;
ENLED = 0;
ADDR3 = 1;
TMOD = 0xF0;
TH0 = 0x7E;
TL0 = 0x66; //配置一毫秒定时器
TR0 = 1; //打开定时器
while(1)
{
if(TF0 == 1)
{
TF0 = 0;
TH0 = 0x7E;
TL0 = 0x66;
cnt++;
if(cnt >= 1)
{
cnt = 0;
sec++;
ledBuff[0] = ledchar[sec%10]; //将数据输入缓冲区
ledBuff[1] = ledchar[sec/10%10];
if((ledBuff[0] != 0xC0 ) && (ledBuff[5] == 0xFF) && (ledBuff[4] == 0xFF) && (ledBuff[3] == 0xFF) && (ledBuff[2] == 0xFF) && (ledBuff[1] == 0xC0))
{
ledBuff[1] = 0xFF;
}
ledBuff[2] = ledchar[sec/100%10];
if((ledBuff[5] == 0xFF) && (ledBuff[4] == 0xFF) && (ledBuff[3] == 0xFF) && (ledBuff[2] == 0xC0))
{
ledBuff[2] = 0xFF;
}
ledBuff[3] = ledchar[sec/1000%10];
if((ledBuff[5] == 0xFF) && (ledBuff[4] == 0xFF) && (ledBuff[3] == 0xC0))
{
ledBuff[3] = 0xFF;
}
ledBuff[4] = ledchar[sec/10000%10];
if((ledBuff[5] == 0xFF) && (ledBuff[4] == 0xC0))
{
ledBuff[4] = 0xFF;
}
ledBuff[5] = ledchar[sec/100000%10];
if(ledBuff[5] == 0xC0)
{
ledBuff[5] = 0xFF;
}
}
P0 = 0xFF; //消除鬼影 另一种方法 ENLED = 1 与下面ENLED = 0 共用
switch(i)
{
case 0:ADDR2=1;ADDR1=0;ADDR0=1;i++0=ledBuff[0];break; //显示缓冲区内容
case 1:ADDR2=1;ADDR0=0;ADDR0=0;i++0=ledBuff[1];break;
case 2:ADDR2=0;ADDR1=1;ADDR0=1;i++0=ledBuff[2];break;
case 3:ADDR2=0;ADDR1=1;ADDR0=0;i++0=ledBuff[3];break;
case 4:ADDR2=0;ADDR1=0;ADDR0=1;i++0=ledBuff[4];break;
case 5:ADDR2=0;ADDR1=0;ADDR0=0;i=00=ledBuff[5];break;
default:break;
}
//ENLED = 0;
}
}
}
这是最高位不显示动态刷新数码管的程序
|