#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint yi,er,si,wu,qi,ba;//数码管所显示的位置
uint num, b; k;//时分秒
uint num1;//定时器参数
uchar code table1[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,0x40};//0到9和G数组
sbit dula=P2^6;//段选
sbit wela=P2^7;//位选
sbit s1=P3^0;//按键
sbit s2=P3^1;
sbit s3=P3^2;
sbit s4=P3^3;
void delay(uint z)//ms延时函数
{
uint i,j;
for(i=z;i>0;i--)
for(j=114;j>0;j--);
}
void key()
{
if(s1==0)
{
delay(20);
if(s1==0)
b++;
while(!s1);
}
if(s2==0)
{
delay(20);
if(s2==0)
k++;
while(!s2);
}
if(s3==0)
{
delay(20);
if(s2==0)
num1++;
while(!s3);
}
if(s4==0)
{
delay(20);
if(s4==0)
{ b=0;k=0;num1=0; }
while(!s4);
}
}
void display(uchar yi, uchar er, uchar si,uchar wu,uchar qi,uchar ba)
{
//第一位数码管
P0=0XFF;
wela=1;
P0=0xfe;
wela=0;
dula=1;
P0=table1[yi];
dula=0;
delay(1);
//第二位数码管
P0=0XFF;
wela=1;
P0=0xfd;
wela=0;
dula=1;
P0=table1[er];
dula=0;
delay(1);
//第三位数码管,横杠
P0=0XFF;
wela=1;
P0=0xfb;
wela=0;
dula=1;
P0=table1[10];
dula=0;
delay(1);
//第四位数码管
P0=0XFF;
wela=1;
P0=0xf7;
wela=0;
dula=1;
P0=table1[si];
dula=0;
delay(1);
//第五位数码管
P0=0XFF;
wela=1;
P0=0xef;
wela=0;
dula=1;
P0=table1[wu];
dula=0;
delay(1);
//第六位数码管,横杠
P0=0XFF;
wela=1;
P0=0xdf;
wela=0;
dula=1;
P0=table1[10];
dula=0;
delay(1);
//第七位数码管
P0=0XFF;
wela=1;
P0=0xbf;
wela=0;
dula=1;
P0=table1[qi];
dula=0;
delay(1);
//第八位数码管
P0=0XFF;
wela=1;
P0=0x7f;
wela=0;
dula=1;
P0=table1[ba];
dula=0;
delay(1);
}
//主函数
void main()
{
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;
while(1)//等待中断
{
key();
display(yi,er,si,wu,qi,ba);
}
}
void T0_time()interrupt 1{
TH0=(65536-46083)/256; //重装初值
TL0=(65536-46083)%256; //50ms
num++;
if(num==20)//当num到达20次是为1000ms也就是1s
{
num=0; //清零
num1++;//秒自加
if(num1==60)//当num1到达60次是为60s也就是1分钟
{
num1=0;//清零
k++;//分自加
}
if(k==60)//当k到达60次是为60分钟也就是1小时
{
k=0;//清零
b++;//时自加
}
if(b==24)//当k到达24次是为24小时
{
b=0;//此时为00点
}
yi=b/10;//求模运算
er=b%10;//求余运算
si=k/10;
wu=k%10;
qi=num1/10;
ba=num1%10;
}
}
|