单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 997|回复: 5
收起左侧

LCD1602显示可调时钟+protues仿真

[复制链接]
lzDestiny 发表于 2018-10-6 16:14 | 显示全部楼层 |阅读模式
LCD1602显示可调时钟+protues仿真,心新学lcd1602的可以借鉴一下,大佬请绕道,欢迎指错

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. uchar a,count,S1num,xqnum;
  5. char yue,ri,shi,fen,miao;
  6. int nian;

  7. sbit lcdrs=P2^0;
  8. sbit lcdrw=P2^1;
  9. sbit lcden=P2^2;

  10. sbit S1=P2^4;                                //定义键——进入设置
  11. sbit S2=P2^5;                                //定义键——增大
  12. sbit S3=P2^6;                                //定义键——减小
  13. sbit S4=P2^7;                                //定义键——退出设置

  14. uchar code table0[]="2018-10-6 FRI";
  15. uchar code table1[]="00:00:00";
  16. uchar code xingqi[][3]={"MON","TUE","WED","THU","FRI","SAT","SUN"};

  17. void delay(uint z)                                                         //延时1ms的程序
  18. {
  19.         uint x,y;
  20.         for(x=z;x>0;x--)
  21.                 for(y=110;y>0;y--);
  22. }
  23. /**************************************************
  24. 1602液晶显示器模块
  25. sbit lcdrs=P2^5;
  26. sbit lcdrw=P2^4;
  27. sbit lcden=P2^3;
  28. *************************************************/
  29. void write_com(uchar com)                                        //液晶写指令
  30. {
  31.         lcdrw=0;
  32.         lcdrs=0;
  33.         P0=com;
  34.         delay(5);
  35.         lcden=1;
  36.         delay(5);
  37.         lcden=0;
  38. }

  39. void write_data(uchar dat)                                        //液晶写数据
  40. {
  41.         lcdrw=0;
  42.         lcdrs=1;
  43.         P0=dat;
  44.         delay(5);
  45.         lcden=1;
  46.         delay(5);
  47.         lcden=0;
  48. }
  49. /********************************************
  50. 年月日写入1602函数
  51. ********************************************/
  52. void write_sfm(uchar add,uchar dat)                           //写时分秒函数
  53. {
  54.         uchar shi,ge;
  55.         shi=dat/10;
  56.         ge=dat%10;
  57.         write_com(0x80+0x40+add);
  58.         write_data(0x30+shi);
  59.         write_data(0x30+ge);
  60. }
  61. void write_yr(uchar add,uchar dat)                           //写月日函数
  62. {
  63.         uchar shi,ge;
  64.         shi=dat/10;
  65.         ge=dat%10;
  66.         write_com(0x80+add);
  67.         write_data(0x30+shi);
  68.         write_data(0x30+ge);
  69. }
  70. void write_nian(uchar add,uint dat)                           //写年函数
  71. {
  72.         uint qian,bai,shi,ge;
  73.         qian=dat/1000;
  74.         bai=dat%1000/100;
  75.         shi=dat%100/10;
  76.         ge=dat%10;
  77.         write_com(0x80+add);
  78.         write_data(0x30+qian);
  79.         write_data(0x30+bai);
  80.         write_data(0x30+shi);
  81.         write_data(0x30+ge);
  82. }
  83. /***************************************************
  84. 初始化
  85. ***************************************************/
  86. void init_lcd()                                                          //液晶初始化
  87. {
  88.         lcden=0;

  89.         nian=2014;
  90.         yue=8;
  91.         ri=13;
  92.         shi=0;                                                                   //初始shi、fen、miao
  93.         fen=0;
  94.         miao=0;

  95.         write_com(0x38);                                           //设置16x2显示,5x7点阵,8位数据口
  96.         write_com(0x0c);                                           //设置开显示,不显示光标
  97.         write_com(0x06);                                           //写一个字符后地址指针加1
  98.         write_com(0x01);                                           //显示清0,数据指针清0
  99. }

  100. void init()                                                                        //初始化函数
  101. {
  102.         init_lcd();                                                                 //液晶初始化
  103.         write_com(0x80);                                                  //设置显示初始坐标
  104.         for(a=0;a<14;a++)                                                   //显示年月日初始值
  105.         {
  106.                 write_data(table0[a]);
  107.                 delay(5);
  108.         }
  109.         write_com(0x80+0x40);                                           //设置显示初始坐标
  110.         for(a=0;a<8;a++)                                                        //显示时分秒初始值
  111.         {
  112.                 write_data(table1[a]);                                       
  113.                 delay(5);
  114.         }

  115.         write_nian(0,nian);
  116.         write_sfm(6,miao);                                                         //分别将shi、fen、miao送去液晶显示
  117.         write_sfm(3,fen);
  118.         write_sfm(0,shi);

  119.         count=0;
  120.         xqnum=0;
  121.         S1num=0;                                                                         //初始化全局变量count

  122.         TMOD=0x01;                                                                          //设置定时器0工作模式1
  123.         TH0=(65535-50000)/256;                                                  //定时器装初始值
  124.         TL0=(65535-50000)%256;
  125.         EA=1;                                                                                        //开总中断
  126.         ET0=1;                                                                                        //开定时器0中断
  127.         TR0=1;                                                                                        //启动定时器0
  128. }
  129. /**************************************************
  130. 独立键盘
  131. sbit S1=P3^0;                                //定义键——进入设置
  132. sbit S2=P3^1;                                //定义键——增大
  133. sbit S3=P3^2;                                //定义键——减小
  134. sbit S4=P3^3;                                //定义键——退出设置
  135. 独立键盘已接地
  136. *************************************************/
  137. void keyscan()
  138. {
  139.         if(S1==0)
  140.         {
  141.                 delay(5);                                        //确认定义键被按下
  142.                 if(S1==0)
  143.                 {
  144.                         S1num++;                                //定义键S1按下次数记录
  145.                         while(!S1);                                //释放按键确认
  146.                         if(S1num==1)                        //S1按下一次时
  147.                         {
  148.                                 TR0=0;                                //关闭定时器
  149.                                 write_com(0xc0+7);        //光标定位到秒位置
  150.                                 write_com(0x0f);        //光标闪烁
  151.                         }
  152.                         if(S1num==2)                         //S1按下两次时
  153.                         {
  154.                                 write_com(0xc0+4);         //光标定位到分位置
  155.                         }
  156.                         if(S1num==3)                          //S1按下三次时
  157.                         {
  158.                                 write_com(0xc0+1);          //光标定位到时位置
  159.                         }
  160.                         if(S1num==4)                          //S1按下四次时
  161.                         {
  162.                                 write_com(0x80+13);          //光标定位到星期位置
  163.                         }
  164.                         if(S1num==5)                          //S1按下五次时
  165.                         {
  166.                                 write_com(0x80+9);          //光标定位到日位置
  167.                         }
  168.                         if(S1num==6)                          //S1按下六次时
  169.                         {
  170.                                 write_com(0x80+6);          //光标定位到月位置
  171.                         }
  172.                         if(S1num==7)                          //S1按下七次时
  173.                         {
  174.                                 write_com(0x80+3);          //光标定位到年位置
  175.                         }
  176.                         if(S1num==8)                          //S1按下八次时
  177.                         {
  178.                                 S1num=0;                          //S1记录按键次数清零
  179.                                 TR0=1;                                  //开启定时器
  180.                                 write_com(0x0c);          //取消光标闪烁
  181.                         }
  182.                 }
  183.         }
  184.         if(S1num!=0)                                           //只有定义键按下后S2、S3、S4才有效
  185.         {
  186.                 if(S2==0)
  187.                 {
  188.                         delay(5);                                        //防抖
  189.                         if(S2==0)                                   //确认按键被按下
  190.                         {
  191.                                 while(!S2);                                //释放按键确认
  192.                                 if(S1num==1)                        //S1按下一次时
  193.                                 {
  194.                                         miao++;                                //调整秒加1
  195.                                         if(miao==60)                //满60清零
  196.                                                 miao=0;
  197.                                         write_sfm(6,miao);                   //每调节一次送液晶显示一次
  198.                                         write_com(0x80+0x40+6);           //显示位置重新回到调节处
  199.                                 }
  200.                                 if(S1num==2)                           //S1按下两次时
  201.                                 {
  202.                                         fen++;                                        //调整分加1
  203.                                         if(fen==60)
  204.                                                 fen=0;
  205.                                         write_sfm(3,fen);
  206.                                         write_com(0x80+0x40+3);
  207.                                 }
  208.                                 if(S1num==3)                                 //S1按下三次时
  209.                                 {
  210.                                         shi++;                                          //调整时加1
  211.                                         if(shi==24)
  212.                                                 shi=0;
  213.                                         write_com(0x80+0x40);
  214.                                         write_sfm(0,shi);
  215.                                 }
  216.                                 if(S1num==4)                                                   //星期加调整
  217.                                 {
  218.                                         xqnum++;
  219.                                         if(xqnum==7)
  220.                                                 xqnum=0;
  221.                                         write_com(0x80+0x0b);
  222.                                         for(a=0;a<3;a++)
  223.                                         {
  224.                                                 write_data(xingqi[xqnum][a]);
  225.                                                 delay(5);
  226.                                         }
  227.                                 }
  228.                                 if(S1num==5)                                                                //日加调整
  229.                                 {
  230.                                         ri++;
  231.                                         if(yue==2)
  232.                                         {
  233.                                                 if(nian%4==0&&nian%100!=0||nian%400==0)
  234.                                                 {
  235.                                                         if(ri==30)
  236.                                                         {
  237.                                                                 ri=1;
  238.                                                         }
  239.                                                 }
  240.                                                 if(nian%400!=0)
  241.                                                 {
  242.                                                         if(ri==29)
  243.                                                         {
  244.                                                                 ri=1;
  245.                                                         }
  246.                                                 }
  247.                                         }
  248.                                         else if(yue<=7)
  249.                                         {
  250.                                                 if(yue%2==0&yue!=2)
  251.                                                 {
  252.                                                         if(ri==31)
  253.                                                         {
  254.                                                                 ri=1;
  255.                                                         }
  256.                                                 }
  257.                                                 else if(yue%2!=0&yue!=2)
  258.                                                 {
  259.                                                         if(ri==32)
  260.                                                         {
  261.                                                                 ri=1;
  262.                                                         }
  263.                                                 }
  264.                                         }
  265.                                         else if(yue>=8)
  266.                                         {
  267.                                                 if(yue%2==0)
  268.                                                 {
  269.                                                         if(ri==32)
  270.                                                         {
  271.                                                                 ri=1;
  272.                                                         }
  273.                                                 }
  274.                                                 else if(yue%2!=0)
  275.                                                 {
  276.                                                         if(ri==31)
  277.                                                         {
  278.                                                                 ri=1;
  279.                                                         }
  280.                                                 }
  281.                                         }
  282.                                         write_yr(8,ri);
  283.                                 }
  284.                                 if(S1num==6)                                                        //月加调整
  285.                                 {
  286.                                         yue++;
  287.                                         if(yue==13)
  288.                                                 yue=1;
  289.                                         write_yr(5,yue);
  290.                                 }                                                                                 
  291.                                 if(S1num==7)                                                 //年加调整
  292.                                 {
  293.                                         nian++;
  294.                                         if(nian==2019)
  295.                                                 nian=2014;
  296.                                         write_nian(0,nian);
  297.                                 }
  298.                         }
  299.                 }
  300.                 if(S3==0)
  301.                 {
  302.                         delay(5);
  303.                         if(S3==0)                                                 //确认按键被按下
  304.                         {
  305.                                 while(!S3);
  306.                                 if(S1num==1)                                 
  307.                                 {
  308.                                         miao--;                                          //调整秒减1
  309.                                         if(miao==-1)                          //减到00后再减重新设置为59
  310.                                                 miao=59;
  311.                                         write_sfm(6,miao);
  312.                                         write_com(0x80+0x40+6);
  313.                                 }
  314.                                 if(S1num==2)
  315.                                 {
  316.                                         fen--;                                           //调整分减1
  317.                                         if(fen==-1)
  318.                                                 fen=59;
  319.                                         write_sfm(3,fen);
  320.                                         write_com(0x80+0x40+3);
  321.                                 }
  322.                                 if(S1num==3)
  323.                                 {
  324.                                         shi--;                                                //调整时减1
  325.                                         if(shi==-1)
  326.                                                 shi=23;
  327.                                         write_sfm(0,shi);
  328.                                         write_com(0x80+0x40);
  329.                                 }
  330.                                 if(S1num==4)
  331.                                 {
  332.                                         xqnum--;                                        //调整星期减一
  333.                                         if(xqnum==-1)
  334.                                                 xqnum=6;
  335.                                         write_com(0x80+0x0b);
  336.                                         for(a=0;a<3;a++)
  337.                                         {
  338.                                                 write_data(xingqi[xqnum][a]);
  339.                                                 delay(5);
  340.                                         }
  341.                                 }
  342.                                 if(S1num==5)                                   //调整日
  343.                                 {
  344.                                         ri--;                                                
  345.                                         if(yue==2)
  346.                                         {
  347.                                                 if(nian%400==0)
  348.                                                 {
  349.                                                         if(ri==0)
  350.                                                         {
  351.                                                                 ri=29;
  352.                                                         }
  353.                                                 }
  354.                                                 if(nian%400!=0)
  355.                                                 {
  356.                                                         if(ri==0)
  357.                                                         {
  358.                                                                 ri=28;
  359.                                                         }
  360.                                                 }
  361.                                         }
  362.                                         else if(yue==4|6|9|11)                                 
  363.                                         {               
  364.                                                 if(yue%2==0&yue!=2)
  365.                                                 {
  366.                                                         if(ri==0)
  367.                                                         {
  368.                                                                 ri=30;
  369.                                                         }
  370.                                                 }
  371.                                                 else if(yue%2!=0&yue!=2)
  372.                                                 {
  373.                                                         if(ri==0)
  374.                                                         {
  375.                                                                 ri=31;
  376.                                                         }
  377.                                                 }
  378.                                         }
  379.                                         else if(yue>=8)
  380.                                         {                                                                        
  381.                                                                                         if(yue%2==0)
  382.                                                 {
  383.                                                         if(ri==0)
  384.                                                         {
  385.                                                                 ri=31;
  386.                                                         }
  387.                                                 }
  388.                                                 else if(yue%2!=0)
  389.                                                 {
  390.                                                         if(ri==0)
  391.                                                         {
  392.                                                                 ri=30;
  393.                                                         }
  394.                                                 }
  395.                                         }
  396.                                         write_yr(8,ri);                                                
  397.                                 }
  398.                                 if(S1num==6)                                           //调整月
  399.                                 {
  400.                                         yue--;
  401.                                         if(yue==0)
  402.                                                 yue=12;
  403.                                         write_yr(5,yue);
  404.                                 }
  405.                                 if(S1num==7)                                          //调整年
  406.                                 {
  407.                                         nian--;
  408.                                         if(nian==2013)
  409.                                                 nian=2018;
  410.                                         write_nian(0,nian);
  411.                                 }
  412.                         }
  413.                 }
  414.                 if(S4==0)                                                                   //退出设置、开启中断
  415.                 {
  416.                         delay(5);
  417.                         if(S4==0)
  418.                         {
  419.                                 S1num=0;
  420.                                 TR0=1;
  421.                                 write_com(0x0c);
  422.                         }
  423.                 }
  424.         }
  425. }
  426. /**************************************************
  427. 定时器0
  428. *************************************************/
  429. void timer0() interrupt 1                                         //定时器0中断服务程序
  430. {
  431.         TH0=(65535-50000)/256;                                         //重装定时器初始值
  432.         TL0=(65535-50000)%256;
  433.         count++;                                                                  //中断次数累加
  434.         
  435. }
  436. /*************************************************
  437. 主函数
  438. *************************************************/
  439. void main()
  440. {
  441.         init();
  442.         while(1)
  443.         {
  444.                 keyscan();
  445.                 if(count==20)                                                         //20次50毫秒即一秒
  446.         {
  447.                 count=0;
  448.                 miao++;
  449.                 if(miao==60)                                                  //秒加到60时分进位
  450.                 {
  451.                         miao=0;
  452.                         fen++;
  453.                         if(fen==60)                                                  //分加到60时时进位
  454.                         {
  455.                                 fen=0;
  456.                                 shi++;
  457.                                 if(shi==24)                                                //时加到24时清0
  458.                                 {
  459.                                         shi=0;
  460.                                         xqnum++;
  461.                                         ri++;

  462.                                         if(yue==2)                                        //如果是二月
  463.                                         {
  464.                                                 if(nian%400==0)                         //闰年判断
  465.                                                 {
  466.                                                         if(ri==30)
  467.                                                         {
  468.                                                                 ri=1;
  469.                                                                 yue++;
  470.                                                                 write_yr(5,yue);
  471.                                                         }
  472.                                                 }
  473.                                                 if(nian%400!=0)                           //平年判断
  474.                                                 {
  475.                                                         if(ri==29)
  476.                                                         {
  477.                                                                 ri=1;
  478.                                                                 yue++;
  479.                                                                 write_yr(5,yue);
  480.                                                         }
  481.                                                 }
  482.                                         }
  483.                                         else if(yue<=7&yue!=2)           //一月到七月
  484.                                         {
  485.                                                 if(yue%2==0)                //偶数月(除二月)
  486.                                                 {
  487.                                                         if(ri==31)                                          
  488.                                                         {
  489.                                                                 ri=1;
  490.                                                                 yue++;
  491.                                                         }
  492.                                                 }
  493.                                                 else if(yue%2!=0)                         //奇数月
  494.                                                 {
  495.                                                         if(ri==32)
  496.                                                         {
  497.                                                                 ri=1;
  498.                                                                 yue++;
  499.                                                         }
  500.                                                 }
  501.                                                 write_yr(5,yue);
  502.                                         }
  503.                                         else if(yue>=8)                                         //八月到12月
  504.                                         {
  505.                                                 if(yue%2==0)                //偶数月(除二月)
  506.                                                 {
  507.                                                         if(ri==32)                                          
  508.                                                         {
  509.                                                                 ri=1;
  510.                                                                 yue++;
  511.                                                                 if(yue==13)                                   //如果判断月份为12月,则加一后重新定义月份为1
  512.                                                                 {
  513.                                                                         yue=1;
  514.                                                                         nian++;
  515.                                                                         write_nian(0,nian);
  516.                                                                 }
  517.                                                                 write_yr(5,yue);
  518.                                                         }
  519.                                                 }
  520.                                                 else if(yue%2!=0)                         //奇数月
  521.                                                 {
  522.                                                         if(ri==31)
  523.                                                         {
  524.                                                                 ri=1;
  525.                                                                 yue++;
  526.                                                                 write_yr(5,yue);
  527.                                                         }
  528.                                                 }
  529.                                         }
  530.                                         write_yr(8,ri);

  531.                                         if(xqnum==7)                                        //星期写入
  532.                                                 xqnum=0;
  533.                                         write_com(0x80+0x0b);
  534.                                         for(a=0;a<3;a++)
  535.                                         {
  536.                                                 write_data(xingqi[xqnum][a]);
  537.                                                 delay(5);
  538.                                         }
  539.                                 }
  540.                                 write_sfm(0,shi);                                //重新写入数据
  541.                         }
  542.                         write_sfm(3,fen);                                        //重新写入数据
  543.                 }
  544.                 write_sfm(6,miao);                                                //重新写入数据
  545.         }                                                                               //不停的检测按键是否被按下
  546.         }
  547. }

复制代码

所有资料51hei提供下载:
LCD时钟设计.zip (29.79 KB, 下载次数: 60)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

zhaozhenrong 发表于 2018-10-15 10:37 | 显示全部楼层
z这个可以有,谢谢!
回复

使用道具 举报

gzxgzx 发表于 2018-11-15 09:06 | 显示全部楼层
zhaozhenrong 发表于 2018-10-15 10:37
z这个可以有,谢谢!

这是对的吗?
回复

使用道具 举报

gzxgzx 发表于 2018-11-15 10:31 | 显示全部楼层
感谢大哥
回复

使用道具 举报

不二lqh 发表于 2018-11-15 17:08 | 显示全部楼层
仿真可以,但在keil里运行会报错,显示找不到文件
回复

使用道具 举报

zmalqp1331 发表于 2018-12-19 15:34 | 显示全部楼层
先下一个试试,谢谢了
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51hei电子论坛2群 联系QQ:125739409;技术交流QQ群219535678

Powered by 单片机教程网

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