文章目录
- 需求
- 一、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]){//过去500ms
ledcnt[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,"欢迎使用空气质量检测仪"); //一个汉字屏幕上占16
LCD_ShowChar(176,0,33,16,0);//显示字符!
LCD_ShowChineseStr(0,150,WHITE,RED,"室内温度"); //一个汉字屏幕上占16
LCD_ShowChar(64,150,58,16,0);//显示字符:
LCD_ShowString(72,150,100,16,16,(uint8_t*)D_wen);
LCD_ShowChineseStr(0,166,WHITE,RED,"室内湿度"); //一个汉字屏幕上占16
LCD_ShowChar(64,166,58,16,0);//显示字符:
LCD_ShowString(72,166,100,16,16,(uint8_t*)D_shi);
LCD_ShowChineseStr(0,220,WHITE,RED,"当前时间"); //一个汉字屏幕上占16
LCD_ShowChar(64,220,58,16,0);//显示字符:
LCD_ShowString(72,220,300,16,16,(uint8_t*)D_time);
}
Su03tDealData();//命令获取
}
return 0;
}