#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit WE1=P2^0;
sbit WE2=P2^1;
sbit WE3=P2^2;
sbit WE4=P2^3;
sbit key1=P3^5;
sbit key2=P3^4;
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};
uint cnt=0;
uint num=0;
uint num1=0;//0.1s的次数的计数值
void delay(uint i) //延时函数
{
uchar t;
while(i--)
{
for(t=0;t<120;t++);
}
}
void initTimer0()
{
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=0;
}
void display(uchar qian,uint bai,uint shi,uint ge)
{
WE1=0;
P0=tab[qian]; delay(1);
WE1=1;
WE2=0;
P0=tab[bai]+0x08; delay(1);
WE2=1;
WE3=0;
P0=tab[shi]; delay(1);
WE3=1;
WE4=0;
P0=tab[ge]; delay(1);
WE4=1;
}
void main()
{
uint ms100=0;//秒的十位
uint s,s1,min,min1,minu=0; //依次是秒的个位,秒的十位,分的个位,分的十位
initTimer0();
if(key1==0)
{
delay(20);
if(key1==0)
{
TR0=!TR0;
while(!key1);
}
}
if(key2==0)
{
delay(20);
num1=0;
num=0;
ms100=0;
cnt=0;
minu=0;
while(!key2);
}
{
if(num1>=2)//检测是否达到0.1s,(两个50ms)
{
num1=0;//进入中断次数值清零
ms100++;//秒的十位的计数值加1
if(ms100>=10)//若秒的十分位计数值达到10
{
ms100=0;//清零秒的十分位的计数值
num1=0;
}
}
if(num>=20)
{
num=0;
cnt++;
if(cnt>=60)
{
cnt=0;
minu++;
if(minu>=60)
{
TR0=!TR0;
num1=0;
num=0;
ms100=0;
cnt=0;
minu=0;
}
}
}
s=cnt%10;//从秒的计数值里面分离秒的个位
s1=cnt/10;//从秒的计数值里面分离秒的十位
min=minu%10;//从分的计数值里面分离分的个位
min1=minu/10;//从分的计数值里面分离分的十位
display(min1,min,s1,s);//显示这4个数
}
}
void time0() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num++;
num1++;
}
|