找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1898|回复: 0
收起左侧

LCD1602可调式电子时钟代码

[复制链接]
ID:408735 发表于 2021-4-14 22:34 | 显示全部楼层 |阅读模式
SC89C51

单片机源程序如下:
  1. /* k1,k2,k3,k4分别接P3.0,P3.1,P3.2,P3.3
  2.         分别控制秒加,分加,时加,选择确认端
  3.         先按k4进行时间调整选择,调整好后在按下k4确认 */
  4. //注意:LED点阵模块的J1短接片要短接到VCC端

  5. #include<reg52.h>
  6. typedef unsigned char uint8;
  7. typedef unsigned int uint16;
  8. sbit rs=P2^6;         // 数据命令选择
  9. sbit rw=P2^5;         //读写选择
  10. sbit e=P2^7;          //使能
  11. sbit k1=P3^0;        //秒加
  12. sbit k2=P3^1;        //分加
  13. sbit k3=P3^2;  //时加
  14. sbit k4=P3^3;  //确定/选择
  15. uint8 a[]="LCD Design of Tm";  //要显示的字符
  16. uint8 num[]="0123456789";
  17. uint8 b[8],shi,fen,miao;
  18. uint8 timeset;
  19. uint8 sum;

  20. void delay(uint16 i)
  21. {
  22.         while(i--);
  23. }
  24. void wrc(uint8 c)         //写命令
  25. {
  26.         delay(1000);
  27.         rs=0;
  28.         rw=0;
  29.         e=0;
  30.         P0=c;
  31.         e=1;
  32.         delay(10);
  33.         e=0;
  34.         /*
  35.         P0=c<<4;
  36.         e=1;
  37.         e=0;*/       //四位的LCD要加上
  38. }
  39. void wrd(uint8 dat)          //写数据
  40. {
  41.         delay(1000);
  42.         rs=1;
  43.         rw=0;
  44.         e=0;
  45.         P0=dat;
  46.         e=1;
  47.         delay(10);
  48.         e=0;
  49.         /*
  50.         P0=dat<<4;
  51.         e=1;
  52.         e=0;*/           //四位的LCD要加上
  53.         rs=0;
  54. }
  55. void lcdinit()
  56. {
  57.         delay(1000);
  58. /*        wrc(0x32);         
  59.         wrc(0x28);
  60.         wrc(0x28);        */        //四位的LCD要加上
  61.         wrc(0x38);
  62.         wrc(0x38);
  63.         wrc(0x38);
  64.         wrc(0x06);
  65.         wrc(0x0c);
  66.         wrc(0x01);
  67. }
  68. void time0init()
  69. {
  70.         TMOD=0X01;
  71.         TH0=0XFC;
  72.         TL0=0X18; //1ms
  73.         TR0=1;
  74.         ET0=1;
  75.         EA=1;
  76. }
  77. void int0init()
  78. {
  79.         EA=1;
  80.         EX0=1;
  81.         IT0=1;       
  82. }
  83. void int1init()
  84. {
  85.         EA=1;
  86.         EX1=1;
  87.         IT1=1;       
  88. }
  89. void timepros()
  90. {
  91.         b[0]=num[shi/10];
  92.         b[1]=num[shi%10];
  93.         b[2]=0x3a;
  94.         b[3]=num[fen/10];
  95.         b[4]=num[fen%10];
  96.         b[5]=0x3a;
  97.         b[6]=num[miao/10];
  98.         b[7]=num[miao%10];
  99. }
  100. void display()
  101. {
  102.         uint8 i;
  103.         timepros();
  104.         wrc(0x00+0x80);
  105.         for(i=0;i<16;i++)
  106.         {
  107.                 wrd(a[i]);
  108.         }
  109.         wrc(0x44+0x80);
  110.         wrd(b[0]);
  111.         wrd(b[1]);
  112.         wrd(b[2]);
  113.         wrd(b[3]);
  114.         wrd(b[4]);
  115.         wrd(b[5]);
  116.         wrd(b[6]);
  117.         wrd(b[7]);
  118. }
  119. void main()
  120. {
  121.         lcdinit();
  122.         time0init();
  123.         int1init();
  124.         while(1)
  125.         {
  126.                 if(timeset==1)                //可以调整时间
  127.                 {
  128.                         if(k1==0)                //秒设置
  129.                         {
  130.                                 delay(1000);
  131.                                 if(k1==0)
  132.                                 {       
  133.                                         miao++;
  134.                                         if(miao==60)miao=0;
  135.                                 }
  136.                                 while(!k1);
  137.                         }
  138.                         if(k2==0)                //分设置
  139.                         {
  140.                                 delay(1000);
  141.                                 if(k2==0)
  142.                                 {
  143.                                         fen++;
  144.                                         if(fen==60)fen=0;
  145.                                 }
  146.                                 while(!k2);       
  147.                         }
  148.                         if(k3==0)                //时设置
  149.                         {
  150.                                 delay(1000);
  151.                                 if(k3==0)
  152.                                 {
  153.                                         shi++;
  154.                                         if(shi==60)shi=0;
  155.                                 }
  156.                                 while(!k3);       
  157.                         }
  158.                 }
  159.                 display();
  160.         }       
  161. }
  162. void tim0() interrupt 1
  163. {
  164.         static uint16 n;
  165.         TH0=0XFC;
  166.         TL0=0X18;//1ms
  167.         n++;
  168.         if(n==1000)
  169.         {
  170.                 n=0;
  171.                 miao++;
  172.                 if(miao==60)
  173.                 {
  174.                         miao=0;
  175.                         fen++;
  176.                         if(fen==60)
  177.                         {
  178.                                 fen=0;
  179.                                 shi++;
  180.                                 if(shi==60)
  181.                                 {
  182.                                         shi=0;
  183.                                         miao=0;
  184.                                         fen=0;
  185.                                 }
  186.                         }
  187.                 }
  188.         }
  189. }

  190. void int1() interrupt 2
  191. {
  192.         delay(1000);
  193.         if(k4==0)
  194.         {
  195.                 sum++;
  196.                 if(sum==1)
  197.                 {
  198.                         TR0=0;
  199.                         timeset=1;       
  200.                 }
  201.                 if(sum==2)
  202.                 {
  203.                         TR0=1;
  204.                         timeset=0;
  205.                         sum=0;
  206.                 }
  207.         }
  208. }
复制代码

hex文件51hei提供下载:
可调式电子钟设计.zip (30.25 KB, 下载次数: 12)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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