TFTLCD 液晶界面设计

news/2025/1/11 0:08:10/

前言

最近使用一块 TFT 模块做心电检测(Electrocardiography Test, ECG Test)的波形显示时,涉及到界面设计,期间遇到一些困难,花费一些时间解决了,简单分享一下

起初我只是简单将中文,英文绘制上去,黑底白字,配上一个简单的开始按钮,但是过于简单了,而且没有表现 TFT彩屏的功能特点,即可以绘制彩色字符甚至是彩色图片的功能,于是进行了修改。

几番思索,最终设计方案:
✧ 绘制浅蓝色的网格线作为背景
✧ 用蓝色绘制一个典型的PQRST波形
✧ 在心电波形的旁边绘制一个心
✧ 心电波形的线条呈现渐变的效果

具体效果看文末对比。
我使用的是普中的A4单片机开发板,TFT2.0模块,这块板子有很多自带的资料,函数等

正文

要使用 TFT 模块显示彩色字符或图案,首先要了解到 TFT 模块是一块16位真彩色显示屏

16位:使用16bit 来表示一个颜色,总共能表示 65536 种颜色
真彩色:每个像素的颜色由R, G, B 三个基色分量来表示

16位真彩中个颜色所占位数: R: 5bit G: 6 bit B: 5 bit

绘制浅蓝色网格线

颜色可以通过查阅相应的16位真彩色表获得,也可以通过尝试得到
不过我一直没查到颜色表,所以我是将蓝色渐变色绘制出来,以此判断所需颜色大概颜色值的
具体渐变色的绘制看下面
画线使用的是自带的画线的代码

绘制典型的PQRST波

这个任务我起初的方案是找一张QRST波形图片,将图片背景变成黑色,然后对它进行取模,绘制,但是我发现取模后,数据大小达一万多,不过我使用的51单片机Flash大小是128KB,所以将数据放在code字段程序倒是编译运行没什么问题

但是因为线太细了,对图片清除背景时,使用自动去除背景工具清除不准确,需要手动进行调整,还会对波形造成一定破坏,不美观
另外,为了画一个简单的波形要对一大块区域进行绘制还是比较奢侈

所以我最终还是采用画线的方式,画线就需要自己确定点的坐标,假如有专门的测量工具就可以知道图片上点的位置比例,但是我没找到工具,所以我是通过多次调试得到的坐标,这个过程就是需要费时间调试,其他还好,因为线不多,所以还是可行的

绘制心

起初我绘制的是一个平面的简笔画,单色的爱心,不够美观,最终我还是决定绘制一颗心脏上去
心脏使用的是一张比较干净的心脏模型的图片,这里的干净是指背景纯色,或比较单一,便于自动去除背景
一般这种图片处理我都是使用免费的在线工具,如下面:
去除背景工具:https://airmore.cn/remove-background-online
添加黑色背景工具:https://www.gaoding.com/image

得到需要的图片后,使用电脑自带的画图工具将图片缩小到合适的尺寸
再使用图片取模工具取模得到心脏的数组数据,再用自带的画图函数进行绘制

绘制渐变色线

绘制渐变色涉及到颜色的知识,由于我手头没有色表,所以只能根据颜色值的规律变化来实现颜色渐变
对于颜色我只大概知道:
RGB三色,当B的分量最大时,其他分量为0时,蓝色是最深的
RGB三色,当B的分量不断降低,其他两个颜色分量增加时,颜色中蓝色的成分变少,并且整体颜色会受到另外两个分量的影响
当一个颜色,RGB三者比例不变进行减少时,颜色会变亮,趋向白色
当一个颜色,RGB三者比例不变进行增加时,颜色会变暗,趋向黑色

我任务的主要需求是实现颜色的变亮和恢复,简单来说就是让一条线有一个中间发光的效果

所以就需要给定一个颜色,减少蓝色所占比例的同时提高RGB各个分量的值,我的做法是给定一定的B分量值,RG分量为0,然后再不断地递增RG的值
下面演示都是画的非渐变的线然后不断调整线的颜色,它们和画一条渐变的线的原理是一样的,只需要对代码进行修改整合

FRONT_COLOR = 31;		// 31 是二进制 11111,表示蓝色分量最大值
for(i=0;i<176;i+=5){LCD_DrawLine(0,i,220,i,FALSE); // 参数 x1 y1 x2 y2 isGradientif(i%2 == 0) FRONT_COLOR += 2112;	// R+1 G+2 B+0
}

上面的代码,2112是RGB三个分量分别为1 2 0的十进制值
原先我是每次采用 R+1 G+1 B+0的递增方式,但是发现颜色趋向紫,粉色,而不是趋向白色,所以我改成R+1 G+2 B+0,后面想想G用 6bit 表示,R用 5bit 表示,确实应该按照1:2的比例增加两者分量

可以通过调整被取模数来设置渐变的快慢

上面的代码效果就是直线从蓝色慢慢趋近白色,通过将FRONT_COLOR再递减回去就可以恢复原来的颜色值
这样就可以得到颜色中间发光的效果

要得到蓝色逐渐变浅变黑,就比较简单了,只需要对蓝色分量进行递减就可以了

	FRONT_COLOR = 31;for(i=0;i<176;i+=5){LCD_DrawLine(0,i,220,i,FALSE); // 参数 x1 y1 x2 y2 isGradientFRONT_COLOR -= 1;}

根据自己想要的颜色对颜色区间和渐变快慢进行调整就可以了

修改前后对比

在这里插入图片描述

感悟:程序员不仅仅是一个和代码有关的职业,而是一个将各种逻辑原理呈现为简单事物的职业,是一个可以接触,学习和思考很多不一样知识的职业,一个缺乏思考的程序员不会是一个好的程序员


http://www.ppmy.cn/news/905195.html

相关文章

ESP32使用TFT_eSPI库实现屏幕触摸

文章目录 软件准备引脚连接程序上传 软硬件&#xff1a;ESP-WROOM-32、Arduino、2.8寸240*320触摸屏(ILI9341驱动) 以下是开发板和屏幕实物 软件准备 1、在Arduino中搜索安装TFT_eSPI库。 2、找到TFT_eSPI的安装目录&#xff0c;个人根据电脑用户名、安装目录不同有所差异&…

TFT 屏幕的使用——ESP32学习笔记(番外)

零、前言 最近在搞tft屏幕&#xff0c;遇到了非常多的困难&#xff0c;这个笔记主要帮助的是和我一样比较小白的单片机初学者&#xff0c;在这里我用到的板子是ESP32&#xff0c;用的屏幕是单工SPI通信协议的一块屏幕。 一、准备工作 在这里我们准备写入驱动程序&#xff0c;这…

嵌入式Linux驱动笔记(二十四)------framebuffer之使用spi-tft屏幕(上)

你好&#xff01;这里是风筝的博客&#xff0c; 欢迎和我一起交流。 最近入手了一块spi接口的tft彩屏&#xff0c;想着在我的h3板子上使用framebuffer驱动起来。 我们知道&#xff1a; Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。Framebuffer机制模仿显卡的功…

[个人笔记] WinSrv批量添加DNS记录和条件转发器记录

Windows Server - 运维篇 第三章 WinSrv批量添加DNS记录和条件转发器记录 Windows Server - 运维篇系列文章回顾WinSrv批量添加DNS记录和条件转发器记录单条记录添加DNS条件转发器记录批量新增DNS条件转发器记录批量导出DNS条件转发器 参考来源 系列文章回顾 第一章 域控使用C…

Arduino UNO驱动合宙1.8‘TFT SPI屏幕示例演示(含资料包)

Arduino UNO驱动合宙1.8"TFT SPI屏幕示例演示 效果展示 驱动参考资料包 来源于&#xff1a;http://www.lcdwiki.com/zh/1.8inch_Arduino_SPI_Module_ST7735S_SKU:MAR1801资料包中2种驱动方式&#xff1a;模拟SPI和硬件SPI驱动方式 1.8inch Arduino SPI Module ST7735S…

linux驱动tft屏幕,Linux2.6.26.5加入TFT-LCD驱动

首先下载内核源码&#xff0c;我这里用的是linux-2.6.26.5的内核源码。本文引用地址&#xff1a;http://www.eepw.com.cn/article/148334.htm (1) 在arch/arm/mach-s3c2410/mach-smdk2410.c里添加头文件&#xff1a; #include (2) 在arch/arm/ plat-s3c24xx / commON-smdk.c文件…

microPython驱动tft屏幕显示中文终极解决方案

microPython驱动tft屏幕显示中文终极解决方案 一、运行效果 二、实现原理 原理同上篇文章一样&#xff0c;用在线汉字取模工具获取点阵的字节信息&#xff0c;通过st7789py.py驱动程序显示出来。 上次的程序只能显示部分汉字&#xff0c;需要显示哪些字自己去在线网站取模&a…

STM32驱动ST7789V2 tft屏幕

一 . 简介 本次教程使用的是1.54寸240*240像素的tft屏幕&#xff0c;其接口协议为SPI协议。在使用的过程中仅需要四根数据即可驱动点亮屏幕。然后硬件使用的是STM32F103C8T6核心板&#xff0c;用的是SPI2。一般购买屏幕的话它们会提供对应的例程&#xff0c;直接拿过来修改即可…