TFTLCD 开发记录 -- 7、触摸屏驱动
本文使用到的硬件详情请参见对应文档:软硬件介绍
https://www.bilibili.com/read/cv26771439/?spm_id_from=333.999.0.0
其中7寸触摸屏驱动芯片使用的是GT911,所以,要操作触摸屏首先要编写GT911的驱动代码。通过参考GT911的数据手册发现,要驱动它,原理比较简单,就是使用IIC发送对应寄存器指令即可。
首先,要保证IIC协议可以正常通信,本文使用IO口软件模拟IIC时序,实现IIC通信。IIC通信比较基础,较常用,这里不中详细说明,若有需要,请去本文对应的开源地址GitHub上下载源码。
接下来就是实现GT911通过IIC读写寄存器操作。
写寄存器:
读寄存器数据:
然后是GT911的初始化操作,gt911和其他基于i2c的芯片略有不同,它可以通过,外部引脚INT和RST引脚改变他的地址,一般地址默认是0xBA,通过用INT和RESET引脚可以输入特定的时序,改变他的地址,变为0x28,或者变回0xBA,具体时序图可参见手册。
编写一个修改IIC地址的函数
以上操作正常之后,GT911芯片就正常工作了,此时可以读一下芯片ID,看看督导的ASCII码是否为“911”,是就表示芯片初始化成功,可以读取触摸屏数据了。
读取触摸屏数据需要先判断屏幕上是否有触摸事件产生,要先读取0x814E寄存其中的标志位,判断是否被按下

当有触摸时,寄存器0x814E的最高位(bit7)位会被置位为1, 低4位为触摸的点的数量, 最多支持5个点。我们只要在while中不断轮询判断, 寄存器最高位是否置位,就可以知道, 屏幕是否被触摸,这里需要注意,轮询时间布特太短否则会出现异常, 手册上的参考时间是7.5ms~10ms,另外,当读完寄存器0x814E后, 要手动清0该寄存器, 表示已读, 要不然会不断输出中断信号。
触摸后,读数据寄存器即可得到触摸点的坐标信息:

每个位置信息都由16+16+16位数据表示, 第一个16位是x的位置数据, 第二个16位是y的位置数据, 第三个是位置上的触摸面积。每个16位又由两个寄存器的8位数据构成,先是低8位,后是高8位。寄存器0x8150中读出x的低8位数据,然后读出寄存器0x8151读出x的高8位数据,把数据组合成x的16位的数据,y的数据, 触摸面积数据读出方式一样。
代码如下所示:
至此,GT911触摸屏驱动编写完成,最后可以测试下是否正常,这里的测试方法是,结合上篇文章,检测到触摸点后,在触摸点处画一个半径5的实心圆,测试代码截图如下:

最终效果如下图:

视频演示效果请转至(开源)TFTLCD开发记录--触摸屏
视频下方简介有完整的工程代码开源github上,有需要的小伙伴请自行下载在