📄 ʦ
字号:
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^6;
sbit rw=P2^5;
sbit en=P2^7;
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit BEEP=P1^5;
uint tt1;
long shu;
uchar i=0;
uchar k1num,k2num,k3num,tt,ring=1,gap_ring=1,flag_display_time,flag_display_miaobiao=1,flag_beep=1;
uchar moshi1,moshi2,moshi3,a_hour=12,a_minute=0,a_second=0;
uchar year=11,month=6,date=8,day=3,hour=11,minute=59,second=50;
uchar code week[7][3]={"SUN","MON","TUS","WEN","THU","FRI","SAT"};
uchar code table []=" 20 - - ";
uchar code table1[]=" : : ";
uchar code table2[]=" SET ALARM ";
uchar code table3[]=" ON OFF ";
uchar code table4[]=" MIAO BIAO ";
uchar code table5[]=" 00:00:00 ";
//*******************************************************************************
//液晶读写及初始化
void delay(uint ms)
{ // 延时子程序
uint i;
while(ms--)
{
for(i = 0; i< 800; i++)
_nop_();
}
}
uchar lcd_bz() // 测试LCD忙碌状态
{
uchar result;
rs = 0;
rw = 1;
en = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (P0 & 0x80);
en = 0;
return result;
}
void write_com(uchar com) // 写入指令到LCD
{
while(lcd_bz());
rs = 0;
rw = 0;
en = 0;
_nop_();
_nop_();
P0 = com;
_nop_();
_nop_();
_nop_();
_nop_();
en = 1;
_nop_();
_nop_();
_nop_();
_nop_();
en = 0;
}
void write_date(uchar dat)
{ // 写入数据到LCD
while(lcd_bz());
rs = 1;
rw = 0;
en = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
en = 1;
_nop_();
_nop_();
_nop_();
_nop_();
en = 0;
}
void lcd_pc(uchar pc) // 液晶指针
{
write_com(pc|0x80);
}
void display(uchar add,uchar w[])
{
uchar i=0;
write_com(0x06);
delay(1);
lcd_pc(add);
while(w[i] !='\0')
write_date(w[i++]);
}
void lcd_init() // 液晶初始化
{
en=0;
write_com(0x38);
delay(1);
write_com(0x0c); // 开显示 无光标 不闪烁
delay(1);
write_com(0x01); // 清屏
delay(1);
display(0,table); // 第一行显示日期
display(0x40,table1); // 第二行显示时间
}
//**********************************************************************************
//液晶显示时分秒、年月日
void display_sfm(uchar add,uchar date) //显示 时分秒
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x04); //指针减1
lcd_pc(0x40+add);
write_date(0x30+ge);
write_date(0x30+shi);
}
void display_nyr(uchar add,uchar date) //显示 年月日
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x04); //指针减1
lcd_pc(add);
write_date(0x30+ge);
write_date(0x30+shi);
}
void display_week(uchar add,uchar date) //显示 星期
{
uchar num;
write_com(0x06); //指针加1
lcd_pc(add);
for(num=0;num<3;num++)
{
write_date(week[date][num]);
delay(4);
}
}
void display_miaobiao()
{
write_com(0x06); //指针减1
lcd_pc(0x44);
write_date(0x30+shu/100000);
write_date(0x30+shu%100000/10000);
write_date(':');
write_date(0x30+shu%100000%10000/1000);
write_date(0x30+shu%100000%10000%1000/100);
write_date(':');
write_date(0x30+shu%100000%10000%1000%100/10);
write_date(0x30+shu%10);
}
//*******************************************************************************
//调整时间
uchar second_plus(uchar second_1)
{
second_1++;
if(second_1>=60)
second_1=0;
display_sfm(11,second_1);
lcd_pc(0x4b);
return second_1;
}
uchar minute_plus(uchar minute_1)
{
minute_1++;
if(minute_1>=60)
minute_1=0;
display_sfm(8,minute_1);
lcd_pc(0x48);
return minute_1;
}
uchar hour_plus(uchar hour_1)
{
hour_1++;
if(hour_1>=24)
hour_1=0;
display_sfm(5,hour_1);
lcd_pc(0x45);
return hour_1;
}
void date_plus()
{
date++;
if(month!=2)
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:if(date>=32)date=1;break;
case 4:
case 6:
case 9:
case 11:if(date>=31)date=1;break;
}
}
else
{
if(year%4==0)
{
if(date>=30) //闰年29天
date=1;
}
else
{
if(date>=29)
date=1;
}
}
display_nyr(11,date);
lcd_pc(0x0b);
}
void month_plus()
{
month++;
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: break;
case 13: month=1; break;
case 4:
case 6:
case 9:
case 11: if(date>=31)date=1;break;
case 2: if(year%4==0)
if(date>=30)date=1;
else
if(date>=29)date=1;
}
display_nyr(8,month);
lcd_pc(0x0b);
display_nyr(11,date);
lcd_pc(0x08);
}
void year_plus()
{
year++;
if(year>=100)
year=0;
display_nyr(5,year);
lcd_pc(0x05);
}
void day_plus()
{
day++;
if(day>=7)
day=0;
display_week(13,day);
lcd_pc(0x0d);
}
//**********************************************************************************
//键盘扫描
void time_scan()
{
if(moshi1==0)
{
if(k1==0)
{
delay(5);
if(k1==0)
{
k1num++;
while(!k1);
if(k1num==1)
{
TR0=0;
moshi2=1;
moshi3=1;
flag_display_time=1;
lcd_pc(0x4b); //指针指向 秒的个位
write_com(0x0f); //开显示 开光标 开闪烁
}
if(k1num==2)
lcd_pc(0x48);
if(k1num==3)
lcd_pc(0x45);
if(k1num==4)
lcd_pc(0x0b);
if(k1num==5)
lcd_pc(0x08);
if(k1num==6)
lcd_pc(0x05);
if(k1num==7)
lcd_pc(0x0d);
if(k1num==8)
{
k1num=0;
write_com(0x0c); //开显示 无光标 不闪烁
TR0=1;
flag_display_time=0;
moshi2=0;
moshi3=0;
}
}
}
if(k1num!=0)
{
if(k2==0)
{
delay(5);
if(k2==0)
{
while(!k2);
if(k1num==1)
second=second_plus(second);
if(k1num==2)
minute=minute_plus(minute);
if(k1num==3)
hour=hour_plus(hour);
if(k1num==4)
date_plus();
if(k1num==5)
month_plus();
if(k1num==6)
year_plus();
if(k1num==7)
day_plus();
}
}
}
}
}
void alarm_scan()
{
if(moshi2==0)
{
if(k2==0)
{
delay(5);
if(k2==0)
{
k2num++;
while(!k2);
if(k2num==1)
{
moshi1=1;
moshi3=1;
flag_display_time=1;
display(0,table2); //第一行显示" SET ALARM "
display_sfm(5,a_hour); //第二行显示闹钟时间
display_sfm(8,a_minute);
display_sfm(11,a_second);
lcd_pc(0x4b); //指针指向 秒的个位
write_com(0x0f); //开显示 开光标 开闪烁
}
if(k2num==2)
lcd_pc(0x48);
if(k2num==3)
lcd_pc(0x45);
if(k2num==4)
{
display(0x40,table3);
if(i==1)
lcd_pc(0x49);
else
lcd_pc(0x44);
}
if(k2num==5)
{
k2num=0;
moshi1=0;
moshi3=0;
write_com(0x0c); //开显示 无光标 不闪烁
display(0,table); //第一行显示日期
display(0x40,table1);
display_sfm(5,hour); //第二行显示实时时间
display_sfm(8,minute);
display_sfm(11,second);
flag_display_time=0;
if(i==0)
flag_beep=0;
else
flag_beep=1;
}
}
}
if(k2num!=0)
{
if(k1==0)
{
delay(5);
if(k1==0)
{
while(!k1);
if(k2num==1)
a_second=second_plus(a_second);
if(k2num==2)
a_minute=minute_plus(a_minute);
if(k2num==3)
a_hour=hour_plus(a_hour);
if(k2num==4)
{
i=!i;
if(i==1)
lcd_pc(0x49);
else
lcd_pc(0x44);
}
}
}
}
}
if(moshi1==1 && moshi2 && moshi3 == 1)
{
if(k1==0||k2==0||k3==0)
{
delay(5);
if(k1==0||k2==0||k3==0)
{
flag_beep=1;
moshi1=0;
moshi2=0;
moshi3=0;
ring=1;
gap_ring=1;
TR1=0;
tt1=0;
}
while(!k1||!k2||!k3);
}
}
}
void miaobiao_scan()
{
if(moshi3==0)
{
if(k3==0)
{
delay(10);
if(k3==0)
{
while(!k3);
k3num++;
moshi1=1;
moshi2=1;
flag_display_time=1;
flag_display_miaobiao=0;
shu=0;
TR1=0;
display(0,table4);
display(0x40,table5);
}
if(k3num==2)
{
TR1=0;
k3num=0;
flag_display_time=0;
flag_display_miaobiao=1;
moshi1=0;
moshi2=0;
display(0,table);
}
}
if(k3num!=0)
{
if(k1==0)
{
delay(10);
if(k1==0)
{
k1num++;
if(k1num==1)
{
TR1=1;
}
if(k1num==2)
{
k1num=0;
TR1=0;
}
}
}
if(k2==0)
{
delay(10);
if(k2==0)
{
shu=0;
TR1=0;
}
}
}
}
}
//**************************************************************************************
//日期和星期自动调节
void date_judge(uchar date_num)
{
if(date>=date_num)
{
date=1;
month++;
if(month>=13)
{
month=1;
year++;
if(year>=100)
year=0;
}
}
}
void date_update() //日月年自动更新函数
{
if(month!=2)
{
switch(month)
{
case 1: //31天的月份
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:date_judge(32); break;
case 4: //30天的月份
case 6:
case 9:
case 11:date_judge(31); break;
}
}
else
{
if(year%4==0) //二月份要判断是闰年还是平年
date_judge(30);
else
date_judge(29);
}
}
void week_update() //星期自动更新函数
{
day++;
if(day>=7)
{
day=0;
}
}
void beep()
{
uchar j=3;
while(j--)
{
BEEP=0;
delay(10);
BEEP=1;
delay(10);
}
BEEP=1;
delay(20);
j=2;
while(j--)
{
BEEP=0;
delay(30);
BEEP=1;
delay(10);
}
}
//*************************************************************************************
void main()
{
lcd_init();
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
while(1)
{
time_scan();
alarm_scan();
miaobiao_scan();
if(flag_beep==0)
{
if(second==a_second && minute==a_minute && hour==a_hour)
{
TR1=1;
ring=0;
gap_ring=0;
}
}
if(ring==0)
{
beep();
moshi1=1;
moshi2=1;
moshi3=1;
}
if(flag_display_time==0)
{
display_nyr(5,year);
display_nyr(8,month);
display_nyr(11,date);
display_week(13,day);
display_sfm(5,hour);
display_sfm(8,minute);
display_sfm(11,second);
}
if(flag_display_miaobiao==0)
display_miaobiao();
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==20)
{
tt=0;
second++;
if(second>=60)
{
second=0;
minute++;
if(minute>=60)
{
minute=0;
hour++;
if(hour>=24)
{
hour=0;
day++;
date_update();
week_update();
}
}
}
}
}
void timer1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(gap_ring==0)
{
tt1++;
if(tt1==100)
ring=1;
if(tt1==200)
{
ring=0;
tt1=0;
}
}
shu++;
if(shu==1000000)
shu=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -