STM32第十五课:LCD屏幕及应用
文章目录
- 需求
- 一、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接口通讯,驱动为9341并自带触摸功能(本文没用到)。
二、全屏图片
首先将该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;
}
相关文章:
STM32第十五课:LCD屏幕及应用
文章目录 需求一、LCD显示屏二、全屏图片三、数据显示1.显示欢迎词2.显示温湿度3.显示当前时间 四、需求实现代码 需求 1.在LCD屏上显示一张全屏图片。 2.在LCD屏上显示当前时间,温度,湿度。 一、LCD显示屏 液晶显示器,简称 LCD(Liquid Cry…...
Java--继承
1.继承的本质是对某一批类的抽象,从而实现对世界更好的建模 2.extends的意思是“扩展”,子类是父亲的扩展 3.Java中只有单继承,没有多继承 4.继承关系的两个类,一个为子类(派生类),一个为父类…...
Github与本地仓库建立链接、Git命令(或使用Github桌面应用)
一、Git命令(不嫌麻烦可以使用Github桌面应用) git clone [] cd [] git branch -vv #查看本地对应远程的分支对应关系 git branch -a #查看本地和远程所有分支 git checkout -b [hongyuan] #以当前的本地分支作为基础新建一个【】分支,命名为h…...
c++之旅第十一弹——顺序表
大家好啊,这里是c之旅第十一弹,跟随我的步伐来开始这一篇的学习吧! 如果有知识性错误,欢迎各位指正!!一起加油!! 创作不易,希望大家多多支持哦! 一,数据结构…...
深入了解 PXE:定义、架构、原理、应用场景及常见命令体系
引言 PXE(Preboot Execution Environment,预启动执行环境)是一种允许计算机通过网络启动操作系统而无需本地存储设备的技术。本文将详细介绍 PXE 的定义、架构、原理、应用场景及常见命令体系,特别是以 CentOS 为例,展…...
《每天5分钟用Flask搭建一个管理系统》第9章:API设计
第9章:API设计 9.1 RESTful API的概念 RESTful API是一种基于HTTP协议的网络服务接口设计方法,它使用标准的HTTP方法,如GET、POST、PUT、DELETE等,来执行资源的操作。 9.2 Flask-RESTful扩展的使用 Flask-RESTful是一个Flask扩…...
CCM的作用及原理
CCM调试的理论依据_ccm矩阵sat调试-CSDN博客 CCM是在WB之后,就是当AWB将白色校正之后其他颜色也会跟着有明显变化,CCM的作用就是要保持白色不变,把其他色彩校正到非常精准的地步。 校正后的颜色(target值是一个固定的值)CCM矩阵*原始的颜色…...
10.09面试题目记录
艾融软件 - 线上面试题 排序算法的时间复杂度 O(n^2):冒泡,选择,插入 O(logn):折半插入排序 O(nlogn):希尔,归并,快速,堆 O(nk):桶,…...
14-29 剑和诗人3 – 利用知识图谱增强 LLM 推理能力
知识图谱提供了一种结构化的方式来表示现实世界的事实及其关系。通过将知识图谱整合到大型语言模型中,我们可以增强它们的事实知识和推理能力。让我们探索如何实现这一点。 知识图谱构建 在利用知识图谱进行语言模型增强之前,我们需要从可靠的来源构建…...
【代码大全2 选读】看看骨灰级高手消灭 if-else 逻辑的瑞士军刀长啥样
文章目录 1 【写在前面】2 【心法】这把瑞士军刀长啥样3 【示例1】确定某个月份的天数(Days-in-Month Example)4 【示例2】确定保险费率(Insurance Rates Example)5 【示例3】灵活的消息格式(Flexible-Message-Format …...
深度学习 --- stanford cs231学习笔记八(训练神经网络之dropout)
6,dropout 6,1 线性分类器中的正则化 在线性分类器中,我们提到过正则化,其目的就是为了防止过度拟合。例如,当我们要用一条curve去拟合一些散点的数据时,常常是不希望训练出来的curve过所有的点,…...
【C++】 解决 C++ 语言报错:Undefined Reference
文章目录 引言 未定义引用(Undefined Reference)是 C 编程中常见的错误之一,通常在链接阶段出现。当编译器无法找到函数或变量的定义时,就会引发未定义引用错误。这种错误会阻止生成可执行文件,影响程序的正常构建。本…...
【博士每天一篇文献-算法】Adult neurogenesis acts as a neural regularizer
阅读时间:2023-12-20 1 介绍 年份:2022 作者:Lina M. Tran,Adam Santoro,谷歌DeepMind 期刊: Proceedings of the National Academy of Sciences 引用量:13 代码:https://github.c…...
在Spring Boot项目中引入本地JAR包的步骤和配置
在Spring Boot项目中,有时需要引入本地JAR包以便重用已有的代码库或者第三方库。本文将详细介绍如何在Spring Boot项目中引入本地JAR包的步骤和配置,并提供相应的代码示例。 1. 为什么需要本地JAR包 在开发过程中,可能会遇到以下情况需要使…...
Android Studio中使用命令行gradle查看签名信息
Android Studio中使用命令行gradle查看签名信息: 使用 Gradle 插件生成签名报告 打开 Android Studio 的 Terminal。 运行以下命令:./gradlew signingReport 将生成一个签名报告,其中包含 MD5、SHA1 和 SHA-256 的信息。 如果失败…...
昇思25天学习打卡营第5天 | 神经网络构建
1. 神经网络构建 神经网络模型是由神经网络层和Tensor操作构成的,mindspore.nn提供了常见神经网络层的实现,在MindSpore中,Cell类是构建所有网络的基类,也是网络的基本单元。一个神经网络模型表示为一个Cell,它由不同…...
Web缓存—Nginx和CDN应用
目录 一、代理的工作机制 二、概念 三、作用 四、常用的代理服务器 二.Nginx缓存代理服务器部署 1.在三台服务器上部署nginx 此处yum安装 2.准备测试界面 三、CDN概念及作用 1.CDN的工作过程 一、代理的工作机制 (1)代替客户机向网站请求数据…...
Linux 端口
什么是虚拟端口 计算机程序之间的通讯,通过IP只能锁定计算机,但是无法锁定具体的程序。通过端口可以锁定计算机上具体的程序,确保程序之间进行沟通。 IP地址相当于小区地址,在小区内可以有许多用户(程序)&…...
菜鸡的原地踏步史02(◐‿◑)
每日一念 改掉自己想到哪写哪的坏习惯 二叉树 二叉树的中序遍历 class Solution {/**中序遍历左 - 中 - 右*/private List<Integer> res new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {if(root null) {return res;}tranve…...
实现Java应用的数据加密与解密技术
实现Java应用的数据加密与解密技术 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 1. 数据加密与解密的重要性 数据安全是当今互联网应用开发中的重要问题之…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
