找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机 lcd1602 万年历时钟

[复制链接]
跳转到指定楼层
楼主
本帖最后由 燎木乙 于 2019-9-21 23:02 编辑

lcd1602.h
  1. #ifndef _LCD1602_H_
  2. #define _LCD1602_H_

  3. sbit rs = P2^6;
  4. sbit rw = P2^5;
  5. sbit e = P2^7;

  6. typedef unsigned int uint8;
  7. typedef unsigned char uchar;

  8. void delay(uint8 i);
  9. void wrc(uint8 cmd);
  10. void wrd(uint8 dat);
  11. void init();

  12. #endif
复制代码
lcd1602.c
  1. #include "reg52.h"
  2. #include "lcd1602.h"
  3. #include "intrins.h"


  4. void delay(uint8 i)
  5. {
  6.         while(i--);
  7. }

  8. //指令写入
  9. void wrc(uint8 cmd)
  10. {
  11.         delay(1000);
  12.         rs = 0;
  13.         rw = 0;
  14.         e = 0;
  15.         P0 = cmd;
  16.         e = 1;
  17.         delay(10);
  18.         e = 0;
  19. }

  20. //数据输入
  21. void wrd(uint8 dat)
  22. {
  23.         delay(1000);
  24.         rs = 1;
  25.         rw = 0;
  26.         e = 0;
  27.         P0 = dat;
  28.         e = 1;
  29.         delay(10);
  30.         e = 0;
  31.         rs = 0;
  32. }

  33. //初始化
  34. void init()
  35. {
  36.         delay(1000);
  37.         wrc(0x38);
  38.         wrc(0x0c);
  39.         wrc(0x06);
  40.         wrc(0x01);
  41.         wrc(0x80);
  42. }
复制代码

main.c
  1. #include "reg52.h"
  2. #include "lcd1602.h"

  3. //时间:年月日时分秒
  4. uchar Time[7] = {20, 19, 9, 9, 13, 0, 0};
  5. uint8 n = 0;//定时计数,50ms一次


  6. sbit key1=P3^0;
  7. sbit key2=P3^1;
  8. sbit key3=P3^2;
  9. sbit key4=P3^3;

  10. void display();
  11. uint8 key();
  12. void guize();

  13. int main()
  14. {
  15.         EA = 1;//开总中断
  16.         EX0 = 1;//允许外部中断0
  17.         IT0 = 1;//外部中断0下降沿有效
  18.         TMOD = 0X01;//设置定时器模式
  19.         TH0 = (65535 - 46083) / 256;//延时50ms
  20.         TL0 = (65535 - 46083) % 256;
  21.         ET0 = 1;//开启定时器0中断
  22.         TR0 = 1;//开启定时器
  23.        
  24.         init();//初始化lcd1602
  25.         while(1)
  26.         {
  27.                 display();//显示函数
  28.                
  29.                 guize();
  30.         }
  31. }

  32. //显示函数
  33. void display()
  34. {
  35.         wrc(0x80|0x00);
  36.         wrd('0' + Time[0]/10);
  37.         wrd('0' + Time[0]%10);
  38.         wrd('0' + Time[1]/10);
  39.         wrd('0' + Time[1]%10);
  40.         wrd('-');
  41.         wrd('0' + Time[2]/10);
  42.         wrd('0' + Time[2]%10);
  43.         wrd('-');
  44.         wrd('0' + Time[3]/10);
  45.         wrd('0' + Time[3]%10);
  46.        
  47.         wrc(0x80|0x40);
  48.         wrd('0' + Time[4]/10);
  49.         wrd('0' + Time[4]%10);
  50.         wrd(':');
  51.         wrd('0' + Time[5]/10);
  52.         wrd('0' + Time[5]%10);
  53.         wrd(':');
  54.         wrd('0' + Time[6]/10);
  55.         wrd('0' + Time[6]%10);
  56. }

  57. uint8 key()
  58. {
  59.         uint8 k = 0;
  60.         P3=0x0f;
  61.         delay(100000000);
  62.         while(k == 0)
  63.         {
  64.                 if(key1 == 0)
  65.                 {
  66.                         delay(2000);
  67.                         if(key1 == 0)
  68.                                 return 1;
  69.                 }
  70.                 else if(key2 == 0)
  71.                 {
  72.                         delay(2000);
  73.                         if(key2 == 0)
  74.                                 return 2;
  75.                 }
  76.                 else if(key3 == 0)
  77.                 {
  78.                         delay(2000);
  79.                         if(key3 == 0)
  80.                                 return 3;
  81.                 }
  82.                 else if(key4 == 0)
  83.                 {
  84.                         delay(2000);
  85.                         if(key4 == 0)
  86.                                 return 4;
  87.                 }
  88.         }
  89. }

  90. void guize()
  91. {
  92.                 if(Time[6] >= 60)//秒
  93.                 {
  94.                         Time[6] = 0;
  95.                         Time[5] += 1;
  96.                 }
  97.                 if(Time[5] >= 60)//分
  98.                 {
  99.                         Time[5] = 0;
  100.                         Time[4] += 1;
  101.                 }
  102.                 if(Time[4] >= 24)//时
  103.                 {
  104.                         Time[4] = 0;
  105.                         Time[3] += 1;
  106.                 }
  107.                 if(Time[3] >= 29)//日
  108.                 {
  109.                         if((Time[2] == 1) || (Time[2] == 3) || (Time[2] == 5) || (Time[2] == 7) || (Time[2] == 8) || (Time[2] == 10) || (Time[2] == 12))//31天数月
  110.                         {
  111.                                 if(Time[3] > 31)
  112.                                 {
  113.                                         Time[3] = 0;
  114.                                         Time[2] += 1;
  115.                                 }
  116.                         }
  117.                         else if((Time[2] == 4) || (Time[2] == 6) || (Time[2] == 9) || (Time[2] == 11))//30天数月
  118.                         {
  119.                                 if(Time[3] > 30)
  120.                                 {
  121.                                         Time[3] = 0;
  122.                                         Time[2] += 1;
  123.                                 }
  124.                         }
  125.                         else                //2月
  126.                         {
  127.                                 if((Time[0] * 100 + Time[1])/4 == 0)//闰年
  128.                                 {
  129.                                         if(Time[3] > 29)
  130.                                         {
  131.                                                 Time[3] = 0;
  132.                                                 Time[2] += 1;
  133.                                         }
  134.                                 }
  135.                                 else                //平年
  136.                                 {
  137.                                         Time[3] = 0;
  138.                                         Time[2] += 1;
  139.                                 }
  140.                         }
  141.                 }
  142.                 if(Time[2] > 12)//月
  143.                 {
  144.                         Time[2] = 0;
  145.                         Time[1] += 1;
  146.                 }
  147.                 if(Time[1] > 99)//年后两位
  148.                 {
  149.                         Time[1] = 0;
  150.                         Time[0] += 1;
  151.                 }
  152.                 if(Time[0] > 99)//年前两位
  153.                 {
  154.                         Time[0] = 0;
  155.                 }

  156. }

  157. void duang0()interrupt 0
  158. {
  159.         uint8 k = 0, x = 0, y = 0, i;
  160.         delay(100000000);
  161.         wrc(0x0f);//开启光标
  162.         wrc(0x02);//初始化光标位置
  163.         while(k != 3)
  164.         {
  165.                 k = key();
  166.                 switch(k)
  167.                 {
  168.                         case 1:
  169.                                 if(y == 0)
  170.                                 {
  171.                                         if(x == 3 || x == 5)
  172.                                         {
  173.                                                 wrc(0x14);
  174.                                                 wrc(0x14);
  175.                                                 x++;
  176.                                         }
  177.                                         else if(x == 7)
  178.                                         {
  179.                                                 for(i = 55; i > 0; i--)
  180.                                                 {
  181.                                                         wrc(0x14);
  182.                                                 }
  183.                                                 x = 0;
  184.                                                 y = 1;
  185.                                         }
  186.                                         else
  187.                                         {
  188.                                                 wrc(0x14);
  189.                                                 x++;
  190.                                         }
  191.                                 }
  192.                                 else
  193.                                 {
  194.                                         if(x == 1 || x == 3)
  195.                                         {
  196.                                                 wrc(0x14);
  197.                                                 wrc(0x14);
  198.                                                 x++;
  199.                                         }
  200.                                         else if(x == 5)
  201.                                         {
  202.                                                 for(i = 57; i > 0; i--)
  203.                                                 {
  204.                                                         wrc(0x14);
  205.                                                 }
  206.                                                 x = 0;
  207.                                                 y = 0;
  208.                                         }
  209.                                         else
  210.                                         {
  211.                                                 wrc(0x14);
  212.                                                 x++;
  213.                                         }
  214.                                 }
  215.                                 break;
  216.                         case 2:
  217.                                 if(y == 0)
  218.                                 {
  219.                                         if(x == 4 || x== 6)
  220.                                         {
  221.                                                 wrc(0x10);
  222.                                                 wrc(0x10);
  223.                                                 x--;
  224.                                         }
  225.                                         else if(x == 0)
  226.                                         {
  227.                                                 for(i = 57; i > 0; i--)
  228.                                                         wrc(0x10);
  229.                                                 x = 5;
  230.                                                 y = 1;
  231.                                         }
  232.                                         else
  233.                                         {
  234.                                                 wrc(0x10);
  235.                                                 x--;
  236.                                         }
  237.                                 }
  238.                                 else
  239.                                 {
  240.                                         if(x == 2 || x == 4)
  241.                                         {
  242.                                                 wrc(0x10);
  243.                                                 wrc(0x10);
  244.                                                 x--;
  245.                                         }
  246.                                         else if(x == 0)
  247.                                         {
  248.                                                 for(i = 55; i > 0; i--)
  249.                                                         wrc(0x10);
  250.                                                 x = 7;
  251.                                                 y = 0;
  252.                                         }
  253.                                         else
  254.                                         {
  255.                                                 wrc(0x10);
  256.                                                 x--;
  257.                                         }
  258.                                 }
  259.                                 break;
  260.                         case 4:
  261.                                 if(y == 0)
  262.                                 {
  263.                                         if(x == 0)
  264.                                                 Time[0] += 10;
  265.                                         else if(x == 1)
  266.                                                 Time[0] += 1;
  267.                                         else if(x == 2)
  268.                                                 Time[1] += 10;
  269.                                         else if(x == 3)
  270.                                                 Time[1] += 1;
  271.                                         else if(x == 4)
  272.                                                 Time[2] += 10;
  273.                                         else if(x == 5)
  274.                                                 Time[2] += 1;
  275.                                         else if(x == 6)
  276.                                                 Time[3] += 10;
  277.                                         else if(x == 7)
  278.                                                 Time[3] += 1;
  279.                                 }
  280.                                 else
  281.                                 {
  282.                                         if(x == 0)
  283.                                                 Time[4] += 10;
  284.                                         else if(x == 1)
  285.                                                 Time[4] += 1;
  286.                                         else if(x == 2)
  287.                                                 Time[5] += 10;
  288.                                         else if(x == 3)
  289.                                                 Time[5] += 1;
  290.                                         else if(x == 4)
  291.                                                 Time[6] += 10;
  292.                                         else if(x == 5)
  293.                                                 Time[6] += 1;
  294.                                 }
  295.                                 guize();
  296.                                 display();
  297.                                 if(y == 0)
  298.                                 {
  299.                                         switch(x)
  300.                                         {
  301.                                                 case 0:
  302.                                                         wrc(0x80|0x00);
  303.                                                         break;
  304.                                                 case 1:
  305.                                                         wrc(0x80|0x01);
  306.                                                         break;
  307.                                                 case 2:
  308.                                                         wrc(0x80|0x02);
  309.                                                         break;
  310.                                                 case 3:
  311.                                                         wrc(0x80|0x03);
  312.                                                         break;
  313.                                                 case 4:
  314.                                                         wrc(0x80|0x05);
  315.                                                         break;
  316.                                                 case 5:
  317.                                                         wrc(0x80|0x06);
  318.                                                         break;
  319.                                                 case 6:
  320.                                                         wrc(0x80|0x08);
  321.                                                         break;
  322.                                                 case 7:
  323.                                                         wrc(0x80|0x09);
  324.                                                         break;
  325.                                                 default:break;
  326.                                         }
  327.                                 }
  328.                                 else
  329.                                 {
  330.                                         switch(x)
  331.                                         {
  332.                                                 case 0:
  333.                                                         wrc(0x80|0x40);break;
  334.                                                 case 1:
  335.                                                         wrc(0x80|0x41);break;
  336.                                                 case 2:
  337.                                                         wrc(0x80|0x43);break;
  338.                                                 case 3:
  339.                                                         wrc(0x80|0x44);break;
  340.                                                 case 4:
  341.                                                         wrc(0x80|0x46);break;
  342.                                                 case 5:
  343.                                                         wrc(0x80|0x47);break;
  344.                                                 default:break;
  345.                                         }
  346.                                 }
  347.                                
  348.                                 break;
  349.                         default: break;
  350.                 }
  351.         }
  352.        
  353.         wrc(0x0c);
  354. }

  355. void duang1()interrupt 1
  356. {
  357.         n += 1;
  358.         if(n == 20)
  359.         {       
  360.                 Time[6] += 1;
  361.                 n = 0;
  362.         }
  363.         TH0 = (65535 - 46083) / 256;//延时50ms
  364.         TL0 = (65535 - 46083) % 256;
  365. }
复制代码



万年历时钟仿真电路图.PNG (61.04 KB, 下载次数: 25)

万年历时钟仿真电路图.PNG
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:618543 发表于 2019-10-3 15:07 | 只看该作者
楼主能对代码做一些说明么?谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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