找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6957|回复: 11
打印 上一主题 下一主题
收起左侧

51单片机lcd1602d电子时钟设计

  [复制链接]
跳转到指定楼层
楼主
由于课程设计需要,本人做了一个基于51单片机控制的lcd1602d显示的电子时钟电子设计产品。可以显示万年历,星期。
本来还想加上温湿度的检测,发现屏幕空间不够用了。。有需要可以再另外共享那个设计。第一次


单片机源程序如下:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit rs=P1^0;                                               
  5. sbit rw=P1^1;                                               
  6. sbit en=P1^2;                                       
  7. sbit key_set=P3^4;
  8. sbit key_up=P3^5;
  9. sbit key_down=P3^6;
  10. uchar code table1[]="2017/04/18 Aiice:";
  11. uchar code table2[]="00:00:00   ";
  12. uchar num,aa,sec,min,hou,week,day,mon,year,key_num;
  13. void write_week(uchar week);

  14. void delay(uint z)
  15. {
  16.   uint x,y;
  17.   for (x=z;x>0;x--)
  18.   {
  19.    for(y=250;y>0;y--);
  20.   }
  21. }
  22. void write_dat(uchar);   //
  23. void write_com(uchar);  //
  24. void init();
  25. void display_1(uchar add,uchar acc);
  26. void display_2(uchar add,uchar acc);  //
  27. void write_week(uchar week)     
  28. {  
  29.           write_com(0x80+0x40+12);
  30.           switch(week)  
  31.         {   
  32.                 case 1: write_dat('M');delay(5); write_dat('O');delay(5);write_dat('N');break;   
  33.                 case 2: write_dat('T');delay(5);write_dat('U');delay(5);write_dat('E');break;   
  34.                 case 3: write_dat('W');delay(5);write_dat('E');delay(5);write_dat('D');break;   
  35.                 case 4: write_dat('T');delay(5);write_dat('H');delay(5);write_dat('U');break;   
  36.                 case 5: write_dat('F');delay(5);write_dat('R');delay(5);write_dat('I');break;   
  37.                 case 6: write_dat('S');delay(5);write_dat('A');delay(5);write_dat('T');break;   
  38.                 case 7: write_dat('S');delay(5);write_dat('U');delay(5);write_dat('N');break;  
  39.         }
  40. }
  41. void keyscan()       //
  42. {
  43. if(key_set==0)
  44. {
  45.   delay(5);       
  46.   if(key_set==0)
  47.   {
  48.    while(!key_set);
  49.    key_num++;
  50.    if(key_num==1)  //定位到秒
  51.    {  
  52.                                                 TR0=0;
  53.                                                 write_com(0x80+0x40+7);
  54.                                                 write_com(0x0f);
  55.                                         if(key_up==0)
  56.                          {
  57.                                         delay(5);
  58.                                         if(key_up==0)
  59.                                         {
  60.                                                 while(!key_up);
  61.                                                 //up_num++;
  62.                                                
  63.                                                
  64.                                                  sec++;
  65.                                                  if(sec==60)
  66.                                                  { sec=0;min=min+1;}
  67.                                                         display_2(7,sec);
  68.                                                         write_com(0x80+0x40+7);
  69.                                                
  70.                                         }
  71.                          }
  72.          }
  73.                 //////////////////////////////////////       
  74.    
  75.     if(key_num==2) //定位到分
  76.     {
  77.                         TR0=0;
  78.      write_com(0x80+0x40+4);
  79.                        
  80.     }
  81.     if(key_num==3) //定位到时
  82.     {
  83.                         TR0=0;
  84.      write_com(0x80+0x40+1);
  85.     }
  86.                 if(key_num==4) //定位到日
  87.     {
  88.                         TR0=0;
  89.      write_com(0x80+9);
  90.     }
  91.                 if(key_num==5) //定位到月
  92.     {
  93.                         TR0=0;
  94.      write_com(0x80+6);
  95.     }
  96.                
  97.                 if(key_num==6) //定位到年
  98.     {
  99.                         TR0=0;
  100.      write_com(0x80+3);
  101.     }
  102.     if(key_num==7) //保存设置
  103.     {
  104.                         //TR0=0;
  105.      key_num=0;
  106.      write_com(0x0c);//取消闪烁
  107.      TR0=1;
  108.     }
  109.                        
  110.   }
  111. }
  112. if(key_num!=0)
  113.   {
  114.     if(key_up==0)
  115.    {
  116.     delay(5);
  117.     if(key_up==0)
  118.     {
  119.       while(!key_up);
  120.       if(key_num==1)
  121.       {
  122.        sec++;
  123.        if(sec==60)
  124.        { sec=0;min=min+1;
  125.                                  display_2(3,min);
  126.        write_com(0x80+0x40+4);
  127.                          }
  128.         display_2(6,sec);                        //6表示十位数字的位置,则各位数字在7.(大发现!!!)
  129.         write_com(0x80+0x40+7);//光标闪烁的位置(在个位)
  130.       }
  131.       if(key_num==2)
  132.       {
  133.        min++;
  134.        if(min==60)
  135.        {
  136.                                  min=0;hou=hou+1;
  137.                                   display_2(0,hou);
  138.        write_com(0x80+0x40+1);
  139.                          }
  140.        display_2(3,min);
  141.        write_com(0x80+0x40+4);      
  142.       }
  143.       if(key_num==3)
  144.       {
  145.        hou++;
  146.        if(hou==24)
  147.        {
  148.                                  hou=0;day=day+1;week++;
  149.                                   display_1(8,day);
  150.                                  write_com(0x80+9);
  151.                          }
  152.        display_2(0,hou);        //时针的十位数字在屏幕的左边第一个位置
  153.        write_com(0x80+0x40+1);      
  154.       }
  155.                         if(key_num==4)
  156.       {
  157.        day++;
  158.                                 //week++;
  159.        if(day==30)
  160.        {
  161.                                  day=0;mon=mon+1;
  162.                                   display_2(5,mon);
  163.        write_com(0x80+6);
  164.                          }
  165.        display_1(8,day);
  166.        write_com(0x80+9);      
  167.       }      
  168.     }
  169.       
  170.    }
  171.    if(key_down==0)
  172.    {
  173.     delay(5);
  174.     if(key_down==0)
  175.     {
  176.       while(!key_down);
  177.       if(key_num==1)
  178.       {
  179.        sec--;
  180.        if(sec==-1)
  181.        { sec=59;min=min-1;
  182.                                  display_2(3,min);
  183.        write_com(0x80+0x40+4);
  184.                          }
  185.         display_2(6,sec);
  186.         write_com(0x80+0x40+7);
  187.       }
  188.       if(key_num==2)
  189.       {
  190.        min--;
  191.        if(min==-1)
  192.        {
  193.                                  min=59;hou=hou-1;
  194.                                  display_2(0,hou);
  195.        write_com(0x80+0x40+1);
  196.                          }
  197.        display_2(3,min);
  198.        write_com(0x80+0x40+4);      
  199.       }
  200.       if(key_num==3)
  201.       {
  202.        hou--;
  203.        if(hou==-1)
  204.                          {hou=23;week--;}//星期还没加入
  205.        display_2(0,hou);
  206.        write_com(0x80+0x40+1);      
  207.       }   
  208.     }
  209.    }   
  210.   }
  211.        
  212. }
  213. void main()
  214. {
  215. init();
  216. write_week(week); //送到液晶屏显示
  217. while(1)  
  218. {  
  219.    keyscan();
  220.    if(aa==20)
  221.     {
  222.      aa=0;
  223.     sec++;
  224.     if(sec==60)
  225.     {
  226.      sec=0;
  227.      min++;
  228.      if(min==60)
  229.      {
  230.       min=0;
  231.       hou++;
  232.       if(hou==24)
  233.       {
  234.        hou=0;
  235.       }
  236.       display_2(1,hou);
  237.      }
  238.      display_2(3,min);
  239.     }
  240.     display_2(6,sec);//在秒钟那个位置开始加一
  241.     }   
  242.   }
  243. }            
  244. void write_com(uchar com)
  245. {
  246. rs=0;
  247. en=1;
  248. P0=com;
  249. delay(5);
  250. en=1;
  251. delay(5);
  252. en=0;
  253. }
  254. void write_dat(uchar dat)  
  255. {
  256. rs=1;
  257. en=1;
  258. P0=dat;
  259. delay(5);
  260. en=1;
  261. delay(5);
  262. en=0;
  263. }
  264. void init()
  265. {
  266. key_set=key_up=key_down=1;
  267. week=3;
  268. rw=0;
  269. en=0;
  270. delay(50);
  271. write_com(0x38);      //
  272.          delay(1);
  273. write_com(0x0c);      //  s
  274.         delay(1);
  275. write_com(0x06);      //  
  276.         delay(1);
  277. write_com(0x80);      //
  278. delay(1);       
  279. write_com(0x01);      //
  280.         delay(1);
  281. for(num=0;num<16;num++)
  282. {
  283.   write_dat(table1[num]);
  284.   delay(1);
  285.   }
  286.   write_com(0x80+0x40);  //左边第二行第一个位置开始写,往右(16个数据)        
  287.   for(num=0;num<14;num++)   
  288. {
  289.   write_dat(table2[num]);
  290.   delay(1);
  291.          
  292. }   

  293. ……………………

  294. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
1602test03.7z (436.38 KB, 下载次数: 170)




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
无心梧桐 发表于 2018-1-10 18:25 | 只看该作者
你好,另外一个温度的可以分享吗
回复

使用道具 举报

板凳
ALPHATTT 发表于 2018-3-7 19:24 | 只看该作者
棒棒哒
回复

使用道具 举报

地板
gty 发表于 2018-4-19 11:00 | 只看该作者
楼主 温湿度可以共享吗
回复

使用道具 举报

5#
Oerror 发表于 2018-5-29 17:32 来自手机 | 只看该作者
为什么运行出来 显示Wed   不能改哇
回复

使用道具 举报

6#
SHLMango 发表于 2019-3-14 19:40 | 只看该作者
厉害,厉害
回复

使用道具 举报

7#
liujielei1998 发表于 2019-4-17 22:58 | 只看该作者
这个设计太好了
回复

使用道具 举报

8#
屠魔幻影 发表于 2019-6-6 00:51 | 只看该作者
能不能发个电路原理图
回复

使用道具 举报

9#
Elliott 发表于 2019-6-21 09:20 | 只看该作者
很好的帖子,谢谢楼主,但是能不能发一下原理图呢
回复

使用道具 举报

10#
寂灭无为 发表于 2019-6-26 15:44 | 只看该作者
感谢楼主
回复

使用道具 举报

11#
hao18 发表于 2020-9-14 09:01 | 只看该作者
谢谢楼主的分享。下载来学习一下
回复

使用道具 举报

12#
ZZJ87 发表于 2020-9-15 14:44 | 只看该作者
图纸真多,时钟专家!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表