打印
[其他ST产品]

如何使用STM32 HAL库驱动TFT-LCD实现手画板功能

[复制链接]
楼主: 等你下课
手机看帖
扫描二维码
随时随地手机跟帖
21
等你下课|  楼主 | 2023-11-21 00:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
我们知道,宏定义函数的好处就是速度快(直接嵌到被调用函数里面去了),坏处就是占空间大。在LCD_Init函数里面,有很多地方要写数据,如果全部用宏定义的LCD_WR_DATA函数,那么就会占用非常大的flash,所以我们这里另外实现一个函数:LCD_WR_DATAX,专门给LCD_Init函数调用,从而大大减少flash占用量。

使用特权

评论回复
22
等你下课|  楼主 | 2023-11-21 00:04 | 只看该作者
第三个是LCD_WR_REG函数:该函数是通过8080并口向LCD模块写入寄存器命令,因为该函数使用频率不是很高,我们不采用宏定义来做(宏定义占用FLASH较多),通过LCD_RS来标记是写入命令(LCD_RS=0)还是数据(LCD_RS=1)。该函数代码如下:

使用特权

评论回复
23
等你下课|  楼主 | 2023-11-21 00:04 | 只看该作者
既然有写寄存器命令函数,那就有读寄存器数据函数。

第四个是LCD_RD_DATA函数:该函数用来读取LCD控制器的寄存器数据(非GRAM数据),该函数代码如下:

使用特权

评论回复
24
等你下课|  楼主 | 2023-11-21 00:05 | 只看该作者
以上4个函数,用于实现LCD基本的读写操作。

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

第五个是LCD_WriteReg和LCD_ReadReg函数,这两个函数代码如下:

使用特权

评论回复
25
等你下课|  楼主 | 2023-11-21 00:05 | 只看该作者


这两个函数函数十分简单,LCD_WriteReg用于向LCD指定寄存器写入指定数据,而LCD_ReadReg则用于读取指定寄存器的数据,这两个函数,都只带一个参数/返回值,所以,在有多个参数操作(读取/写入)的时候,就不适合用这两个函数了。

使用特权

评论回复
26
等你下课|  楼主 | 2023-11-21 00:05 | 只看该作者
第六个是坐标设置函数,该函数代码如下:


该函数实现将LCD的当前操作点设置到指定坐标(x,y)。因为不同LCD的设置方式不一定完全一样,所以代码里面有好几个判断,对不同的驱动IC进行不同的设置。

使用特权

评论回复
27
等你下课|  楼主 | 2023-11-21 00:05 | 只看该作者
第七个是画点函数。该函数实现代码如下:

该函数实现比较简单,就是先设置坐标,然后往坐标写颜色。其中POINT_COLOR是我们定义的一个全局变量,用于存放画笔颜色,顺带介绍一下另外一个全局变量:BACK_COLOR,该变量代表LCD的背景色。LCD_DrawPoint函数虽然简单,但是至关重要,其他几乎所有上层函数,都是通过调用这个函数实现的。

使用特权

评论回复
28
等你下课|  楼主 | 2023-11-21 00:06 | 只看该作者
第八个是读点函数,用于读取LCD的GRAM,这里说明一下,为什么OLED模块没做读GRAM的函数,而这里做了。因为OLED模块是单色的,所需要全部GRAM也就1K个字节,而TFTLCD模块为彩色的,点数也比OLED模块多很多,以16位色计算,一款320×240的液晶,需要320×240×2个字节来存储颜色值,也就是也需要150K字节,这对任何一款单片机来说,都不是一个小数目了。

使用特权

评论回复
29
等你下课|  楼主 | 2023-11-21 00:06 | 只看该作者
我们在图形叠加的时候,可以先读回原来的值,然后写入新的值,在完成叠加后,我们又恢复原来的值。这样在做一些简单菜单的时候,是很有用的。这里我们读取TFTLCD模块数据的函数为LCD_ReadPoint,该函数直接返回读到的GRAM值。该函数使用之前要先设置读取的GRAM地址,通过LCD_SetCursor函数来实现。LCD_ReadPoint的代码如下:


在LCD_ReadPoint函数中,因为我们的代码不止支持一种LCD驱动器,所以,根据不同的LCD驱动器((lcddev.id)型号,执行不同的操作,以实现对各个驱动器兼容,提高函数的通用性。

使用特权

评论回复
30
等你下课|  楼主 | 2023-11-21 00:06 | 只看该作者
第9个是字符显示函数LCD_ShowChar,该函数同前面OLED模块的字符显示函数差不多,但是这里的字符显示函数多了一个功能,就是可以以叠加方式显示,或者以非叠加方式显示。叠加方式显示多用于在显示的图片上再显示字符。非叠加方式一般用于普通的显示。该函数实现代码如下:

在LCD_ShowChar函数里面,我们采用快速画点函数LCD_Fast_DrawPoint来画点显示字符,该函数同LCD_DrawPoint一样,只是带了颜色参数,且减少了函数调用的时间,详见本例程源码。该代码中我们用到了三个字符集点阵数据数组asc2_2412、asc2_1206和asc2_1608。

使用特权

评论回复
31
等你下课|  楼主 | 2023-11-21 00:07 | 只看该作者
第十个是TFTLCD模块的初始化函数LCD_Init,该函数先初始化STM32与TFTLCD连接的IO口,然后读取LCD控制器的型号,根据控制IC的型号执行不同的初始化代码,其简化代码如下:




使用特权

评论回复
32
等你下课|  楼主 | 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,那么请注释掉它。

使用特权

评论回复
33
等你下课|  楼主 | 2023-11-21 00:07 | 只看该作者
接下来,看看主函数代码:

使用特权

评论回复
34
等你下课|  楼主 | 2023-11-21 00:07 | 只看该作者
四、TFTLCD触摸屏实验
1.原理简介
我们将介绍如何使用STM32来驱动触摸屏,NUCLEO-L476RG开发板本身并没有触摸屏控制器,但是它支持触摸屏,可以通过外接带触摸屏的LCD模块(比如ALIENTEK TFTLCD模块),来实现触摸屏控制。

在本章中,我们将向大家介绍STM32控制ALIENTKE TFTLCD模块(包括电阻触摸与电容触摸),实现触摸屏驱动,最终实现一个手写板的功能。

使用特权

评论回复
35
等你下课|  楼主 | 2023-11-21 00:07 | 只看该作者
电阻式触摸屏利用压力感应进行触点检测控制,需要直接应力接触,通过检测电阻来定位触摸位置。
电容屏是利用人体感应进行触点检测控制,不需要直接接触或只需要轻微接触,通过检测感应电流来定位触摸坐标。

使用特权

评论回复
36
等你下课|  楼主 | 2023-11-21 00:07 | 只看该作者
电阻触摸屏的优点:精度高、价格便宜、抗干扰能力强、稳定性好。 电阻触摸屏的缺点:容易被划伤、透光性不太好、不支持多点触摸。

使用特权

评论回复
37
等你下课|  楼主 | 2023-11-21 00:07 | 只看该作者
电容触摸屏的优点:手感好、无需校准、支持多点触摸、透光性好。 电容触摸屏的缺点:成本高、精度不高、抗干扰能力差。

使用特权

评论回复
38
等你下课|  楼主 | 2023-11-21 00:08 | 只看该作者
注意:这里特别提醒大家电容触摸屏对工作环境的要求是比较高的,在潮湿、多尘、高低温环境下面,都是不适合使用电容屏的。

使用特权

评论回复
39
等你下课|  楼主 | 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。

使用特权

评论回复
40
等你下课|  楼主 | 2023-11-21 00:08 | 只看该作者
2.功能简介
开机的时候先初始化LCD,读取LCD ID,随后,根据LCD ID判断是电阻触摸屏还是电容触摸屏,如果是电阻触摸屏,则先读取flash的数据判断触摸屏是否已经校准过,如果没有校准,则执行校准程序,校准过后再进入电阻触摸屏测试程序,如果已经校准了,就直接进入电阻触摸屏测试程序。

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则