找回密码
 立即注册

QQ登录

只需一步,快速开始

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

lcd1602 时钟,温度 单片机源程序

[复制链接]
跳转到指定楼层
楼主
ID:553731 发表于 2019-6-8 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

单片机源程序如下:
  1. #include "main.h"
  2. #include "LCD1602.h"
  3. #include "DS1302.h"
  4. #include "DS18B20.h"

  5. //定义变量
  6. unsigned int Temp_Buffer = 0;
  7. unsigned char KEY_NUM = 0;
  8. bit Flag_KEY_Set = 0;
  9. unsigned char KEY2_Count = 0;


  10. //****************************************************
  11. //主函数
  12. //****************************************************
  13. void main()
  14. {
  15.         LCD1602_Init();                                                                        //初始化LCD1602
  16.         DS1302_Init();                                                                        //初始化DS1302 时钟芯片

  17.         LCD1602_write_com(0x80);                                                // 初始位置?
  18.         LCD1602_write_word("Welcome to use!");                        // 字幕

  19.         Temp_Buffer = Get_temp();                                          //读取DS18B20的值
  20.         Delay_ms(1000);                                                           //延迟

  21.         LCD1602_write_com(0x01);                                        //清屏

  22.         while(1)
  23.         {                                
  24.                 DS1302_GetTime(&DS1302Buffer);                                                        //获取当前RTCC值  rtcc是日日历

  25.                 if(Flag_Time_Refresh == 1 && Flag_KEY_Set == 0)                        //数据更新时才刷新LCD
  26.                 {
  27.                         Flag_Time_Refresh = 0;
  28.                         Display_RTCC();                                                                                //显示实时时钟
  29.                         Display_Temp();                                                                                //获取并显示温度值
  30.                 }

  31.                 Scan_Key();                                                                                        //按键扫描

  32.                 switch( KEY_NUM )
  33.                 {
  34.                         case 1:                                                //按键1执行程序
  35.                                         KEY_NUM = 0;                //清空按键标志
  36.                                         Flag_KEY_Set = ~Flag_KEY_Set;        //设置按键标志位翻转
  37.                                         if(Flag_KEY_Set)
  38.                                         {                                                
  39.                                                 LCD1602_write_com(0x0d);        //LCD1602指针闪烁开
  40.                                                 LCD1602_write_com(0x80+ 3);        //指针设置到第一行第4列
  41.                                                 KEY2_Count = 0;                                //按键S2计数清零
  42.                                         }
  43.                                         else
  44.                                         {
  45.                                                 LCD1602_write_com(0x0c);        //LCD1602指针闪烁关
  46.                                         }
  47.                                         break;
  48.                         case 2:                                                //按键2执行程序
  49.                                         KEY_NUM = 0;                //清空按键标志
  50.                                         if(Flag_KEY_Set)                        //在设置状态时运行
  51.                                         {
  52.                                                 KEY2_Count++;
  53.                                                 if(KEY2_Count == 7)
  54.                                                         KEY2_Count = 0;
  55.                                                 switch(KEY2_Count)
  56.                                                 {
  57.                                                         case 0:
  58.                                                                         LCD1602_write_com(0x80+ 3);        //指针指向年,闪烁
  59.                                                                         break;
  60.                                                         case 1:
  61.                                                                         LCD1602_write_com(0x80+ 6);        //指针指向月,闪烁
  62.                                                                         break;
  63.                                                         case 2:
  64.                                                                         LCD1602_write_com(0x80+ 9);        //指针指向日,闪烁
  65.                                                                         break;
  66.                                                         case 3:
  67.                                                                         LCD1602_write_com(0x80+ 15);        //指针指向星期,闪烁
  68.                                                                         break;
  69.                                                         case 4:
  70.                                                                         LCD1602_write_com(0x80+ 0x40 + 1);        //指针指向小时,闪烁
  71.                                                                         break;
  72.                                                         case 5:
  73.                                                                         LCD1602_write_com(0x80+ 0x40 + 4);        //指针指向分钟,闪烁
  74.                                                                         break;
  75.                                                         case 6:
  76.                                                                         LCD1602_write_com(0x80+ 0x40 + 7);        //指针指向秒钟,闪烁
  77.                                                                         break;
  78.                                                         default : break;
  79.                                                 }        
  80.                                         }                                       
  81.                                         break;
  82.                         case 3:                                                //按键3执行程序
  83.                                         KEY_NUM = 0;                //清空按键标志
  84.                                         if(Flag_KEY_Set)                        //在设置状态时运行
  85.                                         {
  86.                                                 switch(KEY2_Count)
  87.                                                 {
  88.                                                         case 0:
  89.                                                                         DS1302Buffer.Year++;
  90.                                                                         if(DS1302Buffer.Year >= 100)
  91.                                                                         {
  92.                                                                                 DS1302Buffer.Year = 0;
  93.                                                                         }
  94.                                                                         DS1302_SetTime( DS1302_YEAR , DS1302Buffer.Year );

  95.                                                                         Display_RTCC();
  96.                                                                         
  97.                                                                         LCD1602_write_com(0x80+ 3);        //指针指向年,闪烁
  98.                                                                         break;
  99.                                                         case 1:
  100.                                                                         DS1302Buffer.Month++;
  101.                                                                         if(DS1302Buffer.Month >= 13)
  102.                                                                         {
  103.                                                                                 DS1302Buffer.Month = 1;
  104.                                                                         }
  105.                                                                         DS1302_SetTime( DS1302_MONTH , DS1302Buffer.Month );
  106.                                                                         Display_RTCC();
  107.         
  108.                                                                         LCD1602_write_com(0x80+ 6);        //指针指向月,闪烁
  109.                                                                         break;
  110.                                                         case 2:
  111.                                                                         DS1302Buffer.Day++;
  112.                                                                         if(DS1302Buffer.Day >= 32)
  113.                                                                         {
  114.                                                                                 DS1302Buffer.Day = 1;
  115.                                                                         }
  116.                                                                         DS1302_SetTime( DS1302_DAY , DS1302Buffer.Day );
  117.                                                                         Display_RTCC();
  118.         
  119.                                                                         LCD1602_write_com(0x80+ 9);        //指针指向日,闪烁
  120.                                                                         break;
  121.                                                         case 3:
  122.                                                                         DS1302Buffer.Week++;
  123.                                                                         if(DS1302Buffer.Week >= 8)
  124.                                                                         {
  125.                                                                                 DS1302Buffer.Week = 1;
  126.                                                                         }
  127.                                                                         DS1302_SetTime( DS1302_WEEK , DS1302Buffer.Week );
  128.                                                                         Display_RTCC();
  129.         
  130.                                                                         LCD1602_write_com(0x80+ 15);        //指针指向星期,闪烁
  131.                                                                         break;
  132.                                                         case 4:
  133.                                                                         DS1302Buffer.Hour++;
  134.                                                                         if(DS1302Buffer.Hour >= 24)
  135.                                                                         {
  136.                                                                                 DS1302Buffer.Hour = 0;
  137.                                                                         }
  138.                                                                         DS1302_SetTime( DS1302_HOUR , DS1302Buffer.Hour );
  139.                                                                         Display_RTCC();
  140.         
  141.                                                                         LCD1602_write_com(0x80+ 0x40 + 1);        //指针指向小时,闪烁
  142.                                                                         break;
  143.                                                         case 5:
  144.                                                                         DS1302Buffer.Minute++;
  145.                                                                         if(DS1302Buffer.Minute >= 60)
  146.                                                                         {
  147.                                                                                 DS1302Buffer.Minute = 0;
  148.                                                                         }
  149.                                                                         DS1302_SetTime( DS1302_MINUTE , DS1302Buffer.Minute );
  150.                                                                         Display_RTCC();
  151.         
  152.                                                                         LCD1602_write_com(0x80+ 0x40 + 4);        //指针指向分钟,闪烁
  153.                                                                         break;
  154.                                                         case 6:
  155.                                                                         DS1302Buffer.Second++;
  156.                                                                         if(DS1302Buffer.Second >= 60)
  157.                                                                         {
  158.                                                                                 DS1302Buffer.Second = 0;
  159.                                                                         }
  160.                                                                         DS1302_SetTime( DS1302_SECOND , DS1302Buffer.Second);
  161.                                                                         Display_RTCC();
  162.         
  163.                                                                         LCD1602_write_com(0x80+ 0x40 + 7);        //指针指向秒钟,闪烁
  164.                                                                         break;
  165.                                                         default : break;
  166.                                                 }
  167.                                         }
  168.                                         break;
  169.                         case 4:                                                //按键4执行程序
  170.                                         KEY_NUM = 0;                //清空按键标志
  171.                                         if(Flag_KEY_Set)                        //在设置状态时运行
  172.                                         {
  173.                                                 switch(KEY2_Count)
  174.                                                 {
  175.                                                         case 0:
  176.                                                                         DS1302Buffer.Year--;
  177.                                                                         if(DS1302Buffer.Year == 255)
  178.                                                                         {
  179.                                                                                 DS1302Buffer.Year = 99;
  180.                                                                         }
  181.                                                                         DS1302_SetTime( DS1302_YEAR , DS1302Buffer.Year );
  182.                                                                         Display_RTCC();
  183.                                                                         
  184.                                                                         LCD1602_write_com(0x80+ 3);        //指针指向年,闪烁
  185.                                                                         break;
  186.                                                         case 1:
  187.                                                                         DS1302Buffer.Month--;
  188.                                                                         if(DS1302Buffer.Month == 0)
  189.                                                                         {
  190.                                                                                 DS1302Buffer.Month = 12;
  191.                                                                         }
  192.                                                                         DS1302_SetTime( DS1302_MONTH , DS1302Buffer.Month );
  193.                                                                         Display_RTCC();
  194.         
  195.                                                                         LCD1602_write_com(0x80+ 6);        //指针指向月,闪烁
  196.                                                                         break;
  197.                                                         case 2:
  198.                                                                         DS1302Buffer.Day--;
  199.                                                                         if(DS1302Buffer.Day == 0)
  200.                                                                         {
  201.                                                                                 DS1302Buffer.Day = 31;
  202.                                                                         }
  203.                                                                         DS1302_SetTime( DS1302_DAY , DS1302Buffer.Day );
  204.                                                                         Display_RTCC();
  205.         
  206.                                                                         LCD1602_write_com(0x80+ 9);        //指针指向日,闪烁
  207.                                                                         break;
  208.                                                         case 3:
  209.                                                                         DS1302Buffer.Week--;
  210.                                                                         if(DS1302Buffer.Week == 0)
  211.                                                                         {
  212.                                                                                 DS1302Buffer.Week = 7;
  213.                                                                         }
  214.                                                                         DS1302_SetTime( DS1302_WEEK , DS1302Buffer.Week );
  215.                                                                         Display_RTCC();
  216.         
  217.                                                                         LCD1602_write_com(0x80+ 15);        //指针指向星期,闪烁
  218.                                                                         break;
  219.                                                         case 4:
  220.                                                                         DS1302Buffer.Hour--;
  221.                                                                         if(DS1302Buffer.Hour == 255)
  222.                                                                         {
  223.                                                                                 DS1302Buffer.Hour = 23;
  224.                                                                         }
  225.                                                                         DS1302_SetTime( DS1302_HOUR , DS1302Buffer.Hour );
  226.                                                                         Display_RTCC();
  227.         
  228.                                                                         LCD1602_write_com(0x80+ 0x40 + 1);        //指针指向小时,闪烁
  229.                                                                         break;
  230.                                                         case 5:
  231.                                                                         DS1302Buffer.Minute--;
  232.                                                                         if(DS1302Buffer.Minute == 255)
  233.                                                                         {
  234.                                                                                 DS1302Buffer.Minute = 59;
  235.                                                                         }
  236.                                                                         DS1302_SetTime( DS1302_MINUTE , DS1302Buffer.Minute );
  237.                                                                         Display_RTCC();
  238.         
  239.                                                                         LCD1602_write_com(0x80+ 0x40 + 4);        //指针指向分钟,闪烁
  240.                                                                         break;
  241.                                                         case 6:
  242.                                                                         DS1302Buffer.Second--;
  243.                                                                         if(DS1302Buffer.Second == 255)
  244.                                                                         {
  245.                                                                                 DS1302Buffer.Second = 59;
  246.                                                                         }
  247.                                                                         DS1302_SetTime( DS1302_SECOND , DS1302Buffer.Second);
  248.                                                                         Display_RTCC();
  249.         
  250.                                                                         LCD1602_write_com(0x80+ 0x40 + 7);        //指针指向秒钟,闪烁
  251.                                                                         break;
  252.                                                         default : break;
  253.                                                 }
  254.                                         }
  255.                                         break;
  256.                         default : break;
  257.                 }                                
  258.         }
  259. }

  260. //****************************************************
  261. //显示温度
  262. //****************************************************
  263. void Display_Temp()
  264. {
  265.         Temp_Buffer = Get_temp();                                          //读取DS18B20的值
  266.         LCD1602_write_com(0x80+0x40+10);                                //设置LCD1602指针到第二行第11列
  267.         if(flag_temper == 1)                                                //根据温度标志位显示温度正负
  268.         {
  269.                 LCD1602_write_data('-');        
  270.         }
  271.         if( Temp_Buffer/1000 != 0 )                                        //如果第一位为0,忽略显示
  272.         {
  273.                 LCD1602_write_data(Temp_Buffer/1000+0X30);           //显示温度百位值
  274.         }
  275.         LCD1602_write_data(Temp_Buffer%1000/100+0X30);           //显示温度十位值
  276.         LCD1602_write_data(Temp_Buffer%100/10+0X30);           //显示温度个位值
  277.         LCD1602_write_data('.');                                                   //显示小数点
  278.         LCD1602_write_data(Temp_Buffer%10+0X30);                   //显示温度十分位值
  279.         LCD1602_write_data('C');                                                   //显示字符C
  280.                
  281. }

  282. //****************************************************
  283. //显示实时时钟
  284. //****************************************************
  285. void Display_RTCC()
  286. {
  287.         LCD1602_write_com(0x80);                                                        //指针设置到第一行第1列
  288.         
  289.         LCD1602_write_word("20");
  290.         LCD1602_write_data(DS1302Buffer.Year/10 + 0x30);         //显示Year高位
  291.         LCD1602_write_data(DS1302Buffer.Year%10 + 0x30);         //显示Year低位
  292.         LCD1602_write_data('-');
  293.         LCD1602_write_data(DS1302Buffer.Month/10 + 0x30);         //显示Month高位
  294.         LCD1602_write_data(DS1302Buffer.Month%10 + 0x30);         //显示Month低位
  295.         LCD1602_write_data('-');
  296.         LCD1602_write_data(DS1302Buffer.Day/10 + 0x30);                 //显示Day高位
  297.         LCD1602_write_data(DS1302Buffer.Day%10 + 0x30);                 //显示Day低位

  298.         LCD1602_write_com(0x80+13);                                                         //指针设置到第一行第14列
  299.         switch(DS1302Buffer.Week)
  300.         {
  301.                 case 1:
  302.                                 LCD1602_write_word("Mon");                                 //显示星期一
  303.                                 break;
  304.                 case 2:
  305.                                 LCD1602_write_word("Tue");                                 //显示星期二
  306.                                 break;
  307.                 case 3:
  308.                                 LCD1602_write_word("Wed");                                 //显示星期三
  309.                                 break;
  310.                 case 4:
  311.                                 LCD1602_write_word("Thu");                                 //显示星期四
  312.                                 break;
  313.                 case 5:
  314.                                 LCD1602_write_word("Fri");                                 //显示星期五
  315.                                 break;
  316.                 case 6:
  317.                                 LCD1602_write_word("Sat");                                 //显示星期六
  318.                                 break;
  319.                 case 7:
  320.                                 LCD1602_write_word("Sun");                                 //显示星期日
  321.                                 break;
  322.                 default : break;                                                
  323.         }               


  324.         LCD1602_write_com(0x80 + 0x40);                                 //指针设置到第二行第1列

  325.         LCD1602_write_data(DS1302Buffer.Hour/10 + 0x30);         //显示Hour高位
  326.         LCD1602_write_data(DS1302Buffer.Hour%10 + 0x30);         //显示Hour低位
  327.         LCD1602_write_data(':');
  328.         LCD1602_write_data(DS1302Buffer.Minute/10 + 0x30);         //显示Minute高位
  329.         LCD1602_write_data(DS1302Buffer.Minute%10 + 0x30);         //显示Minute低位
  330.         LCD1602_write_data(':');
  331.         LCD1602_write_data(DS1302Buffer.Second/10 + 0x30);         //显示Second高位
  332.         LCD1602_write_data(DS1302Buffer.Second%10 + 0x30);         //显示Second低位        
  333. }

  334. //****************************************************
  335. //蜂鸣器程序
  336. //****************************************************
  337. void Buzzer_Di()
  338. {
  339.         Buzzer = 0;
  340.         Delay_ms(3);
  341.         Buzzer = 1;
  342.         Delay_ms(3);
  343. }
  344. //****************************************************
  345. //按键扫描程序
  346. //****************************************************
  347. void Scan_Key()
  348. {
  349.         if( KEY1 == 0 )                                                 //按键1扫描
  350.         {
  351.                 Delay_ms(10);                                        //延时去抖
  352.                 if( KEY1 == 0 )
  353.                 {
  354.                         Buzzer_Di();
  355.                         while(KEY1 == 0);                        //等待松手
  356.                         KEY_NUM = 1;
  357.                 }
  358.         }

  359.         if( KEY2 == 0 )                                                //按键2扫描
  360.         {
  361.                 Delay_ms(10);                                        //延时去抖
  362.                 if( KEY2 == 0 )
  363.                 {
  364.                         Buzzer_Di();
  365.                         while(KEY2 == 0);                        //等待松手
  366.                         KEY_NUM = 2;
  367.                 }
  368.         }

  369.         if( KEY3 == 0 )                                                //按键2扫描
  370.         {
  371.                 Delay_ms(10);                                        //延时去抖
  372.                 if( KEY3 == 0 )
  373.                 {
  374.                         Buzzer_Di();
  375.                         while(KEY3 == 0);                        //等待松手
  376.                         KEY_NUM = 3;
  377.                 }
  378.         }

  379.         if( KEY4 == 0 )                                                //按键2扫描
  380.         {
  381.                 Delay_ms(10);                                        //延时去抖
  382.                 if( KEY4 == 0 )
  383.                 {
  384.                         Buzzer_Di();
  385.                         while(KEY4 == 0);                        //等待松手
  386.                         KEY_NUM = 4;
  387.                 }
  388.         }
  389. }

  390. //****************************************************
  391. //MS延时函数(12M晶振下测试)
  392. //****************************************************
  393. void Delay_ms(unsigned int n)
  394. {
  395.         unsigned int  i,j;
  396.         for(i=0;i<n;i++)
  397.                 for(j=0;j<123;j++);
  398. }
复制代码

所有资料51hei提供下载:
3.LCD1602时钟+温度.zip (74.41 KB, 下载次数: 15)


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

使用道具 举报

沙发
ID:558859 发表于 2019-6-22 21:49 | 只看该作者
已收藏
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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