#include<reg52.h>
#include<absacc.h>
#define PA XBYTE[0XD1FF]
#define PB XBYTE[0XD2FF]
#define CON XBYTE[0XD7FF]
#define uchar unsigned char
#define uint unsigned int
uchar table[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar table1[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xb8,0x20,0x28};
uchar count; //定义是否计时有20个50ms的即1s的全局变量;
void delay(uint j)
{
uint a;
while(j--)
for(a=0;a<=1000;a++);
}
main()
{
uchar i,number1=0,number2=0,number3=0,number4=0,number5=0;
signed char number=0;
count=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
CON=0x80;
while(1)
{
for(i=0;i<6;i++)
{
if(i==0)
{
PB=0xff;
PA=table[0];
if(count==20) //判断第6个数码管(秒钟的个位),即达到1s后,改变第6个数码管的数值
{
if(number==9) //判断第5个数码管(秒钟的十位),即每当经过10s后,改变第第5个数码管的值
{
number=-1;
++number1;
if(number1==6) //判断第4个数码管(分钟的各位),即当每经过60秒后,改变第4个数码管的值
{
number1=0;
++number2;
if(number2==10) //判断第3个数码管(分钟的十位),即当每经过10分钟后,改变第3个数码管的值
{
number2=0;
++number3;
if(number3==6) //判断第2个数码管(小时的的个位),即当每经过60分钟后,改变第2个数码管的值
{
number3=0;
++number4;
if(number4==10) //判断第1个数码管(小时的十位),即当每经过十个小时,改变第1个数码管的值
{
number4=0;
++number5;
if(number5==1&&number4==3) //经过十二个小时后,重新从0开始计时
{
number5=0;
number4=0;
}
}
}
}
}
}
PB=table1[++number];
count=0;
}
else
{
if(number==0)
PB=table1[number];
else
PB=table1[number];
}
}
else
{
PB=0xff;
if(i==1)
{
PA=table[i];
PB=table1[number1];
}
else
{
PB=0xff;
if(i==2)
{
PA=table[i];
PB=table1[number2];
}
else
{
PB=0XFF;
if(i==3)
{
PA=table[i];
PB=table1[number3];
}
else
{
PB=0xff;
if(i==4)
{
PA=table[i];
PB=table1[number4];
}
else
{
PB=0XFF;
PA=table[i];
PB=table1[number5];
}
}
}
}
}
}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
}
数码管的显示是通过8255的PA PB口输出来控制的。