#define uchar unsigned char//定义uchar为unsigned char
#define disp P0//段码输出
#define dispbit P3//位码输出
sbit beg=P2^2;//开始(不可停)
sbit run=P2^3;//完毕指示
sbit set=P2^4;//设置数加减标志
uchar code dispbitcode[8]=; //位码
uchar code dispcode[11]=;//段码
uchar dispdat[8]=;//显示位
uchar day=99;//天初值1
uchar hou=23;//时初值1
uchar min=59;//分初值1
uchar sec=59;//秒初值1
uchar secup=200;//10ms
uchar dat=0x00;//位标志
uchar sign=1;//启动标志(0有效)
void delay(void)//短延时函数
void dup(void)//天减1函数
void hup(void)//时减1函数
{
if(hou==0)//秒到0,反进位
else hou--;//否则减1
}
void mup(void)//分减1函数
{
if(min==0)//秒到0,反进位
else min--;//否则减1
}
void sup(void)//秒减1函数
{
if(sec==0&&min==0&&hou==0&&day==0)//计时到
else
//秒到0,反进位
else sec--;}//否则减1
}
void beggs(void)//按键函数
{
if(~beg)//启动
{ delay();//按键去抖
if(~beg)
//等待释放
sign=0;//启动位置0
}
}
}
void main(void)
{
ET0=1;//开定时器0中断
EA=1;//开总中断
TMOD=0x01;//定时器0方式1
TH0=(65536-5000)/256;//定时器初值为5000us
TL0=(65536-5000)%256;//定时器初值为5000us
TR0=1;//定时器0开
while(1)
{
dispdat[0]=day/10;//取出天
dispdat[1]=day%10;
dispdat[2]=hou/10;//取出时
dispdat[3]=hou%10;
dispdat[4]=min/10;//取出分
dispdat[5]=min%10;
dispdat[6]=sec/10;//取出秒
dispdat[7]=sec%10;
if(sign==1)//如果未启动,按键有效
}
}
void t0(void) interrupt 1 using 0//定时器0
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
disp=0xff;//重置数码管
disp=dispcode[dispdat[dat]];//输出段码
dispbit=dispbitcode[dat];//输出位码
dat++;//位标志加1
if(sign==0)secup--;//启动标志
if(secup==0)//进位
if(dat==8)dat=0;//位标志清零
}