📄 clok.c
字号:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^7;
sbit rw =P2^6;
sbit lcden=P2^5;
sbit timeadj=P3^5;
sbit timeadd=P3^4;
sbit timedec=P3^3;
uchar pushnum;
static char count,sec,min,hou;
uchar code table1[]= "TIME 08-03-20";
uchar code table2[]= " 00:00:00 ";
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
rs=0;
rw=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
rs=1;
rw=0;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
uchar num;
lcden=0;
min=00;
sec=00;
hou=00;
write_com(0x38); //设置显示模式:数据总线长度8,两行,5*7字体
delay(5);
write_com(0x0c); //显示开关设置:显示状态开,光标不显示,不闪烁
delay(5);
write_com(0x06); //设置输入方式:光标右移一格,AC加一,字符不动
delay(5);
write_com(0x01); //清屏
delay(5);
write_com(0x80); //DDRAM7位地址设置:初始地址设为0x00
delay(5);
for(num=0;num<15;num++)
{
write_date(table1[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<14;num++)
{
write_date(table2[num]);
delay(5);
}
TMOD=0x01;
TH0=0x4C;
TL0=0x00;
EA=1;
ET0=1;
TR0=1;
}
void update_time(uchar LEDadd_num,uchar time)
{
uchar shi,ge;
shi=time/10;
ge=time%10;
write_com(0x80+0x40+LEDadd_num);
write_date(0x30+shi);
write_date(0x30+ge);
}
void keyscan()
{
if(timeadj==0)
{
delay(5);
if(timeadj==0)
{
while(!timeadj);
pushnum++;
switch(pushnum)
{
case 1:
TR0=0;
write_com(0x80+0x40+10); //地址指针在秒的十位
write_com(0x0f);//光标显示并闪烁(在当前地址的下一位)
break;
case 2:
write_com(0x80+0x40+7);//地址指针在分的十位
break;
case 3:
write_com(0x80+0x40+4);
break;
case 4:
pushnum=0;
write_com(0x0c);//关闭光标显示和闪烁
TR0=1;
break;
}
}
}
if(pushnum!=0)
{
if(timeadd==0)
{
delay(5);
if(timeadd==0)
{
while(!timeadd);
if(pushnum==1)
{
if(sec==59)
sec=-1;
sec++; //加后为0
update_time(10,sec);
write_com(0x80+0x40+10);
}
if(pushnum==2)
{
if(min==59)
min=-1;
min++;
update_time(7,min);
write_com(0x80+0x40+7);
}
if(pushnum==3)
{
if(hou==23)
hou=-1;
hou++;
update_time(4,hou);
write_com(0x80+0x40+4);
}
}
}
if(timedec==0)
{
delay(5);
if(timedec==0)
{
while (! timedec );
if(pushnum==1)
{
/* if(sec==0)
{
sec=59;
update_time(10,sec);
write_com(0x80+0x40+10);
}
*/
if(sec==0)
sec=60;
sec--; //减后为59
update_time(10,sec);
write_com(0x80+0x40+10);
}
if(pushnum==2)
{
if(min==0)
min=60;
min--;
update_time(7,min);
write_com(0x80+0x40+7);
}
if(pushnum==3)
{
if(hou==0)
hou=24;
hou--;
update_time(4,hou);
write_com(0x80+0x40+4);
}
}
}
}
}
void main()
{
init();
while(1)
{
if(count==20)
{
count=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hou++;
if(hou==24)
hou=0;
update_time(4,hou);//时判断完后,送液晶刷新显示
}
update_time(7,min); //分判断完后,送液晶刷新显示
}
update_time(10,sec); //秒判断完后,送液晶刷新显示
}
keyscan();
}
}
void timer0() interrupt 1
{
TH0=0x4C;
TL0=0x00;
count++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -