文章目錄
- 需求
- 一、LCD顯示屏
- 二、全屏圖片
- 三、數據顯示
- 1.顯示歡迎詞
- 2.顯示溫濕度
- 3.顯示當前時間
- 四、需求實現代碼
需求
1.在LCD屏上顯示一張全屏圖片。
2.在LCD屏上顯示當前時間,溫度,濕度。
一、LCD顯示屏
??液晶顯示器,簡稱 LCD(Liquid Crystal Display),相對于上一代 CRT 顯示器(陰極射線管顯示器), LCD 顯示器具有功耗低、體積小、承載的信息量大及不傷眼的優點,因而它成為了現在的主流電子顯示設備,其中包括電視、電腦顯示器、手機屏幕及各種嵌入式設備的顯示器。
??顯示器尺寸:顯示器的大小一般以英寸表示,如 5 英寸、 21 英寸、 24 英寸等,這個長度是指屏幕對角線的長度, 通過顯示器的對角線長度及長寬比可確定顯示器的實際長寬尺寸。
LCD屏幕的構成:顯示屏由液晶顯示面板、觸摸面板以及 PCB 底板構成.
本次使用的屏幕是2.8 寸的 TFTLCD 顯示屏,該模塊支持 65K 色顯示,顯示分辨率為 320×240,接口為 16 位的 8080 并口,自帶觸摸功能(本文沒用到)。
二、全屏圖片
首先將該LCD屏官方寫好的三個文件添加進工程中的api文件夾中
打開圖片取模軟件。
找到想要設置的圖片,用電腦自帶的畫圖軟件將分辨率設置為340x240。
然后在圖片取模軟件中打開該圖片。
按照圖中所示設置即可。
記得設置完寬度和高度后,點一下藍色框起的部分。
最后點擊保存,該文件會生成一個.c文件,該文件內為圖片取模后的數組。
將該文件添加到工程中即可。
在主函數中外部聲明一下該數組。
在官方給的bsp_lcd.c中找到LCD初始化文件并在主函數中聲明。
由于我使用的圖片為橫圖,所以將顯示改為橫屏顯示。
最后在官方文件中找到LCD_ShowPhoto()函數,填寫參數并將其添加到主函數中就可以了。
參數填寫:x,y為圖片左上角坐標,這里為了鋪滿全屏填0,0。
長寬直接最大340X240。最后就是圖片的數組了,記得強轉一下,以符合要求。
實現效果:
三、數據顯示
1.顯示歡迎詞
在官方文件中找到hz1616數組
將想要顯示的漢字加入進數組中。
再打開數字取模軟件
輸入所需漢字,點擊生成字模。
將生成的數字添加到Hz_16_16[]數組中,再將16個數組刪去中間的{},合并為32個數組。
要注意:1.漢字順序要跟數組順序相對應。
????2.keil5要將編碼格式設置成簡體中文。
最后在主函數找到顯示漢字的函數
參數填寫:xy坐標,字體背景顏色,字體顏色,中文字符串
2.顯示溫濕度
將之前寫好的DHT11模塊初始化,數據處理加載到主函數中,然后外部聲明溫濕度。
由于LCD屏顯示函數需要轉換為字符串,而溫濕度為浮點型量。
所以我們需要將浮點型轉換為字符串,此處我使用的是sprintf來轉換。
先聲明兩個字符串來承接轉換后的結果:
再使用sprintf進行轉換:
最后使用LCD_ShowString();函數打印即可。
參數:x,y開始坐標,字體背景顏色,字體顏色,轉換后的字符串。
要注意數據長度要多設置點,防止小數點后的數字顯示不出來。
中間字符的顯示函數為LCD_ShowChar()函數。
只要是ASCII碼表上有的字符都能打出來,直接填序號即可。
參數:xy開始坐標,字符序號,大小(為了和漢字保持一致,我們這里用的都是16),最后的0為不加背景。
3.顯示當前時間
先將RTC模塊加入進工程。
使用localtime處理一下當前時間,并保存到結構體里。
最后使用sprintf轉換為字符串即可
四、需求實現代碼
使用以上知識綜合應用就能實現需求,關鍵代碼如下:
main.c
#include "stm32f10x.h"
#include "usart.h"
#include "stdio.h"
#include "delay.h"
#include "string.h"
#include "pwm.h"
#include "adc.h"
#include "su03t.h"
#include "dht11.h"
#include "kqm.h"
#include "key.h"
#include "RTC.h"
#include "bsp_lcd.h"
char D_wen[20];
char D_shi[20];
char D_time[20];extern float voc;
extern float ch2o;
extern float co2;
extern float hum;
extern float tem;
extern ADCARR adcData;
extern const unsigned char gImage_hengliu[153600];
uint8_t key3flag,cntt;
uint32_t sec=0;
int main()
{NVIC_SetPriorityGrouping(5);//兩位搶占兩位次級Usart1_Config(); SysTick_Config(72000);Led_Init();key_Init();LCD_Init();Kqm_U4Config();Su03t_U5Config();DHT11_Config(); RTC_Configuration();LCD_ShowPhoto(0, 0,320, 240, (uint8_t*)gImage_hengliu);while(1){ sec = RTC_GetCounter();time_t seconds=sec;struct tm *info = localtime(&seconds);if(ledcnt[0]>=ledcnt[1]){//過去500msledcnt[0]=0;Get_Smoke_Light_MidValue();//煙霧光照中位數DHT11_ReadData();//溫濕度KQM_DealData();//空氣質量Led_Toggle(1);printf(" LED閃爍 \r\n");printf("本地時間:%d-%02d-%02d %02d:%02d:%02d\r\n",info->tm_year + 1900, info->tm_mon + 1, info->tm_mday,info->tm_hour, info->tm_min, info->tm_sec);//LCD顯示sprintf(D_wen, "%.2f", tem);sprintf(D_shi, "%.2f", hum);sprintf(D_time, "%d-%02d-%02d %02d:%02d:%02d", info->tm_year + 1900, info->tm_mon + 1, info->tm_mday,info->tm_hour, info->tm_min, info->tm_sec);LCD_ShowChineseStr(0,0,WHITE,RED,"歡迎使用空氣質量檢測儀"); //一個漢字屏幕上占16LCD_ShowChar(176,0,33,16,0);//顯示字符!LCD_ShowChineseStr(0,150,WHITE,RED,"室內溫度"); //一個漢字屏幕上占16LCD_ShowChar(64,150,58,16,0);//顯示字符:LCD_ShowString(72,150,100,16,16,(uint8_t*)D_wen);LCD_ShowChineseStr(0,166,WHITE,RED,"室內濕度"); //一個漢字屏幕上占16LCD_ShowChar(64,166,58,16,0);//顯示字符:LCD_ShowString(72,166,100,16,16,(uint8_t*)D_shi);LCD_ShowChineseStr(0,220,WHITE,RED,"當前時間"); //一個漢字屏幕上占16LCD_ShowChar(64,220,58,16,0);//顯示字符:LCD_ShowString(72,220,300,16,16,(uint8_t*)D_time);}Su03tDealData();//命令獲取 }return 0;
}