[其他ST产品] 如何使用STM32 HAL库驱动TFT-LCD实现手画板功能

[复制链接]
3271|62
 楼主| 等你下课 发表于 2023-11-21 00:04 | 显示全部楼层
我们知道,宏定义函数的好处就是速度快(直接嵌到被调用函数里面去了),坏处就是占空间大。在LCD_Init函数里面,有很多地方要写数据,如果全部用宏定义的LCD_WR_DATA函数,那么就会占用非常大的flash,所以我们这里另外实现一个函数:LCD_WR_DATAX,专门给LCD_Init函数调用,从而大大减少flash占用量。
 楼主| 等你下课 发表于 2023-11-21 00:04 | 显示全部楼层
第三个是LCD_WR_REG函数:该函数是通过8080并口向LCD模块写入寄存器命令,因为该函数使用频率不是很高,我们不采用宏定义来做(宏定义占用FLASH较多),通过LCD_RS来标记是写入命令(LCD_RS=0)还是数据(LCD_RS=1)。该函数代码如下:
87048655b839299969.png
 楼主| 等你下课 发表于 2023-11-21 00:04 | 显示全部楼层
既然有写寄存器命令函数,那就有读寄存器数据函数。

第四个是LCD_RD_DATA函数:该函数用来读取LCD控制器的寄存器数据(非GRAM数据),该函数代码如下:
78597655b839f423bd.png
 楼主| 等你下课 发表于 2023-11-21 00:05 | 显示全部楼层
以上4个函数,用于实现LCD基本的读写操作。

接下来,我们介绍2个LCD寄存器操作的函数。

第五个是LCD_WriteReg和LCD_ReadReg函数,这两个函数代码如下:
33354655b83acd6c84.png
 楼主| 等你下课 发表于 2023-11-21 00:05 | 显示全部楼层
37786655b83b51876f.png

这两个函数函数十分简单,LCD_WriteReg用于向LCD指定寄存器写入指定数据,而LCD_ReadReg则用于读取指定寄存器的数据,这两个函数,都只带一个参数/返回值,所以,在有多个参数操作(读取/写入)的时候,就不适合用这两个函数了。
 楼主| 等你下课 发表于 2023-11-21 00:05 | 显示全部楼层
第六个是坐标设置函数,该函数代码如下:
15213655b83c921bf1.png
3441655b83cf1b99a.png
该函数实现将LCD的当前操作点设置到指定坐标(x,y)。因为不同LCD的设置方式不一定完全一样,所以代码里面有好几个判断,对不同的驱动IC进行不同的设置。
 楼主| 等你下课 发表于 2023-11-21 00:05 | 显示全部楼层
第七个是画点函数。该函数实现代码如下:
58855655b83decaf3b.png
该函数实现比较简单,就是先设置坐标,然后往坐标写颜色。其中POINT_COLOR是我们定义的一个全局变量,用于存放画笔颜色,顺带介绍一下另外一个全局变量:BACK_COLOR,该变量代表LCD的背景色。LCD_DrawPoint函数虽然简单,但是至关重要,其他几乎所有上层函数,都是通过调用这个函数实现的。
 楼主| 等你下课 发表于 2023-11-21 00:06 | 显示全部楼层
第八个是读点函数,用于读取LCD的GRAM,这里说明一下,为什么OLED模块没做读GRAM的函数,而这里做了。因为OLED模块是单色的,所需要全部GRAM也就1K个字节,而TFTLCD模块为彩色的,点数也比OLED模块多很多,以16位色计算,一款320×240的液晶,需要320×240×2个字节来存储颜色值,也就是也需要150K字节,这对任何一款单片机来说,都不是一个小数目了。
 楼主| 等你下课 发表于 2023-11-21 00:06 | 显示全部楼层
我们在图形叠加的时候,可以先读回原来的值,然后写入新的值,在完成叠加后,我们又恢复原来的值。这样在做一些简单菜单的时候,是很有用的。这里我们读取TFTLCD模块数据的函数为LCD_ReadPoint,该函数直接返回读到的GRAM值。该函数使用之前要先设置读取的GRAM地址,通过LCD_SetCursor函数来实现。LCD_ReadPoint的代码如下:

5517655b83f8936cd.png
在LCD_ReadPoint函数中,因为我们的代码不止支持一种LCD驱动器,所以,根据不同的LCD驱动器((lcddev.id)型号,执行不同的操作,以实现对各个驱动器兼容,提高函数的通用性。
 楼主| 等你下课 发表于 2023-11-21 00:06 | 显示全部楼层
第9个是字符显示函数LCD_ShowChar,该函数同前面OLED模块的字符显示函数差不多,但是这里的字符显示函数多了一个功能,就是可以以叠加方式显示,或者以非叠加方式显示。叠加方式显示多用于在显示的图片上再显示字符。非叠加方式一般用于普通的显示。该函数实现代码如下:
19898655b840d212f8.png
在LCD_ShowChar函数里面,我们采用快速画点函数LCD_Fast_DrawPoint来画点显示字符,该函数同LCD_DrawPoint一样,只是带了颜色参数,且减少了函数调用的时间,详见本例程源码。该代码中我们用到了三个字符集点阵数据数组asc2_2412、asc2_1206和asc2_1608。
 楼主| 等你下课 发表于 2023-11-21 00:07 | 显示全部楼层
第十个是TFTLCD模块的初始化函数LCD_Init,该函数先初始化STM32与TFTLCD连接的IO口,然后读取LCD控制器的型号,根据控制IC的型号执行不同的初始化代码,其简化代码如下:

82602655b84213e1e5.png

2209655b8428e6463.png
 楼主| 等你下课 发表于 2023-11-21 00:07 | 显示全部楼层
该函数先对STM32与LCD连接的相关IO进行初始化,之后读取LCD控制器型号(LCD ID),根据读到的LCD ID,对不同的驱动器执行不同的初始化代码,其中else if(lcddev.id==0xXXXX),是省略写法,实际上代码里面有十几个这种else if结构,从而可以支持十多款不同的驱动IC执行初始化操作,这样大大提高了整个程序的通用性。大家在以后的学习中应该多使用这样的方式,以提高程序的通用性、兼容性。

注意:本函数使用了printf来打印LCD ID,所以,如果你在主函数里面没有初始化串口,那么将导致程序死在printf里面!!如果不想用printf,那么请注释掉它。
 楼主| 等你下课 发表于 2023-11-21 00:07 | 显示全部楼层
接下来,看看主函数代码:
99762655b84406bc11.png
 楼主| 等你下课 发表于 2023-11-21 00:07 | 显示全部楼层
四、TFTLCD触摸屏实验
1.原理简介
我们将介绍如何使用STM32来驱动触摸屏,NUCLEO-L476RG开发板本身并没有触摸屏控制器,但是它支持触摸屏,可以通过外接带触摸屏的LCD模块(比如ALIENTEK TFTLCD模块),来实现触摸屏控制。

在本章中,我们将向大家介绍STM32控制ALIENTKE TFTLCD模块(包括电阻触摸与电容触摸),实现触摸屏驱动,最终实现一个手写板的功能。
 楼主| 等你下课 发表于 2023-11-21 00:07 | 显示全部楼层
电阻式触摸屏利用压力感应进行触点检测控制,需要直接应力接触,通过检测电阻来定位触摸位置。
电容屏是利用人体感应进行触点检测控制,不需要直接接触或只需要轻微接触,通过检测感应电流来定位触摸坐标。
 楼主| 等你下课 发表于 2023-11-21 00:07 | 显示全部楼层
电阻触摸屏的优点:精度高、价格便宜、抗干扰能力强、稳定性好。 电阻触摸屏的缺点:容易被划伤、透光性不太好、不支持多点触摸。
 楼主| 等你下课 发表于 2023-11-21 00:07 | 显示全部楼层
电容触摸屏的优点:手感好、无需校准、支持多点触摸、透光性好。 电容触摸屏的缺点:成本高、精度不高、抗干扰能力差。
 楼主| 等你下课 发表于 2023-11-21 00:08 | 显示全部楼层
注意:这里特别提醒大家电容触摸屏对工作环境的要求是比较高的,在潮湿、多尘、高低温环境下面,都是不适合使用电容屏的。
 楼主| 等你下课 发表于 2023-11-21 00:08 | 显示全部楼层
XPT2046支持从1.5V到5.25V的低电压I/O接口。XPT2046能通过执行两次A/D转换查出被按的屏幕位置, 除此之外,还可以测量加在触摸屏上的压力。内部自带2.5V参考电压可以作为辅助输入、温度测量和电池监测模式之用,电池监测的电压范围可以从0V到6V。XPT2046片内集成有一个温度传感器。 在2.7V的典型工作状态下,关闭参考电压,功耗可小于0.75mW。XPT2046采用微小的封装形式:TSSOP-16,QFN-16(0.75mm厚度)和VFBGA-48。工作温度范围为-40℃~+85℃。 该芯片完全是兼容ADS7843和ADS7846的,关于这个芯片的详细使用,可以参考这两个芯片的datasheet。
 楼主| 等你下课 发表于 2023-11-21 00:08 | 显示全部楼层
2.功能简介
开机的时候先初始化LCD,读取LCD ID,随后,根据LCD ID判断是电阻触摸屏还是电容触摸屏,如果是电阻触摸屏,则先读取flash的数据判断触摸屏是否已经校准过,如果没有校准,则执行校准程序,校准过后再进入电阻触摸屏测试程序,如果已经校准了,就直接进入电阻触摸屏测试程序。

电阻触摸屏测试程序和电容触摸屏测试程序基本一样,只是电容触摸屏支持最多5点同时触摸,电阻触摸屏只支持一点触摸,其他一模一样。测试界面的右上角会有一个清空的操作区域(RST),点击这个地方就会将输入全部清除,恢复白板状态。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部