久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1310|回復: 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)


回復

使用道具 舉報

ID:558859 發表于 2019-6-22 21:49 | 顯示全部樓層
已收藏
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线高清免费观看视频 | 人人干视频在线 | 久久久毛片| 日韩精品在线播放 | 国产日韩欧美二区 | 91视频国产精品 | 91在线一区二区 | 日韩精品视频中文字幕 | 美女一区 | 在线国产欧美 | 国产亚洲精品一区二区三区 | 91免费观看 | 成人av一区 | 欧美亚洲国产一区 | 黄色一级免费观看 | 中文字幕高清 | 欧美精品一区在线 | 日本精品一区二区三区在线观看视频 | 国产精品视频一区二区三区 | 国产一区二区三区精品久久久 | 狠狠爱综合 | 国产区在线免费观看 | 成人av观看 | 久久久久久久久久影视 | 国产精品人人做人人爽 | 国产99久久精品一区二区300 | 亚洲精选久久 | 激情福利视频 | 精品国产乱码久久久久久蜜退臀 | 黄色片在线 | 天天躁天天操 | 五月婷婷亚洲 | 欧美日韩在线一区二区 | 精品国产99 | 亚洲国产一区视频 | 国产精品自产拍在线观看蜜 | 亚洲视频 欧美视频 | 国产精品国产成人国产三级 | 精品一区二区三区四区 | 伊人狠狠操| 欧美一区二区三区在线 |