📄 lcd1602时钟显示.c
字号:
/* 用1602LCD液晶做的一个时钟,包括星期,日期
***************************
s1作为位选,每按一次,就选一位,按第九次屏幕恢复正常
s2作为加法键 在s1按下的时候才能进行加法
s3作为减法键 在s1按下的时候才能进行减法 */
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
uchar code table[]=" 0000-00-00 000" ;//初始化日期和星期
uchar code table1[]=" 00:00:00";//初始化时间
uchar code table2[][3]={"MOD","TUE","WED","THU","FRI","SAT","SUN"};//定义星期数组
uint code table3[]={31,31,28,31,30,31,30,31,31,30,31,30,31};
//以下三个是定义LCD的引脚
sbit lcden=P1^3;
sbit lcdwrite=P1^1;
sbit lcdrs=P1^2;
//定义四个功能开关
sbit s1=P1^4;
sbit s2=P1^5;
sbit s3=P1^6;
sbit s=P1^7;
//定义时间、时、分、秒、年、月、日等变量
uchar time;
char hour,min,sec,day,mon,year1,year2,xingqi,num;
//延时程序
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//lcd的写指令
void write_com(uchar com)
{
lcdrs=0;
lcden=0;
P2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
//lcd的写数据
void write_data(uchar da)
{
lcdrs=1;
lcden=0;
P2=da;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
//初始化
void init()
{
uchar num;
lcdwrite=0;jiao
lcden=0;
write_com(0x38); //16*2显示,5*7点阵,8位数据
write_com(0x0c);//显示开,关光标
write_com(0x06); //移动光标
write_com(0x01);//清除LCD的显示内容
for (num=0;num<15;num++)
{
write_data(table[num]);
delay(5);
}
write_com(0x80+0x40);
for (num=0;num<12;num++)
{
write_data(table1[num]);
delay(5);
}
TMOD=0x01;
TL0=(65536-46080)%256;
TH0=(65536-46080)/256;
EA=1;
ET0=1;
TR0=1;
}
//时间走动的显示
write_hms(uchar add,uchar da)
{
uchar shi,ge;
shi=da/10;
ge=da%10;
write_com(0x80+0x40+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
//日期走动的显示
write_ymd(uchar add,uchar da)
{
uchar shi,ge;
shi=da/10;
ge=da%10;
write_com(0x80+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
//星期走动的显示
void write_xingqi(char xingqi)
{
char num;
write_com(0x80+12);
for(num=0;num<3;num++)
write_data(table2[xingqi][num]);
}
//键盘扫描
void keyscan()
{
s=0;
if(s1==0)//如果S1按下去,执行相应的操作
{
delay(5);//消除抖动
if(s1==0)
{
num++;
while(!s1);
if(num==1)
{
TR0=0;//关定时器
write_com(0x80+0x40+11);//选定秒
write_com(0x0f);
}
}
if(num==2)//选定分
{
write_com(0x80+0x40+8);
}
if(num==3)//选定时
{
write_com(0x80+0x40+5);
}
if(num==4)//选定星期
{
write_com(0x80+12);
write_com(0x0f);
}
if(num==5)//选定日
{
write_com(0x80+10);
}
if(num==6)//选定月
{
write_com(0x80+7);
}
if(num==7)//选定年后两位
{
write_com(0x80+4);
}
if(num==8)//选定年前两位
{
write_com(0x80+2);
}
if(num==9)//恢复
{
num=0;
write_com(0x0c);
TR0=1;//重复开定时器
}
}
if(num!=0)
{
if(s2==0)//如果s2按下调理参数
{
delay(5);
if(s2==0)
{
while(!s2);
if(num==1)
{
sec++;//调秒并显示加1
if(sec==60)
sec=0;
write_hms(10,sec);
write_com(0x80+0x40+11);
}
if(num==2)//调分并显示加1
{
min++;
if(min==60)
min=0;
write_hms(7,min);
write_com(0x80+0x40+8);
}
if(num==3)//调时并显示加1
{
hour++;
if(hour==24)
hour=0;
write_hms(4,hour);
write_com(0x80+0x40+5);
}
if(num==4)//调星期并显示加1
{
xingqi++;
if(xingqi==7)
xingqi=0;
write_xingqi(xingqi);
write_com(0x80+14);
}
if(num==5)
{
day++;//调日并显示加1
if(day==table3[mon]+1)
day=1;
write_ymd(9,day);
write_com(0x80+10);
}
if(num==6)//调月并显示加1
{
mon++;
if(mon==13)
mon=1;
write_ymd(6,mon);
write_com(0x80+7);
}
if(num==7)//调年前位并显示加1
{
year1++;
if(year1==100)
year1=0;
write_ymd(3,year1);
write_com(0x80+4);
}
if(num==8)//调年后位并显示加1
{
year2++;
if(year2==100)
year2=0;
write_ymd(1,year2);
write_com(0x80+2);
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
if(num==1)//调秒并显示减1
{
sec--;
if(sec==-1)
sec=59;
write_hms(10,sec);
write_com(0x80+0x40+11);
}
if(num==2)//调分并显示减1
{
min--;
if(min==-1)
min=59;
write_hms(7,min);
write_com(0x80+0x40+8);
}
if(num==3)//调时并显示减1
{
hour--;
if(hour==-1)
hour=23;
write_hms(4,hour);
write_com(0x80+0x40+5);
}
if(num==4)//调星期并显示减1
{
xingqi--;
if(xingqi==-1)
xingqi=6;
write_xingqi(xingqi);
write_com(0x80+14);
}
if(num==5)//调日并显示减1
{
day--;
if(day==0)
day=table3[mon];
write_ymd(9,day);
write_com(0x80+10);
}
if(num==6)//调月并显示减1
{
mon--;
if(mon==0)
mon=12;
write_ymd(6,mon);
write_com(0x80+7);
}
if(num==7)//调年前两拉并显示减1
{
year1--;
if(year1==-1)
year1=0;
write_ymd(3,year1);
write_com(0x80+4);
}
if(num==8)//调年后两拉并显示减1
{
year2--;
if(year2==-1)//减1到0重设为0
year2=0;
write_ymd(1,year2);
write_com(0x80+2);
}
}
}
}
}
//主函数
void main ()
{
init();
while(1)
{
keyscan();
}
}
//中断定时
void timer0() interrupt 1
{
TL0=(65536-50000)%256;//定时50ms
TH0=(65536-50000)/256;
time++;
if(time==20)//1s定时到
{
time=0;
sec++;//秒加1
if(sec==60)
{
sec=0;
min++;//分钟加1
if(min==60)
{
min=0;
hour++;//小时加1
if(hour==24)
{
hour=0;
day++;//日期的日加1
xingqi++;//星期加1
if(day==table3[mon]+1)
{
day=1;
mon++;//月加1
if(mon==13)//加到13重设为1
{
mon=1;
year1++;
if(year1==100)//年前两位加到100重设为0
{
year1=0;
year2++;//年后两位加1
if(year2==100)//年后两位加到100重设为0
{
year2=0;
}
write_ymd(1,year2);
}
write_ymd(3,year1);
}
write_ymd(6,mon);
}
write_ymd(9,day);
if(xingqi==7)//如果星期到七就设为0
xingqi=0;
write_xingqi(xingqi);
}
write_hms(4,hour);
}
write_hms(7,min);
}
write_hms(10,sec);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -