#include
#define uchar unsigned char
#define uint unsigned int
uchar code xianshi[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90};//共阳数码管0到9显示BCD码
uchar second=0;//秒计数定义并初始化变量
uchar min=0;//分计数
uchar hour=0;//时计数
uchar m=0;//中断计数
sbit a1=P0^0;// 秒按键
sbit a2=P0^1;//分按键
sbit a3=P0^2;//时按键
void delay(uchar k);//延时函数
void timechuli();//时间处理函数
void anjian();//按键扫描函数
void timexianshi();//时间显示函数
void delay(uchar k)
{
uchar i;
while((k--)!=0)
{
for(i=0;i<100;i++);
}
}
void timechuli()
{
if(second==60)
{
second=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{hour=0;}
}
}
}
void anjian()
{
if(a1==0)
{
delay(30);//按键消抖
if(a1==0)
{
second++;
}
}
if(a2==0)
{
delay(30);
if(a2==0)
{
min++;
}
}
if(a3==0)
{
delay(30);
if(a3==0)
{
hour++;
}
}
}
void timexianshi()
{
P2=0x01;
P1=xianshi[second%10];//显示秒的个位
delay(5);
P2=0x02;
P1=xianshi[second/10];//显示秒的十位
delay(5);
P2=0x08;
P1=(xianshi[min%10])|0x80;//显示分的个位
delay(5);
P2=0x10;
P1=xianshi[min/10];//显示分的十位
delay(5);
P2=0x40;
P1=(xianshi[hour%10])|0x80;//显示时的个位
delay(5);
P2=0x80;
P1=xianshi[hour/10];//显示时的个位
delay(5);
}
void timer0() interrupt 1
{
TH0=(65536-45872)/256; //放入初值,11.0592M,50ms
TL0=(65536-45872)%256;
m++;
if(m==20)
{
m=0;
second++;
}
}
void main()
{
P0=0xff;
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TH0=(65536-45872)/256; //放入初值,11.0592M,50ms
TL0=(65536-45872)%256;
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA=1; //开总中断
EX0=1;
ET0=1; //开定时器0中断
while(1)
{
timexianshi();//时间显示函数
anjian();//按键扫描函数
timechuli();//时间处理函数
}
}