#include<reg52.h>
//#include<intrin s.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;//定义锁存器锁存端
sbit wela=P2^7;//定义锁存器锁存端
bit bSystemRunFlag;//定义一个量
bit bKeyLongPrFlag;
bit bIconFlashFlag;
bit bFlashHourFlag;
bit bFlashMinTFlag;
uchar usec,msec,sec,min,hour;//表示定义了 微秒,毫秒,秒,分,小时。
uchar displayBuf[6];//显示寄存器
uchar keyDecTime;
uchar keyDataBuf;
uchar keypressBuf;
uchar keyLongTime;
uint tt;//定义。
uchar code table[]={0x3f,
0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,};//表示数码管0~f.
uchar code tablecom[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf} ;//6个数码管全亮
void keyscan();
void keydo();
void main()
{
tt=0;
TMOD=0x01;//设置计时器工作方式1
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时
wela=1;//11101010
P0=0xff;//表示灯全亮
wela=1;
dula=0;
P0=0x00;
dula=1;
dula=0;
while(1)
{
if(usec==250)//表示0.5s。
{
usec=0;
bIconFlashFlag =~ bIconFlashFlag;
if(++msec>=2)//如果大于等于2。就进去。
{
msec=0;//毫秒归零;
if(++sec>=60)//如果秒大于等于60.就进去。
{
sec=0;//先归零
if(++min>=60)//如果分大于等于60.就进去。
{ min=0;//先归零
if(++hour>=24)//如果小时大于等于24,就进去。
hour=0;//小时归零
}
}
}
}
if(bSystemRunFlag==1)
{
bSystemRunFlag=0;
keydo();
keyscan();
tt++;
if(tt>=6)
tt=0;
displayBuf[0]=hour/10;//小时取十位的数值
displayBuf[1]=hour%10;//小时取个位的数值
displayBuf[2]=min/10;//分钟取十位的数值
displayBuf[3]=min%10;//分钟取个位的数值
displayBuf[4]=sec/10;//秒取十位的数值
displayBuf[5]=sec%10;//秒取个位的数值
P0=0xff;//11111111
wela=1;//11101010
wela=0;
P0=table[displayBuf[tt]];
if(tt==1||tt==3)//如果在1位或3位
{
if(msec==1)//每过0.5秒
P0|=0x80;//则0x80这灯亮。
}
if(bFlashHourFlag&&!bIconFlashFlag)
{
if(tt<2)
P0 = 0;
}
if(bFlashMinTFlag&&!bIconFlashFlag)
{
if(tt==2||tt==3)
P0 = 0;
}
dula=1;
dula=0;
P0=tablecom[tt];
wela=1;
wela=1;
wela=1;
wela=0;
}
}
}
void exter0()interrupt 1
{
TH0=(65536-1872)/256;//定时器输入20毫秒。
TL0=(65536-1872)%256;//求余
usec++;bSystemRunFlag=1;//毫秒加加,flag=1;
}
void keydo()
{
P3 = 0xf0;
if((P3&0xf0)==keyDataBuf)
{
if(keyDecTime<200)keyDecTime++;
if(keyDecTime==40||keyDecTime==100)
{
if(keyDecTime==100)bKeyLongPrFlag=1;
keyDecTime=50;
keypressBuf=keyDataBuf;
}
}
else
{
keyDataBuf=P3&0xf0;
keypressBuf=0;
keyDecTime=0;
bKeyLongPrFlag=0;
}
}
void keyscan()
{
if(keypressBuf!=0xf0)
{
if(keypressBuf==0xe0&&!bKeyLongPrFlag)call;
{
bFlashMinTFlag=0;
bFlashHourFlag =~bFlashHourFlag;
if(bFlashHourFlag)
{
if(msec==20)
RET;
}
}
if(keypressBuf==0xd0&&!bKeyLongPrFlag)
{
bFlashHourFlag=0;
bFlashMinTFlag =~bFlashMinTFlag;
}
if(keypressBuf==0xb0)
{
if(bFlashHourFlag)
{
hour++;
if(hour>23)
hour=0;
}
if(bFlashMinTFlag)
{
min++;
if(min>59)
min=0;
}
}
else if(keypressBuf==0x70)
{
if( bFlashHourFlag)
{
hour--;
if(hour>=24)
hour=23;
}
if(bFlashMinTFlag)
{
min--;
if(min>=60)
min=59;
}
}
}
keypressBuf=0;
}
这是写的程序。在这上面加延时退出。 |