找回密码
 立即注册

QQ登录

只需一步,快速开始

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

LCD1602时钟显示月日星期可调

[复制链接]
跳转到指定楼层
楼主
ID:650313 发表于 2019-11-29 08:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新人发帖,有错误请指教!
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit s1=P3^2;
  6. sbit s2=P3^3;
  7. sbit s3=P3^4;
  8. sbit s4=P3^5;        //矩阵键盘         公共
  9. sbit EP = P2^2; //使能端
  10. sbit RW = P2^1; //数据/命令选择端
  11. sbit RS = P2^0; //读写选择端
  12. sbit KEY_1 = P3^2;          //按键设置模式选择
  13. sbit KEY_2 = P3^3;          //按键

  14. static uint code table1[] = {0, 31, 59, 90, 120, 151,181, 212, 242, 273, 303, 334};
  15. static uchar code *Week[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
  16. uchar sec = 0, hour = 12, minu = 0;
  17. uchar count = 0, week = 0; month = 1, day = 1

  18. void T0_Init()
  19. {
  20.         ET0 = 1;
  21.         TMOD = 0x01;
  22.         TH0 = (65536 - 46071)/256;
  23.         TL0 = (65536 - 46071)%256;
  24.         TR0 = 1;
  25. }

  26. void delay(uint ms)
  27. {
  28.         uint i, j;
  29.         
  30.         for(i=ms; i>0; i--)
  31.                 for(j=110; j>0; j--);
  32. }


  33. void Write_Cmd(uchar cmd) //写入命令
  34. {
  35.        // Lcd_Ready();
  36.         RS = 0;
  37.         RW = 0;
  38.                 EP = 0;
  39.         P0 = cmd;
  40.         delay(5);
  41.         EP = 1;
  42.         delay(5);
  43.         EP = 0;
  44. }

  45. void Write_Dat(uchar dat) //写入数据
  46. {
  47.        // Lcd_Ready();  //LCD1602 不忙则跳出
  48.         RS = 1;
  49.         RW = 0;
  50.                 EP = 0;
  51.         P0 = dat;
  52.         delay(5);
  53.         EP = 1;
  54.         delay(5);
  55.         EP = 0;
  56. }

  57. void Write_Week(uchar day, uchar month)                        //星期与日期同步
  58. {
  59.         week = (table1[(month - 1)] + day - 1);
  60.         week = week % 7;
  61.         Write_Cmd(0x80 + 12);                  
  62.         while(*Week[week] != '\0')
  63.                 Write_Dat(*Week[week]++);

  64. }

  65. void Write_Num(uchar x, uchar y, uchar num) //将时分秒和日期写入1602
  66. {
  67.         uchar unit, decad;

  68.         unit = num % 10;
  69.         decad = num /10;
  70.         if(y == 1)
  71.         {
  72.                 Write_Cmd(0x80 + 0x40 + x);
  73.                 Write_Dat(0x30 + decad);         //即加48,将数字转换为ASC||字符数字
  74.                 Write_Dat(0x30 + unit);
  75.         }
  76.         else
  77.         {
  78.                 Write_Cmd(0x80 + x);
  79.                 Write_Dat(0x30 + decad);
  80.                 Write_Dat(0x30 + unit);
  81.         }
  82. }

  83. void Lcd_Init()          //LCD初始化设定
  84. {
  85.         Write_Cmd(0x38); // 16*2显示,5*7点阵,8位数据
  86.         Write_Cmd(0x0c); // 显示开,关光标
  87.         Write_Cmd(0x06); // 读写地址自动加1,光标加1
  88.         Write_Cmd(0x01); //清除屏幕
  89.                 Write_Cmd(0x80);
  90. }

  91. void Display()  //
  92. {
  93.         Write_Week(day, month);
  94.         Write_Num(9, 0, day);
  95.         Write_Num(6, 0, month);
  96.         Write_Num(4, 1, hour);
  97.         Write_Num(7, 1, minu);
  98.         Write_Num(10, 1, sec);
  99.         Write_Cmd(0x80 + 0x40 + 6);
  100.         Write_Dat(':');
  101.         Write_Cmd(0x80 + 0x40 + 9);
  102.         Write_Dat(':');
  103. }

  104. void TimerCount()
  105. {
  106.         if(count == 20)
  107.         {
  108.                 count = 0;
  109.                 sec++;
  110.                 if(sec == 60)
  111.                 {
  112.                         sec = 0;
  113.                         minu++;
  114.                          if(minu == 60)
  115.                         {
  116.                                 minu = 0;
  117.                                 hour++;
  118.                                  if(hour == 24)
  119.                                 {
  120.                                         hour = 0;
  121.                                         day++;
  122.                                         week++;
  123.                                         if(week == 7)
  124.                                                 week = 0;
  125.                                         switch(month)
  126.                                         {
  127.                                                 case 1:
  128.                                                         if(day == 32)
  129.                                                         {
  130.                                                                 day = 0;
  131.                                                                 month++;
  132.                                                         
  133.                                                                 break;
  134.                                                         }
  135.                                                 case 2:
  136.                                                         if(day == 29)
  137.                                                         {
  138.                                                                 day = 0;
  139.                                                                 month++;
  140.                                                         
  141.                                                                 break;
  142.                                                         }
  143.                                                 case 3:
  144.                                                         if(day == 32)
  145.                                                         {
  146.                                                                 day = 0;
  147.                                                                 month++;
  148.                                                                 Write_Num(6, 0, month);
  149.                                                                 break;
  150.                                                         }
  151.                                                 case 4:
  152.                                                         if(day == 31)
  153.                                                         {
  154.                                                                 day = 0;
  155.                                                                 month++;
  156.                                                                
  157.                                                                 break;
  158.                                                         }
  159.                                                 case 5:
  160.                                                         if(day == 32)
  161.                                                         {
  162.                                                                 day = 0;
  163.                                                                 month++;
  164.                                                                
  165.                                                                 break;
  166.                                                         }
  167.                                                 case 6:
  168.                                                         if(day == 31)
  169.                                                         {
  170.                                                                 day = 0;
  171.                                                                 month++;
  172.                                                                
  173.                                                                 break;
  174.                                                         }
  175.                                                 case 7:
  176.                                                         if(day == 32)
  177.                                                         {
  178.                                                                 day = 0;
  179.                                                                 month++;
  180.                                                                
  181.                                                                 break;
  182.                                                         }
  183.                                                 case 8:
  184.                                                         if(day == 32)
  185.                                                         {
  186.                                                                 day = 0;
  187.                                                                 month++;
  188.                                                         
  189.                                                                 break;
  190.                                                         }
  191.                                                 case 9:
  192.                                                         if(day == 31)
  193.                                                         {
  194.                                                                 day = 0;
  195.                                                                 month++;
  196.                                                                
  197.                                                                 break;
  198.                                                         }
  199.                                                 case 10:
  200.                                                         if(day == 32)
  201.                                                         {
  202.                                                                 day = 0;
  203.                                                                 month++;
  204.                                                                
  205.                                                                 break;
  206.                                                         }
  207.                                                 case 11:
  208.                                                         if(day == 31)
  209.                                                         {
  210.                                                                 day = 0;
  211.                                                                 month++;
  212.                                                                 Write_Num(6, 0, month);
  213.                                                                 break;
  214.                                                         }
  215.                                                 case 12:
  216.                                                         if(day == 32)
  217.                                                         {
  218.                                                                 day = 0;
  219.                                                                 month = 1;
  220.                                                                 Write_Num(6, 0, month);
  221.                                                                 break;
  222.                                                         }
  223.                                         }
  224.                                        
  225.                                 }
  226.                                 
  227.                         }
  228.                         
  229.                 }
  230.                 Display();
  231.         }
  232. }

  233. void KeyScan()
  234. {
  235.         static uchar key1cnt = 0;                //KEY_1按下的次数
  236.         
  237.         if(KEY_1 == 0)
  238.         {
  239.                 delay(10);
  240.                 if(KEY_1 == 0)
  241.                 {
  242.                         key1cnt++;
  243.                         while(!KEY_1);
  244.                         switch(key1cnt)
  245.                         {
  246.                                 case 1:
  247.                                         TR0 = 0;
  248.                                         Write_Cmd(0x80 + 0x40 + 5);
  249.                                         Write_Cmd(0x0F);            //显示光标且光标闪烁
  250.                                         break;
  251.                                 case 2:
  252.                                         Write_Cmd(0x80 + 0x40 + 8);        
  253.                                         break;
  254.                                 case 3:
  255.                                         Write_Cmd(0x80 + 0x40 + 11);        
  256.                                         break;
  257.                                 case 4:
  258.                                         Write_Cmd(0x80 + 7);
  259.                                         break;
  260.                                 case 5:
  261.                                         Write_Cmd(0x80 + 10);
  262.                                         break;
  263.                                 case 6:
  264.                                         TR0 = 1;
  265.                                         Write_Cmd(0x0C);           //不显示光标
  266.                                         key1cnt = 0;
  267.                                         break;
  268.                         }
  269.                 }
  270.         }
  271.         if(key1cnt != 0)
  272.         {
  273.                 if(KEY_2 == 0)
  274.                 {
  275.                         delay(10);
  276.                         if(KEY_2 == 0)
  277.                         {
  278.                                 while(!KEY_2);
  279.                                 switch(key1cnt)
  280.                                 {
  281.                                         case 1:
  282.                                                 hour++;
  283.                                                 if(hour == 24)
  284.                                                         hour = 0;
  285.                                                 Write_Num(4, 1, hour);
  286.                                                 Write_Cmd(0x80 + 0x40 + 5);
  287.                                                 break;
  288.                                         case 2:
  289.                                                 minu++;
  290.                                                 if(minu == 60)
  291.                                                         minu = 0;
  292.                                                 Write_Num(7, 1, minu);
  293.                                                 Write_Cmd(0x80 + 0x40 + 8);
  294.                                                 break;
  295.                                         case 3:
  296.                                                 sec++;
  297.                                                 if(sec == 60)
  298.                                                         sec = 0;
  299.                                                 Write_Num(10, 1, sec);
  300.                                                 Write_Cmd(0x80 + 0x40 + 11);
  301.                                                 break;
  302.                                         case 4:
  303.                                                 month++;
  304.                                                 if(month == 13)
  305.                                                         month = 1;
  306.                                                 Write_Num(6, 0, month);
  307.                                                 Write_Cmd(0x80 + 7);
  308.                                                 break;
  309.                                         case 5:
  310.                                                 day++;
  311.                                                 if(day == 32)
  312.                                                         day = 1;
  313.                                                 Write_Num(9, 0, day);
  314.                                                 Write_Cmd(0x80 + 10);
  315.                                                 break;
  316.                                 }
  317.                         }
  318.                 }
  319.         }        
  320. }

  321. void main()
  322. {
  323.         uchar i = 0;
  324.         uchar code table[] = {"2019-01-01 Sun"};
  325.         
  326.         EA = 1;
  327.         Lcd_Init();                        //1602初始化
  328.         T0_Init();          //定时器0初始化
  329.         
  330.         Write_Cmd(0x80 + 1);
  331.         while(table[i] != '\0')
  332.         {
  333.                 Write_Dat(table[i]);
  334.                 i++;
  335.         }
  336.         while(1)
  337.         {
  338.                 KeyScan();
  339.         }
  340. }

  341. void Timer0() interrupt 1
  342. {
  343.         TH0 = (65536 - 46071)/256;
  344.         TL0 = (65536 - 46071)%256;
  345.         
  346.         count++;
  347.         TimerCount();
  348. }        
复制代码

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

使用道具 举报

沙发
ID:645579 发表于 2019-12-3 09:34 来自手机 | 只看该作者
楼主有没有原理图吖
回复

使用道具 举报

板凳
ID:650313 发表于 2019-12-20 19:23 | 只看该作者
没有哦,仔细研究一下程序能知道该怎么接线了!
回复

使用道具 举报

地板
ID:509174 发表于 2020-4-7 13:12 | 只看该作者
不错,可以参考
回复

使用道具 举报

5#
ID:733183 发表于 2020-6-7 14:01 | 只看该作者
一看就知道错了,敢不敢发文件
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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