当前位置:文档之家› 电子时钟程序代码

电子时钟程序代码

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code weixuan[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //位选,控制哪个数码管亮。

(从右到左)
uchar
code
duanxuan[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf, 0xff}; //0-9,'-','灭'
uchar data timedata[3]={0x00,0x00,0x00}; //时间缓冲区,分别为:秒、时、分。

uchar data datetime[8]={0xc0,0xc0,0xbf,0xc0,0xc0,0xbf,0xc0,0xc0}; //时间缓冲区,初始化显示00-00-00。

uchar tt1,tt2,tt,tt0,num=0;
uchar flag,flag1,flag2,flash;
sbit key1=P1^3;
sbit key2=P1^5;
sbit key3=P1^7;
//**************延时函数*********************************
void delay(uint del)
{
uchar i, j;
for(i=0; i<del; i++)
for(j=0; j<=148; j++);
}
//********************调用显示************************
void display()
{
datetime[0]=timedata[0]%10; datetime[1]=timedata[0]/10; //秒
datetime[3]=timedata[1]%10; datetime[4]=timedata[1]/10; //分 datetime[6]=timedata[2]%10; datetime[7]=timedata[2]/10; //时 if(!flag)
{
P2=0X80; //秒显示
P0=duanxuan[datetime[0]];
delay(2);
P2=0X40;
P0=duanxuan[datetime[1]];
delay(2);
}
else
{
P2=0X80; //秒显示
P0=duanxuan[datetime[0]]|flash;
delay(2);
P2=0X40;
P0=duanxuan[datetime[1]]|flash;
delay(2);
}
P2=0X20; //显示'-'
P0=duanxuan[10];
delay(2);
if(!flag1)
{
P2=0X10; //分显示
P0=duanxuan[datetime[3]];
delay(2);
P2=0X08;
P0=duanxuan[datetime[4]];
delay(2);
}
else
{
P2=0X10; //分显示
P0=duanxuan[datetime[3]]|flash;
delay(2);
P2=0X08;
P0=duanxuan[datetime[4]]|flash;
delay(2);
}
P2=0X04; //显示'-' P0=duanxuan[10];
delay(2);
if(!flag2)
{
P2=0X02; //小时
P0=duanxuan[datetime[6]];
delay(2);
P2=0X01;
P0=duanxuan[datetime[7]];
delay(2);
}
else
{
P2=0X02; //小时
P0=duanxuan[datetime[6]]|flash;
delay(2);
P2=0X01;
P0=duanxuan[datetime[7]]|flash;
delay(2);
}
}
/******************按键调节时间*****************************/ void keyscan()
{
if(key1==0)
{
delay(10);
if(key1==0)
{
num++;
while(!key1);
while(1)
{
if(num==1)
{
flag=1;
flag1=0;
flag2=0;
if(key2==0)
{
delay(10);
if(key2==0)
{
timedata[0]--;
if(timedata[0]==-1)
timedata[0]=60;
while(!key2);
}
}
if(key3==0)
{
delay(10);
if(key3==0)
{
timedata[0]++;
if(timedata[0]==60)
timedata[0]=0;
while(!key3);
}
}
}
if(key1==0)
{
delay(10);
if(key1==0)
num++;
while(!key1);
}
if(num==2)
{
flag=0;
flag1=1;
flag2=0;
if(key2==0)
{
delay(10);
if(key2==0)
{
timedata[1]--;
if(timedata[1]==-1)
timedata[1]=60;
while(!key2);
}
}
if(key3==0)
{
delay(10);
if(key3==0)
{
timedata[1]++;
if(timedata[1]==60)
timedata[1]=0;
while(!key3);
}
}
if(num==3)
{
flag=0;
flag1=0;
flag2=1;
if(key2==0)
{
delay(10);
if(key2==0)
{
timedata[2]--;
if(timedata[2]==-1)
timedata[2]=24;
while(!key2);
}
}
if(key3==0)
{
delay(10);
if(key3==0)
{
timedata[2]++;
if(timedata[2]==25)
timedata[2]=0;
while(!key3);
}
}
if(num==4)
{
num=0;
flag=0;
flag1=0;
flag2=0;
break;
}
}
}
}
}
//主函数
void main()
{
TMOD=0x01;
ET0=1;
TR0=1;
TH0=0x40;
TL0=0x00;
EA=1;
while(1)
{
keyscan();
}
}
//***************定时器函数*************************** void timer1() interrupt 1
{
TH0=0x40; //50ms自加一次。

TL0=0x00;
P3=100;
display();
if((flag||flag1||flag2))
{
tt0++;
if(tt0==10)
{
flash=~flash;
tt0=0;
}
}
//P3=11
else
{
tt++;
if(tt==20)
{
tt=0;
timedata[0]++; //秒加1
if(timedata[0]==60)
{
timedata[0]=0;
timedata[1]++; //分加1
if(timedata[1]==60)
{
timedata[1]=0;
timedata[2]++; //时加1
if(timedata[2]==24)
{
timedata[2]=0 ;
}
}
}
}
}
}。

相关主题