打印
[其他ST产品]

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

[复制链接]
楼主: 等你下课
手机看帖
扫描二维码
随时随地手机跟帖
41
等你下课|  楼主 | 2023-11-21 00:08 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
硬件设计
所有这些资源与STM32的连接图,在前面都已经介绍了,这里我们只针对TFTLCD模块与STM32的连接端口再说明一下,TFTLCD模块的触摸屏(电阻触摸屏)总共有5根线与STM32连接,连接电路图如下所示:

使用特权

评论回复
42
等你下课|  楼主 | 2023-11-21 00:08 | 只看该作者
软件设计
打开工程可以发现,我们在工程中添加了touch.c、touch.h等文件,并保存在Drive分组下面。其中,touch.c和touch.h是电阻触摸屏部分的代码。顺带兼电容触摸屏的管理控制,其他则是电容触摸屏部分的代码。

使用特权

评论回复
43
等你下课|  楼主 | 2023-11-21 00:08 | 只看该作者
打开touch.c文件,在里面输入与触摸屏相关的代码(主要是电阻触摸屏的代码),这里我们也不全部贴出来了,仅介绍几个重要的函数。 首先我们要介绍的是TP_Read_XY2这个函数,该函数专门用于从电阻式触摸屏控制IC读取坐标的值(0~4095),TP_Read_XY2的代码如下:


使用特权

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

使用特权

评论回复
45
等你下课|  楼主 | 2023-11-21 00:09 | 只看该作者
该函数采用了一个非常好的办法来读取屏幕坐标值,就是连续读两次,两次读取的值之差不能超过一个特定的值(ERR_RANGE),通过这种方式,我们可以大大提高触摸屏的准确度。另外该函数调用的TP_Read_XY函数,用于单次读取坐标值。TP_Read_XY也采用了一些软件滤波算法,具体见源码。接下来,我们介绍另外一个函数TP_Adjust,该函数源码如下:

使用特权

评论回复
46
等你下课|  楼主 | 2023-11-21 00:09 | 只看该作者
TP_Adjust是此部分最核心的代码,在这里,给大家介绍一下我们这里所使用的触摸屏校正原理:我们传统的鼠标是一种相对定位系统,只和前一次鼠标的位置坐标有关。而触摸屏则是一种绝对坐标系统,要选哪就直接点哪,与相对定位系统有着本质的区别。绝对坐标系统的特点是每一次定位坐标与上一次定位坐标没有关系,每次触摸的数据通过校准转为屏幕上的坐标,不管在什么情况下,触摸屏这套坐标在同一点的输出数据是稳定的。不过由于技术原理的原因,并不能保证同一点触摸每一次采样数据相同,不能保证绝对坐标定位,点不准,这就是触摸屏最怕出现的问题:漂移。对于性能质量好的触摸屏来说,漂移的情况出现并不是很严重。所以很多应用触摸屏的系统启动后,进入应用程序前,先要执行校准程序。 通常应用程序中使用的LCD坐标是以像素为单位的。比如说:左上角的坐标是一组非0的数值,比如(20,20),而右下角的坐标为(220,300)。这些点的坐标都是以像素为单位的,而从触摸屏中读出的是点的物理坐标,其坐标轴的方向、XY值的比例因子、偏移量都与LCD坐标不同,所以,需要在程序中把物理坐标首先转换为像素坐标,然后再赋给POS结构,达到坐标转换的目的。

使用特权

评论回复
47
等你下课|  楼主 | 2023-11-21 00:09 | 只看该作者
校正思路:在了解了校正原理之后,我们可以得出下面的一个从物理坐标到像素坐标的转换关系式: LCDx=xfacPx+xoff; LCDy=yfacPy+yoff;

其中(LCDx,LCDy)是在LCD上的像素坐标,(Px,Py)是从触摸屏读到的物理坐标。xfac,yfac分别是X轴方向和Y轴方向的比例因子,而xoff和yoff则是这两个方向的偏移量。

这样我们只要事先在屏幕上面显示4个点(这四个点的坐标是已知的),分别按这四个点就可以从触摸屏读到4个物理坐标,这样就可以通过待定系数法求出xfac、yfac、xoff、yoff这四个参数。我们保存好这四个参数,在以后的使用中,我们把所有得到的物理坐标都按照这个关系式来计算,得到的就是准确的屏幕坐标。达到了触摸屏校准的目的。

使用特权

评论回复
48
等你下课|  楼主 | 2023-11-21 00:09 | 只看该作者
TP_Adjust就是根据上面的原理设计的校准函数,注意该函数里面多次使用了lcddev.width和lcddev.height,用于坐标设置,主要是为了兼容不同尺寸的LCD(比如320x240、480x320和800x480的屏都可以兼容)。

使用特权

评论回复
49
等你下课|  楼主 | 2023-11-21 00:09 | 只看该作者
接下来看看触摸屏初始化函数:TP_Init,该函数代码如下:

使用特权

评论回复
50
等你下课|  楼主 | 2023-11-21 00:09 | 只看该作者
该函数比较简单,重点说一下:tp_dev.scan,这个结构体函数指针,默认是指向TP_Scan的,如果是电阻屏则用默认的即可。

使用特权

评论回复
51
等你下课|  楼主 | 2023-11-21 00:09 | 只看该作者
上述代码,我们重点看看_m_tp_dev结构体,这个结构体用于管理和记录触摸屏(包括电阻触摸屏与电容触摸屏)相关信息。通过结构体,在使用的时候,我们一般直接调用tp_dev的相关成员函数/变量屏即可达到需要的效果,这种设计简化了接口,且方便管理和维护。

使用特权

评论回复
52
等你下课|  楼主 | 2023-11-21 00:10 | 只看该作者
下面分别介绍一下三个重要的函数。

电阻屏测试函数:

使用特权

评论回复
53
等你下课|  楼主 | 2023-11-21 00:10 | 只看该作者
rtp_test,该函数用于电阻触摸屏的测试,该函数代码比较简单,就是扫描触摸屏,如果触摸屏有按下,则在触摸屏上面划线,如果按中“RST”区域,则执行清屏。

使用特权

评论回复
54
等你下课|  楼主 | 2023-11-21 00:10 | 只看该作者
主函数:
main函数,则比较简单,初始化相关外设,然后去选择执行rtp_test。

使用特权

评论回复
55
等你下课|  楼主 | 2023-11-21 00:10 | 只看该作者
功能实现
手写板展示效果图:

使用特权

评论回复
56
Pulitzer| | 2024-7-11 07:30 | 只看该作者

需要靠近在外部添加一个钳位二极管

使用特权

评论回复
57
童雨竹| | 2024-7-11 09:26 | 只看该作者

ESD电压通过接地放掉

使用特权

评论回复
58
Wordsworth| | 2024-7-11 10:29 | 只看该作者

电阻消耗过电压的能量

使用特权

评论回复
59
公羊子丹| | 2024-7-11 12:25 | 只看该作者

当电路正常工作时,它处于截止状态(高阻态)

使用特权

评论回复
60
万图| | 2024-7-11 13:28 | 只看该作者

在信号线中串联小电阻其主要目的是对引脚的保护

使用特权

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

本版积分规则