#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code duan[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,};
uchar code wei[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar sec=0,min=0,hour=0,sec1=0,min1=1,hour1=0;
uchar tick0=0,count=0,count1=0;
uchar flag=0;
uchar i=0;
sbit D1=P3^7;
void delay(uint z);
void display();
void init();
void settime();
void keyscan();
void increase();
void decrease();
void setalarm();
void main()
{
init();
while(1)
{
if((hour1==hour)&&(min1==min)&&(sec1==sec))
{
for(i=0;i<10;i++)
{
D1=0;
if(flag==0)
{
display();
keyscan();
}
else if(flag==1)
{
display();
keyscan();
}
}
}
else
{
D1=1;
if(flag==0)
{
display();
keyscan();
}
else if(flag==1)
{
display();
keyscan();
}
}
}
}
/*******延时1ms函数*******/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*******初始化函数*******/
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
/*******显示函数*******/
void display()
{
P2=wei[0];
if(flag==0)
P0=duan[hour/10];
else if(flag==1)
P0=duan[hour1/10];
delay(5);
P2=wei[1];
if(flag==0)
{
if(count==3)
P0=duan[hour%10]|0x80;
else
P0=duan[hour%10];
}
else if(flag==1)
{
if(count1==3)
P0=duan[hour1%10]|0x80;
else
P0=duan[hour1%10];
}
delay(5);
P2=wei[2];
if(flag==0)
P0=duan[min/10];
else if(flag==1)
P0=duan[min1/10];
delay(5);
P2=wei[3];
if(flag==0)
{
if(count==2)
P0=duan[min%10]|0x80;
else
P0=duan[min%10];
}
else if(flag==1)
{
if(count1==2)
P0=duan[min1%10]|0x80;
else
P0=duan[min1%10];
}
delay(5);
P2=wei[4];
if(flag==0)
P0=duan[sec/10];
else if(flag==1)
P0=duan[sec1/10];
delay(5);
P2=wei[5];
if(flag==0)
{
if(count==1)
P0=duan[sec%10]|0x80;
else
P0=duan[sec%10];
}
else if(flag==1)
{
if(count1==1)
P0=duan[sec1%10]|0x80;
else
P0=duan[sec1%10];
}
delay(5);
}
/*******键盘函数*******/
void keyscan()
{
if((P1&0X0F)!=0X0F)
{
if((P1&0X0F)!=0X0F)
{
switch(P1&0X0F)
{
case 0x0e:settime();break;
case 0x0b:increase();break;
case 0x0d:setalarm();break;
case 0x07:decrease();break;
}
while((P1&0X0F)!=0X0F)display();
}
}
}
/*******调时函数*******/
void settime()
{
count++;
if(count==1)//改秒
{
ET0=0;
TR0=0;
}
else if(count==2) //改分
{
ET0=0;
TR0=0;
}
else if(count==3) //改时
{
ET0=0;
TR0=0;
}
else if(count>=4) //挺止调时,继续计时
{
count=0;
ET0=1;
TR0=1;
}
}
/*******加1函数*******/
void increase()
{
if((count==1)||(count1==1))
{
if(count==1)
{
if(sec<59)
sec++;
else
sec=0;
}
else if(count1==1)
{
if(sec1<59)
sec1++;
else
sec1=0;
}
}
else if((count==2)||(count1==2))
{
if(count==2)
{
if(min<59)
min++;
else
min=0;
}
else if(count1==2)
{
if(min1<59)
min1++;
else
min1=0;
}
}
else if((count==3)||(count1==3))
{
if(count==3)
{
if(hour<23)
hour++;
else
hour=0;
}
else if(count1==3)
{
if(hour1<23)
hour1++;
else
hour1=0;
}
}
}
/*******减1函数*******/
void decrease()
{
if((count==1)||(count1==1))
{
if(count==1)
{
if(sec>0)
sec--;
else
sec=0;
}
else if(count1==1)
{
if(sec1>0)
sec1--;
else
sec1=0;
}
}
else if((count==2)||(count1==2))
{
if(count==2)
{
if(min>0)
min--;
else
min=59;
}
else if(count1==2)
{
if(min1>0)
min1--;
else
min1=59;
}
}
else if((count==3)||(count1==3))
{
if(count==3)
{
if(hour>0)
hour--;
else
hour=23;
}
else if(count1==3)
{
if(hour1>0)
hour1--;
else
hour1=23;
}
}
}
/*******定时器0中断函数*******/
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tick0++;
if(tick0==20)
{
tick0=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
/*******闹钟设置函数*******/
void setalarm()
{
count1++;
flag=1;
if(count1==1)
{
}
else if(count1==2)
{
}
else if(count1==3)
{
}
else if(count1>=4)
{
count1=0;
flag=0;
}
}
|