标题:
51单片机lcd1602d电子时钟设计
[打印本页]
作者:
13538677177
时间:
2017-7-8 21:51
标题:
51单片机lcd1602d电子时钟设计
由于课程设计需要,本人做了一个基于51单片机控制的lcd1602d显示的电子时钟电子设计产品。可以显示万年历,星期。
本来还想加上温湿度的检测,发现屏幕空间不够用了。。有需要可以再另外共享那个设计。第一次
0.png
(520.7 KB, 下载次数: 120)
下载附件
2017-7-9 04:59 上传
0.png
(49.36 KB, 下载次数: 114)
下载附件
2017-7-9 04:59 上传
单片机源程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit rs=P1^0;
sbit rw=P1^1;
sbit en=P1^2;
sbit key_set=P3^4;
sbit key_up=P3^5;
sbit key_down=P3^6;
uchar code table1[]="2017/04/18 Aiice:";
uchar code table2[]="00:00:00 ";
uchar num,aa,sec,min,hou,week,day,mon,year,key_num;
void write_week(uchar week);
void delay(uint z)
{
uint x,y;
for (x=z;x>0;x--)
{
for(y=250;y>0;y--);
}
}
void write_dat(uchar); //
void write_com(uchar); //
void init();
void display_1(uchar add,uchar acc);
void display_2(uchar add,uchar acc); //
void write_week(uchar week)
{
write_com(0x80+0x40+12);
switch(week)
{
case 1: write_dat('M');delay(5); write_dat('O');delay(5);write_dat('N');break;
case 2: write_dat('T');delay(5);write_dat('U');delay(5);write_dat('E');break;
case 3: write_dat('W');delay(5);write_dat('E');delay(5);write_dat('D');break;
case 4: write_dat('T');delay(5);write_dat('H');delay(5);write_dat('U');break;
case 5: write_dat('F');delay(5);write_dat('R');delay(5);write_dat('I');break;
case 6: write_dat('S');delay(5);write_dat('A');delay(5);write_dat('T');break;
case 7: write_dat('S');delay(5);write_dat('U');delay(5);write_dat('N');break;
}
}
void keyscan() //
{
if(key_set==0)
{
delay(5);
if(key_set==0)
{
while(!key_set);
key_num++;
if(key_num==1) //定位到秒
{
TR0=0;
write_com(0x80+0x40+7);
write_com(0x0f);
if(key_up==0)
{
delay(5);
if(key_up==0)
{
while(!key_up);
//up_num++;
sec++;
if(sec==60)
{ sec=0;min=min+1;}
display_2(7,sec);
write_com(0x80+0x40+7);
}
}
}
//////////////////////////////////////
if(key_num==2) //定位到分
{
TR0=0;
write_com(0x80+0x40+4);
}
if(key_num==3) //定位到时
{
TR0=0;
write_com(0x80+0x40+1);
}
if(key_num==4) //定位到日
{
TR0=0;
write_com(0x80+9);
}
if(key_num==5) //定位到月
{
TR0=0;
write_com(0x80+6);
}
if(key_num==6) //定位到年
{
TR0=0;
write_com(0x80+3);
}
if(key_num==7) //保存设置
{
//TR0=0;
key_num=0;
write_com(0x0c);//取消闪烁
TR0=1;
}
}
}
if(key_num!=0)
{
if(key_up==0)
{
delay(5);
if(key_up==0)
{
while(!key_up);
if(key_num==1)
{
sec++;
if(sec==60)
{ sec=0;min=min+1;
display_2(3,min);
write_com(0x80+0x40+4);
}
display_2(6,sec); //6表示十位数字的位置,则各位数字在7.(大发现!!!)
write_com(0x80+0x40+7);//光标闪烁的位置(在个位)
}
if(key_num==2)
{
min++;
if(min==60)
{
min=0;hou=hou+1;
display_2(0,hou);
write_com(0x80+0x40+1);
}
display_2(3,min);
write_com(0x80+0x40+4);
}
if(key_num==3)
{
hou++;
if(hou==24)
{
hou=0;day=day+1;week++;
display_1(8,day);
write_com(0x80+9);
}
display_2(0,hou); //时针的十位数字在屏幕的左边第一个位置
write_com(0x80+0x40+1);
}
if(key_num==4)
{
day++;
//week++;
if(day==30)
{
day=0;mon=mon+1;
display_2(5,mon);
write_com(0x80+6);
}
display_1(8,day);
write_com(0x80+9);
}
}
}
if(key_down==0)
{
delay(5);
if(key_down==0)
{
while(!key_down);
if(key_num==1)
{
sec--;
if(sec==-1)
{ sec=59;min=min-1;
display_2(3,min);
write_com(0x80+0x40+4);
}
display_2(6,sec);
write_com(0x80+0x40+7);
}
if(key_num==2)
{
min--;
if(min==-1)
{
min=59;hou=hou-1;
display_2(0,hou);
write_com(0x80+0x40+1);
}
display_2(3,min);
write_com(0x80+0x40+4);
}
if(key_num==3)
{
hou--;
if(hou==-1)
{hou=23;week--;}//星期还没加入
display_2(0,hou);
write_com(0x80+0x40+1);
}
}
}
}
}
void main()
{
init();
write_week(week); //送到液晶屏显示
while(1)
{
keyscan();
if(aa==20)
{
aa=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hou++;
if(hou==24)
{
hou=0;
}
display_2(1,hou);
}
display_2(3,min);
}
display_2(6,sec);//在秒钟那个位置开始加一
}
}
}
void write_com(uchar com)
{
rs=0;
en=1;
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}
void write_dat(uchar dat)
{
rs=1;
en=1;
P0=dat;
delay(5);
en=1;
delay(5);
en=0;
}
void init()
{
key_set=key_up=key_down=1;
week=3;
rw=0;
en=0;
delay(50);
write_com(0x38); //
delay(1);
write_com(0x0c); // s
delay(1);
write_com(0x06); //
delay(1);
write_com(0x80); //
delay(1);
write_com(0x01); //
delay(1);
for(num=0;num<16;num++)
{
write_dat(table1[num]);
delay(1);
}
write_com(0x80+0x40); //左边第二行第一个位置开始写,往右(16个数据)
for(num=0;num<14;num++)
{
write_dat(table2[num]);
delay(1);
}
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
1602test03.7z
(436.38 KB, 下载次数: 225)
2017-7-8 21:51 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
无心梧桐
时间:
2018-1-10 18:25
你好,另外一个温度的可以分享吗
作者:
ALPHATTT
时间:
2018-3-7 19:24
棒棒哒
作者:
gty
时间:
2018-4-19 11:00
楼主 温湿度可以共享吗
作者:
Oerror
时间:
2018-5-29 17:32
为什么运行出来 显示Wed 不能改哇
作者:
SHLMango
时间:
2019-3-14 19:40
厉害,厉害
作者:
liujielei1998
时间:
2019-4-17 22:58
这个设计太好了
作者:
屠魔幻影
时间:
2019-6-6 00:51
能不能发个电路原理图
作者:
Elliott
时间:
2019-6-21 09:20
很好的帖子,谢谢楼主,但是能不能发一下原理图呢
作者:
寂灭无为
时间:
2019-6-26 15:44
感谢楼主
作者:
hao18
时间:
2020-9-14 09:01
谢谢楼主的分享。下载来学习一下
作者:
ZZJ87
时间:
2020-9-15 14:44
图纸真多,时钟专家!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1