#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit lcdrs=P2^5;
sbit lcdrw=P2^6;
sbit lcden=P2^7;
sbit led=P2^0;
sbit sound=P2^3;
int a,b,i,hour,hourshi,hourge,min,minshi,minge,sec,secshi,secge,cnt,cnt1,
amin1=1,ahour1,aminge1,aminshi1,ahourge1,ahourshi1,
amin2=1,ahour2,aminge2,aminshi2,ahourge2,ahourshi2;
uchar
code table1[]={'0','1','2','3','4','5','6','7','8','9'};
uchar code table2[]="Time 00:00";
uchar code Alarm_1[]="Ala1";
uchar code Alarm_2[]="Ala2";
uchar
num1,num2,alarm1,alarm2,alarm3;
void delay(unsigned int z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void write_com(uchar com) //写命令
{
lcdrs=0;
P3=com;
delay(2);
lcden=1;
delay(2);
lcden=0;
}
void write_data(uchar date) //写数据
{
lcdrs=1;
P3=date;
delay(2);
lcden=1;
delay(2);
lcden=0;
}
void time() //调节时间
{
while(1)
{
if(key1==0)
{
delay(10);
if(key1==0)
{
if(hour==23)
hour=0;
else
hour++;
hourge=hour%10;
hourshi=hour/10;
write_com(0x0f);
delay(2);
write_com(0x80+1);
write_data(table1[hourge]);
delay(5);
write_com(0x80);
delay(2);
write_data(table1[hourshi]);
while(!key1);
}
}
if(key2==0)
{
delay(10);
if(key2==0)
{
if(min==59)
min=0;
else
min++;
minge=min%10;
minshi=min/10;
write_com(0x0f);
write_com(0x80+4);
write_data(table1[minge]);
delay(1);
write_com(0x80+3);
write_data(table1[minshi]);
delay(1);
while(!key2);
}
}
if(key3==0)
{
delay(10);
if(key3==0) //按下K3,返回时间模式
{
write_com(0x0c);
TR1=1;
while(!key3);
break;
}
}
}
}
void display1() // 闹钟一
{
while(1)
{
if(key1==0)
{
delay(10);
if(key1==0)
{
if(ahour1==23)
ahour1=0;
else
ahour1++;
ahourge1=ahour1%10;
ahourshi1=ahour1/10;
write_com(0x0f);
write_com(0x80+0x40+8); //写入时与分之间的分隔标志:
write_data(':');
write_com(0x80+0x40+7); //写入闹钟1时间的小时
write_data(table1[ahourge1]);
delay(1);
write_com(0x80+0x40+6);
write_data(table1[ahourshi1]);
delay(1);
while(!key1);
}
}
if(key2==0)
{
delay(10);
if(key2==0)
{
if(amin1==59)
amin1=0;
else
amin1++;
aminge1=amin1%10;
aminshi1=amin1/10;
write_com(0x0f);
write_com(0x80+0x40+10); //写入闹钟1时间的分钟
write_data(table1[aminge1]);
delay(1);
write_com(0x80+0x40+9);
write_data(table1[aminshi1]);
delay(1);
while(!key2);
}
}
if(key3==0)
{
alarm3=~alarm3;
delay(10);
if(key3==0)
{
write_com(0x0c);
write_com(0x80+0x40);
for(i=0;i<5;i++)
write_data(table2[i]);
while(!key3);
delay(250);
write_com(0x01);
break; //结束闹钟一的设置
}
}
}
}
void display2() //闹钟二
{
while(1)
{
if(key1==0)
{
delay(10);
if(key1==0)
{
if(ahour2==23)
ahour2=0;
else
ahour2++;
ahourge2=ahour2%10;
ahourshi2=ahour2/10;
write_com(0x0f);
write_com(0x80+0x40+8); //写入闹钟二小时与分钟的间隔标志:
write_data(':');
write_com(0x80+0x40+7); //写入闹钟二时间的小时位
write_data(table1[ahourge2]);
delay(1);
write_com(0x80+0x40+6);
write_data(table1[ahourshi2]);
delay(1);
while(!key1);
}
}
if(key2==0)
{
delay(10);
if(key2==0)
{
if(amin2==59)
amin2=0;
else
amin2++;
aminge2=amin2%10;
aminshi2=amin2/10;
write_com(0x0f);
write_com(0x80+0x40+10); //写入闹钟2分钟位
write_data(table1[aminge2]);
delay(1);
write_com(0x80+0x40+9);
write_data(table1[aminshi2]);
delay(1);
while(!key2);
}
}
if(key3==0)
{
alarm3=~alarm3;
delay(10);
if(key3==0)
{
write_com(0x0c);
write_com(0x80+0x40);
for(i=0;i<5;i++)
write_data(table2[i]);
while(!key3);
delay(250);
write_com(0x01);
break; //结束闹钟二的设置
}
}
}
}
void keyscan() //键盘扫描程序
{
if(key1==0)
{
delay(10);
if(key1==0)
{
while(!key1); //若按下K1进入时间设置
time();
}
}
else if(key4==0) //若按下K4
{
cnt1++;
delay(10);
if(cnt==1)
{
while(!key4)
{
ahourge1=ahour1%10;
ahourshi1=ahour1/10;
write_com(0x80+0x40+7);
write_data(table1[ahourge1]);
delay(5);
write_com(0x80+0x40+6);
write_data(table1[ahourshi1]);
delay(5);
aminge1=amin1%10;
aminshi1=amin1/10;
write_com(0x80+0x40+10);
write_data(table1[aminge1]);
delay(5);
write_com(0x80+0x40+9);
write_data(table1[aminshi1]);
delay(2);
write_com(0x80+0x40);
for(i=0;i<4;i++)
write_data(Alarm_1[i]);
}
delay(2);
write_com(0x01);
}
if(cnt1==2)
{
while(!key4)
{
ahourge2=ahour2%10;
ahourshi2=ahour2/10;
write_com(0x80+0x40+7);
write_data(table1[ahourge2]);
delay(5);
write_com(0x80+0x40+6);
write_data(table1[ahourshi2]);
delay(2);
aminge1=amin1%10;
aminshi1=amin1/10;
write_com(0x80+0x40+10);
write_data(table1[aminge2]);
delay(5);
write_com(0x80+0x40+9);
write_data(table1[aminshi2]);
delay(2);
write_com(0x80+0x40);
for(i=0;i<4;i++)
write_data(Alarm_2[i]);
}
delay(2);
write_com(0x01);
}
if(cnt1>2)
cnt1=0;
}
else if(key3==0)
{
cnt++;
delay(10);
if(cnt==1)
{
while(!key3);
ahourge1=ahour1%10;
ahourshi1=ahour1/10;
write_com(0x80+0x40+7);
write_data(table1[ahourge1]);
delay(5);
write_com(0x80+0x40+6);
write_data(table1[ahourshi1]);
delay(2);
aminge1=amin1%10;
aminshi1=amin1/10;
write_com(0x80+0x40+10);
write_data(table1[aminge1]);
delay(5);
write_com(0x80+0x40+9);
write_data(table1[aminshi1]);
delay(2);
write_com(0x80+0x40);
for(i=0;i<4;i++)
write_data(Alarm_1[i]);
display1();
}
if(cnt==3)
{
while(!key3);
ahourge2=ahour2%10;
ahourshi2=ahour2/10;
write_com(0x80+0x40+7);
write_data(table1[ahourge2]);
delay(5);
write_com(0x80+0x40+6);
write_data(table1[ahourshi2]);
delay(2);
aminge2=amin2%10;
aminshi2=amin2/10;
write_com(0x80+0x40+10);
write_data(table1[aminge2]);
delay(5);
write_com(0x80+0x40+9);
write_data(table1[aminshi2]);
delay(2);
write_com(0x80+0x40);
for(i=0;i<4;i++)
write_data(Alarm_2[i]);
display2();
}
if(cnt>3)
{
cnt=0;
}
}
}
void lcd_init()
{
lcden=0;
lcdrw=0;
write_com(0x3c); //双行显示,8位总线,5*10显示
write_com(0x0c); //开显示,无光标
write_com(0x06); //光标左移,文字不左移
write_com(0x01); //清屏
delay(2);
write_com(0x80); //置数据存贮器地址
for(i=0;i<6;i++)
{
write_data(table2[i]);
delay(2);
}
}
void judge()
{
if(sec==60)
{
min++;
sec=0;
}
if(min==60)
{
hour++;
min=0;
}
}
void init()
{
key1=1;key2=1;key3=1;key4=1;sec=0;a=0;sound=1;
TMOD=0x10;
TL1=0xB0;
TH1=0x3C;
EA=1;
ET1=1;
TR1=1;
}
void speak()
{
if(amin1==min&&ahour1==hour||amin2==min&&ahour2==hour)
{
delay(5);
sound=0;
led=0;
}
delay(10);
delay(10);
delay(10);
led=1;
sound=1;
}
void led1() interrupt 3
{
TL1=0xB0;
TH1=0x3C;
speak();
num1++;
num2++;
if(num2==20)
{
sec++;
num2=0;
judge();
}
}
void main()
{ lcd_init();
init();
while(1)
{
keyscan();
hourshi=hour/10;
hourge=hour%10;
write_com(0x80+0);
write_data(table1[hourshi]);
delay(5);
write_com(0x80+1);
write_data(table1[hourge]);
delay(5);
write_com(0x80+2);
write_data(':');
delay(5);
minshi=min/10;
minge=min%10;
write_com(0x80+3);
write_data(table1[minshi]);
delay(5);
write_com(0x80+4);
write_data(table1[minge]);
delay(5);
write_com(0x80+5);
write_data(':');
delay(5);
secshi=sec/10;
secge=sec%10;
write_com(0x80+6);
write_data(table1[secshi]);
delay(5);
write_com
评论2