#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key=P3^2;
uchar num;
uchar sshi,sge,fshi,fge,mshi,mge,hmshi,hmge;
uchar aa,bb,cc,dd;
uchar code d[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x80}; //0~9,A~F,.
uchar code w[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
void delay(uchar z)
{
uchar x,y;
for(x=10;x>0;x--)
for(y=z;y>0;y--);
}
/*##############秒表计时部分##################*/
void init_miaobiao()//初始化
{
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void display()//显示函数
{
P1=w[0]; //小时
P2=d[sshi];
delay(10);
P1=w[1];
P2=d[sge];
delay(10);
P1=w[1];//符号
P2=d[16];
delay(10);
P1=w[2];//分钟
P2=d[fshi];
delay(10);
P1=w[3];
P2=d[fge];
delay(10);
P1=w[3];//符号
P2=d[16];
delay(10);
P1=w[4];//秒
P2=d[mshi];
delay(10);
P1=w[5];
P2=d[mge];
delay(10);
P1=w[5];//符号
P2=d[16];
delay(10);
P1=w[6];//毫秒
P2=d[hmshi];
delay(5);//时间是毫秒级的延时必须短
P1=w[7];
P2=d[hmge];
delay(5);
}
void jiexi()//解析函数
{
sshi=aa/10;
sge=aa%10;
fshi=bb/10;
fge=bb%10;
mshi=cc/10;
mge=cc%10;
hmshi=dd/10;
hmge=dd%10;
}
void mb()//设定时间进制
{
if(num==2) //10毫秒前进一次
{num=0;dd++;}
if(dd==50) //在num从1到2的时候还有进行判断都要耗费机器周期,对于精确度是10毫秒的计时是有影响的,
{dd=0;cc++;} //这里是粗略估算得到的定时值,误差大约-3~+3个10毫秒。
if(cc==60)
{cc=0;bb++;}
if(bb==60)
{bb=0;aa++;}
if(aa==24)aa=0;
}
/*##############秒表计时部分##################*/
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
/*##############按键停止部分##################*/
void init_int0()
{
EA=1;
EX0=1;
//IT0=1;IT0默认为0
}
void keyscan()
{
uint dou;
if(key==0) //检测按键
{
delay(1); //前部消抖
if(key==0) //前部消抖
{
dou=TR0;
switch(dou) //应用程序
{
case 0 : TR0=1;break;//当计时停止时,按下按键启动计时
case 1 : TR0=0;break;//当计时开启时,按下按键停止计时
}
while(!key); //检测松手
}
delay(1); //后部消抖
while(!key); //后部消抖
}
else
TR0=1;
}
/*##############按键停止部分##################*/
void main()
{
init_int0();
init_miaobiao();
num=0;aa=0;bb=0;cc=0;dd=0;
while(1)
{
mb();
jiexi();
display();
}
}
void int0() interrupt 0
{
keyscan();
}
void timer_miaobiao() interrupt 1
{
TH0=(65535-10000)/256;//定时10毫秒
TL0=(65535-10000)%256;
num++;
}