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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1578|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)設(shè)計(jì)之基于STM32的LCD電子鐘的設(shè)計(jì)(LVGL+TFT彩屏)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
零.前置說明
由于本項(xiàng)目使用了LVGL開源框架,建議至少需要了解一點(diǎn)LVGL。。
一.項(xiàng)目背景     
最近學(xué)校開始了單片機(jī)設(shè)計(jì),筆者深知自己學(xué)疏才淺,思索再三,選擇了相對(duì)比較容易完成的LCD電子鐘的制作。
        要求如下:​

        也是因?yàn)楣P者最近淺淺學(xué)習(xí)了下LVGL,所以便想利用手里的一塊TFT彩屏STM32F407來完成這次的設(shè)計(jì)。
二.材料介紹        
筆者手里的這塊屏幕是1.8寸128*160的SPI屏幕:

        主控為嘉立創(chuàng)天空星(STM32F407VET6):
        還有一塊不知是什么芯片的降壓12V-5V,大小大概是16mm*22mm:

        底板是筆者自己繪制的PCB:

        實(shí)物如下:


三.代碼編寫        
由于整體功能還是比較簡單的,軟件部分只涉及到按鍵掃描以及時(shí)鐘屏幕刷新,所以我們直接建立好Clock和Key的文件:
按鍵        
按鍵就完全是正常按鍵掃描代碼的寫法,注意這里消抖選用的三行按鍵消抖,主要是考慮到延時(shí)按鍵消抖可能會(huì)破壞掉LVGL整個(gè)框架的時(shí)基,所以使用的這種方式。
  1. //              KEY1   PD8
  2. //              KEY2   PD9
  3. //              KEY3   PD10
  4. //              KEY4   PD11
  5. //              KEY5   PD12
  6. //              KEY6   PD13

  7. #include "Key.h"

  8. uint8_t Key_Value,Key_Down,Key_Up,Key_Last;

  9. uint8_t Key_GetValue(void)
  10. {
  11.         if(HAL_GPIO_ReadPin(GPIOD,KEY1_Pin) == 0)
  12.                 return 1;
  13.         if(HAL_GPIO_ReadPin(GPIOD,KEY2_Pin) == 0)
  14.                 return 2;
  15.         if(HAL_GPIO_ReadPin(GPIOD,KEY3_Pin) == 0)
  16.                 return 3;
  17.         if(HAL_GPIO_ReadPin(GPIOD,KEY4_Pin) == 0)
  18.                 return 4;
  19.         if(HAL_GPIO_ReadPin(GPIOD,KEY5_Pin) == 0)
  20.                 return 5;
  21.         if(HAL_GPIO_ReadPin(GPIOD,KEY6_Pin) == 0)
  22.                 return 6;
  23.         return 0;
  24. }

  25. void Key_RemoveShake(void)
  26. {
  27.         Key_Value = Key_GetValue();//獲取按下鍵值
  28.         Key_Down = Key_Value & (Key_Value ^ Key_Last);//獲取下降沿
  29.         Key_Up = ~Key_Value & (Key_Value ^ Key_Last);//獲取上升沿
  30.         Key_Last = Key_Value;//鍵值覆蓋
  31. }

  32. Key_Type Key_Press(void)
  33. {
  34.         return Key_Down ? (Key_Type)Key_Value : 0;
  35. }
復(fù)制代碼
時(shí)鐘

        時(shí)鐘要實(shí)現(xiàn)正常顯示以及修改界面顯示,所以最好定義一個(gè)模式變量來進(jìn)行分辨,然后根據(jù)模式不同顯示不同的數(shù)據(jù)。

  1. #include "Clock.h"
  2. #include <stdio.h>
  3. #include "Key.h"

  4. extern lv_ui guider_ui;

  5. uint8_t ClockNow[3] = {23,59,55},ClockChange[3] = {0,0,0};
  6. uint8_t ClockString_hour[2],ClockString_minute[2],ClockString_second[2];

  7. Clock_DisMode Clock_Mode = NormalMode;

  8. //時(shí)鐘初始化
  9. void Clock_Init(void)
  10. {
  11.         
  12. }

  13. void Clock_NumToString(void)
  14. {
  15.         if(Clock_Mode == NormalMode)
  16.         {
  17.                 ClockString_hour[0] = ClockNow[0] / 10 + '0'; // 十位數(shù)字
  18.                 ClockString_hour[1] = ClockNow[0] % 10 + '0'; // 個(gè)位數(shù)字
  19.                
  20.                 ClockString_minute[0] = ClockNow[1] / 10 + '0'; // 十位數(shù)字
  21.                 ClockString_minute[1] = ClockNow[1] % 10 + '0'; // 個(gè)位數(shù)字
  22.                
  23.                 ClockString_second[0] = ClockNow[2] / 10 + '0'; // 十位數(shù)字
  24.                 ClockString_second[1] = ClockNow[2] % 10 + '0'; // 個(gè)位數(shù)字
  25.         }
  26.         else
  27.         {
  28.                 ClockString_hour[0] = ClockChange[0] / 10 + '0'; // 十位數(shù)字
  29.                 ClockString_hour[1] = ClockChange[0] % 10 + '0'; // 個(gè)位數(shù)字
  30.                
  31.                 ClockString_minute[0] = ClockChange[1] / 10 + '0'; // 十位數(shù)字
  32.                 ClockString_minute[1] = ClockChange[1] % 10 + '0'; // 個(gè)位數(shù)字
  33.                
  34.                 ClockString_second[0] = ClockChange[2] / 10 + '0'; // 十位數(shù)字
  35.                 ClockString_second[1] = ClockChange[2] % 10 + '0'; // 個(gè)位數(shù)字
  36.         }
  37. }

  38. //時(shí)鐘正常調(diào)度
  39. void Clock_Handler(void)
  40. {
  41.         static uint16_t Timer_1000ms;
  42.         if(++Timer_1000ms > 20)
  43.         {
  44.                 Timer_1000ms = 0;
  45.                 if(++ClockNow[2] >= 60)
  46.                 {
  47.                         ClockNow[2] = 0;
  48.                         if(++ClockNow[1] >= 60)
  49.                         {
  50.                                 ClockNow[1] = 0;
  51.                                 if(++ClockNow[0] >= 24)
  52.                                 {
  53.                                         ClockNow[0] = 0;
  54.                                 }
  55.                         }
  56.                 }
  57.         }
  58. }

  59. void Clock_RefreshToPage(void)
  60. {
  61.         Clock_NumToString();
  62.         lv_label_set_text(guider_ui.screen_label_hour,(const char*)ClockString_hour);
  63.         lv_label_set_text(guider_ui.screen_label_minute,(const char*)ClockString_minute);
  64.         lv_label_set_text(guider_ui.screen_label_second, (const char*)ClockString_second);
  65. }

  66. //設(shè)置時(shí)鐘完成
  67. void Clock_SetValueFinish(void)
  68. {
  69.         uint8_t i;
  70.         for(i = 0;i < 3;i ++)
  71.         {
  72.                 ClockNow[i] = ClockChange[i];
  73.         }
  74. }

  75. //設(shè)置時(shí)間任務(wù)
  76. void Clock_SetValueTask(void)
  77. {
  78.         Key_RemoveShake();
  79.         switch(Key_Press())
  80.         {
  81.                 case KEY1:
  82.                 {
  83.                         uint8_t i;
  84.                         for(i = 0;i < 3;i ++)//更新設(shè)置時(shí)間
  85.                         {
  86.                                 ClockChange[i] = ClockNow[i];
  87.                         }
  88.                         Clock_Mode = SetMode;//轉(zhuǎn)換模式
  89.                         break;
  90.                 }
  91.                 case KEY2://小時(shí)++
  92.                 {
  93.                         ClockChange[0] = ClockChange[0] >= 23 ? 0 : ClockChange[0] + 1;
  94.                         break;
  95.                 }
  96.                 case KEY3://分鐘++
  97.                 {
  98.                         ClockChange[1] = ClockChange[1] >= 59 ? 0 : ClockChange[1] + 1;
  99.                         break;
  100.                 }
  101.                 case KEY4:
  102.                 {
  103.                         Clock_SetValueFinish();
  104.                         Clock_Mode = NormalMode;//轉(zhuǎn)換模式
  105.                         break;
  106.                 }
  107.                 default:
  108.                         break;
  109.         }
  110. }

  111. //按鍵測(cè)試案例
  112. void Clock_Demo(void)
  113. {
  114.         Key_RemoveShake();
  115.         if(Key_Press() == KEY1)
  116.                 ClockNow[0]++;
  117. }

復(fù)制代碼
主函數(shù)

        主函數(shù)中只需要在while里調(diào)用CLock的文件即可(整個(gè)工程要在移植好的LVGL環(huán)境下):


  1.   while (1)
  2.   {
  3.                 static uint8_t LVGL_Timer_5ms = 0;//任務(wù)調(diào)度函數(shù)的5ms定時(shí)
  4.                 HAL_Delay(1-1);
  5.                 if(LVGL_Timer_5ms++ >= 5)
  6.                 {
  7.                         lv_timer_handler();//任務(wù)調(diào)度函數(shù)
  8.                         LVGL_Timer_5ms = 0;
  9.                 }
  10.                 Clock_Init();
  11.                 Clock_Handler();
  12.                 Clock_SetValueTask();
  13.                 Clock_RefreshToPage();
  14.     /* USER CODE END WHILE */

  15.     /* USER CODE BEGIN 3 */
  16. }</font></font></font>
復(fù)制代碼

四.效果
五.總結(jié)

        本次只是做了個(gè)簡單的界面實(shí)現(xiàn)了LCD電子鐘,后續(xù)更復(fù)雜的功能待讀者們自行開發(fā)!

由于整個(gè)工程太過龐大,總體積有100+MB無法上傳至本站,因此只上傳核心代碼至此 code.zip (453.16 KB, 下載次數(shù): 0)

,LVGL環(huán)境框架還需讀者自行配置。

評(píng)分

參與人數(shù) 1黑幣 +60 收起 理由
admin + 60 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产欧美一区二区三区久久 | 在线a视频网站 | 成人午夜激情 | 亚洲图片一区二区三区 | 一本色道精品久久一区二区三区 | 国产精品久久久久久二区 | 精品美女久久久 | 国产福利资源在线 | 久久久久亚洲精品中文字幕 | 一区二区三区中文字幕 | 最新av片 | 一级黄色毛片免费 | av一区二区三区四区 | 日韩在线观看一区 | 精品日韩一区二区 | 亚洲www| 国产精品免费一区二区 | 激情福利视频 | 欧美日韩高清在线观看 | 九九热在线免费观看 | 中文字幕日韩专区 | 日韩中文字幕 | 男人天堂999 | 亚洲 欧美 在线 一区 | 亚洲码欧美码一区二区三区 | 伊人网伊人 | 色站综合| 91av视频| 久久成人免费 | 蜜桃精品视频在线 | 久久久久久亚洲精品 | 国产精品一区二区在线播放 | 密室大逃脱第六季大神版在线观看 | 日韩在线日韩 | 国产在线91| 久久久久久久久久爱 | 精品免费国产一区二区三区四区介绍 | 久久久这里都是精品 | 中文字幕乱码一区二区三区 | 精品久久中文字幕 | 亚洲码欧美码一区二区三区 |