#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar h,m,s,k;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};
uchar code tab[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar disdata[8];
void dis();
void time(uchar h,m,s)
{
disdata[0]=table[h/10];
disdata[1]=table[h%10];
disdata[2]=0x40;
disdata[3]=table[m/10];
disdata[4]=table[m%10];
disdata[5]=0x40;
disdata[6]=table[s/10];
disdata[7]=table[s%10];
dis();
}
void delay(uint i)
{
uint d,k;
for(d=i;d>0;d--)
for(k=125;k>0;k--);
}
void dis()
{
uchar i,j;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,板子用这一段
{
case(7):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(6):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(5):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(4):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(3):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(2):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(1):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(0):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
P0=disdata[i];//发送段码
j=10; //扫描间隔时间设定
while(j--);
P0=0x00;//消隐
}
}
void T0_time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
k++;
if(k==20) //调节改变
{k=0;s++;}
if(s==60)
{m++;s=0;}
if(m==60)
{h++;m=0;}
if(h==24)
{h=0;}
}
main()
{
uint hh,mm,ss;
TMOD=0x01;
TH0=(65536-46083)/256;
TL0=(65536-46083)%256;
EA=1;
ET0=1;
TR0=1;
k=0;
h=0;
m=0;
s=0;
while(1)
{
if(K2==0)
{
delay(500);
hh=h;
hh++;
h=hh;
}
if(K1==0)
{
delay(500);
mm=m;
mm++;
m=mm;
}
if(K3==0)
{
delay(500);
ss=s;
ss=0;
s=ss;
}
time(h,m,s);
}
}
#define uint unsigned int
#define uchar unsigned char
uchar h,m,s,k;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};
uchar code tab[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar disdata[8];
void dis();
void time(uchar h,m,s)
{
disdata[0]=table[h/10];
disdata[1]=table[h%10];
disdata[2]=0x40;
disdata[3]=table[m/10];
disdata[4]=table[m%10];
disdata[5]=0x40;
disdata[6]=table[s/10];
disdata[7]=table[s%10];
dis();
}
void delay(uint i)
{
uint d,k;
for(d=i;d>0;d--)
for(k=125;k>0;k--);
}
void dis()
{
uchar i,j;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,板子用这一段
{
case(7):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(6):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(5):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(4):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(3):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(2):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(1):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(0):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
P0=disdata[i];//发送段码
j=10; //扫描间隔时间设定
while(j--);
P0=0x00;//消隐
}
}
void T0_time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
k++;
if(k==20) //调节改变
{k=0;s++;}
if(s==60)
{m++;s=0;}
if(m==60)
{h++;m=0;}
if(h==24)
{h=0;}
}
main()
{
uint hh,mm,ss;
TMOD=0x01;
TH0=(65536-46083)/256;
TL0=(65536-46083)%256;
EA=1;
ET0=1;
TR0=1;
k=0;
h=0;
m=0;
s=0;
while(1)
{
if(K2==0)
{
delay(500);
hh=h;
hh++;
h=hh;
}
if(K1==0)
{
delay(500);
mm=m;
mm++;
m=mm;
}
if(K3==0)
{
delay(500);
ss=s;
ss=0;
s=ss;
}
time(h,m,s);
}
}