找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机1602电子时钟加按键灯程序

[复制链接]
跳转到指定楼层
楼主
用1602显示时间
单片机内部定时器计数
按键控制台灯
蓝牙控制台灯



  1. //用51单片机仅更换头文件即可套用
  2. #include <STC12C5A60S2.H>
  3. #include<intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6.         
  7. void UsartConfiguration();

  8. sbit k = P2^4;                                //开灯
  9. sbit led = P1^0;                                //led灯
  10. sbit EP = P2^7; //使能端
  11. sbit RW = P2^5; //数据/命令选择端
  12. sbit RS = P2^6; //读写选择端
  13. sbit KEY_1 = P3^2;          //按键设置模式选择
  14. sbit KEY_2 = P3^3;          //按键

  15. static uint code table1[] = {0, 31, 60, 91, 121, 152,182, 213, 243, 274, 304, 335};
  16. static uchar code *Week[7] = {"Sun","Mon","Tue" ,"Wed", "Thu", "Fri", "Sat"};
  17. uchar sec = 0, hour = 12, minu = 0;
  18. uchar count = 0, week = 0; month = 1, day = 1;
  19. uint a,num;

  20. void InitTimer0()
  21. {
  22.         ET0 = 1;
  23.         TMOD = 0x21;
  24.         TH0 = (65536 - 46071)/256;
  25.         TL0 = (65536 - 46071)%256;
  26.         TR0 = 1;
  27. }

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


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

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

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

  65. }

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

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

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

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

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

  234. void KeyScan()
  235. {
  236.                 static uchar key1cnt = 0;                //KEY_1按下的次数
  237.                
  238.                 if(KEY_1 == 0)
  239.                 {
  240.                         delay(10);
  241.                         if(KEY_1 == 0)
  242.                         {
  243.                                         key1cnt++;
  244.                                         while(!KEY_1);
  245.                                         switch(key1cnt)
  246.                                         {
  247.                                                 case 1:
  248.                                                                                 TR0 = 0;
  249.                                                                                 Write_Cmd(0x80 + 0x40 + 5);
  250.                                                                                 Write_Cmd(0x0F);            //显示光标且光标闪烁
  251.                                                                                 break;
  252.                                                 case 2:
  253.                                                                                 Write_Cmd(0x80 + 0x40 + 8);        
  254.                                                                                 break;
  255.                                                 case 3:
  256.                                                                                 Write_Cmd(0x80 + 0x40 + 11);        
  257.                                                                                 break;
  258.                                                 case 4:
  259.                                                                                 Write_Cmd(0x80 + 7);
  260.                                                                                 break;
  261.                                                 case 5:
  262.                                                                                 Write_Cmd(0x80 + 10);
  263.                                                                                 break;
  264.                                                 case 6:
  265.                                                                                 TR0 = 1;
  266.                                                                                 Write_Cmd(0x0C);           //不显示光标
  267.                                                                                 key1cnt = 0;
  268.                                                                                 break;
  269.                                         }
  270.                         }
  271.                 }
  272.                 if(key1cnt != 0)
  273.                 {
  274.                         if(KEY_2 == 0)
  275.                         {
  276.                                 delay(10);
  277.                                 if(KEY_2 == 0)
  278.                                 {
  279.                                         while(!KEY_2);
  280.                                         switch(key1cnt)
  281.                                         {
  282.                                                 case 1:
  283.                                                                                 hour++;
  284.                                                                                 if(hour == 24)
  285.                                                                                                                 hour = 0;
  286.                                                                                 Write_Num(4, 1, hour);
  287.                                                                                 Write_Cmd(0x80 + 0x40 + 5);
  288.                                                                                 break;
  289.                                                 case 2:
  290.                                                                                 minu++;
  291.                                                                                 if(minu == 60)
  292.                                                                                                                 minu = 0;
  293.                                                                                 Write_Num(7, 1, minu);
  294.                                                                                 Write_Cmd(0x80 + 0x40 + 8);
  295.                                                                                 break;
  296.                                                 case 3:
  297.                                                                                 sec++;
  298.                                                                                 if(sec == 60)
  299.                                                                                                                 sec = 0;
  300.                                                                                 Write_Num(10, 1, sec);
  301.                                                                                 Write_Cmd(0x80 + 0x40 + 11);
  302.                                                                                 break;
  303.                                                 case 4:
  304.                                                                                 month++;
  305.                                                                                 if(month == 13)
  306.                                                                                                                 month = 1;
  307.                                                                                 Write_Num(6, 0, month);
  308.                                                                                 Write_Cmd(0x80 + 7);
  309.                                                                                 break;
  310.                                                 case 5:
  311.                                                                                 day++;
  312.                                                                                 if(day == 32)
  313.                                                                                                                 day = 1;
  314.                                                                                 Write_Num(9, 0, day);
  315.                                                                                 Write_Cmd(0x80 + 10);
  316.                                                                                 break;
  317.                                         }
  318.                                 }
  319.                         }
  320.                 }        
  321. }
  322. void desp_led()
  323. {
  324.         if(k==0)
  325.                 {
  326.                         delay(50);
  327.                                        
  328.                         if(k==0)
  329.                         {
  330.                                 a++;
  331.                                 if(a==2)
  332.                                 a=0;                                
  333.                         }
  334.                 }
  335.                 if(a==0)
  336.                         {
  337.                                 led=0;
  338.                         }
  339.                 if(a==1)
  340.                         {
  341.                                 led=1;               
  342.                         }
  343.                         while(!k);               
  344.                
  345. }
  346. /***************** 主函数******************/
  347. /***************** 主函数******************/
  348. void main()
  349. {
  350.         uchar i = 0;
  351.         uchar code table[] = {"2020-01-01 Wed"};
  352.         EA = 1;
  353.         Lcd_Init();                        //1602初始化
  354.         InitTimer0();         //定时器0初始化
  355.         UsartConfiguration();        //调用蓝牙接受的参数
  356.         P1M0=0XFF;
  357.         P1M1=0X00;
  358.         Write_Cmd(0x80 + 1);
  359.         while(table[i] != '\0')
  360.         {
  361.                                         Write_Dat(table[i]);
  362.                                         i++;
  363.         }
  364.         
  365.         while(1)
  366.         {
  367.                 desp_led();
  368.                 KeyScan();
  369.                 SBUF=num;//蓝牙
  370.                 if(num == 'm')                //灭
  371.                 {        
  372.                                 led=0;
  373.                                 a=0;
  374.                 }         
  375.                 if(num == 'l')                //亮
  376.                 {        
  377.                                 led=1;
  378.                                 a=1;
  379.                 }
  380.                 if(num == 'b')                //半亮
  381.                 {        
  382.                                 led=1;
  383.                                 delay(50); //设置为75%亮度
  384.                                 led=0;
  385.                 }        
  386.         }
  387. }
  388. /***************** 主函数******************/
  389. /***************** 主函数******************/
  390. 具体源文件查看压缩包,该作品移植性能好
复制代码

1602时钟台灯.JPG (60.75 KB, 下载次数: 58)

1602时钟台灯.JPG

98f769d3ca66cbcf18045f66036909c.jpg (2.6 MB, 下载次数: 47)

98f769d3ca66cbcf18045f66036909c.jpg

1602电子时钟加按键灯.rar

35.32 KB, 下载次数: 10, 下载积分: 黑币 -5

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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