一、前言
屏幕是人机交互的重要媒介,而且现在我们产品升级的趋势越来越高大尚,不少产品都会用lcd来做界面,而esp32c3在一些项目上是可以替代主mcu,所以驱动lcd也是必须学会的啦
我新买的这块st7789,突然发现是带触摸功能的,刚好现在学习esp82驱动屏幕的时候,把触摸的功能也试一下。
二、开发准备
1、硬件分析
①、屏幕接口
我是买的带转接板的,直接看转接板的引脚定义吧
我这款是电容屏
②、开发板接口
用到SPI和IIC
外挂的flash,有可能会用到,先贴出来:
③、接线汇总:
因为esp32除了特定引脚,其他都是可以随意配置的,大多我都按合宙给的图来
开发板--------------------------------------------屏幕转接板
GPIO2------------------------------------------SCK
GPIO3------------------------------------------SDI
GPIO19----------------------------------------SDO
GPIO6------------------------------------------LED
GPIO7------------------------------------------CS
GPIO12-----------------------------------------DC
GPIO10------------------------------------------RESET(引脚有点紧张,这里电容屏用的是iic返回信息,MISO可以不接,我用作复位脚了)
GPIO5---------------------------------------------T_CLK
GPIO4---------------------------------------------T_SDI
GPIO18-------------------------------------------T_CS
GPIO19-------------------------------------------T_IRQ
先这样试着吧
2、例程选择
其实因为这款芯片非常火,GitHub、立创上等等很多平台都有开源的驱动屏幕的项目,做得很牛逼,很多都是移植了lvgl的。我就先简单驱动一下,后边看是自己封装显示部分,还是移植u8g2或lvgl,这些都是看需求。
可以看到例程其实已经也比较完整的了,但我还是会修改的比较多
三、初步修改例程
1、宏定义
将例程原本的宏定义修改一下,然后加上IIC的
因为把原先宏定义的名称也改了,所以把报错的地方先改一下:
这里修改完,其实显示部分就没什么问题的了。这例程是自动识别ST7789V或者ILI9341的
我是2.4寸的屏幕 320*240
背光我们这里要改成1,上边截的表有说明
到这里烧录程序,已经可以显示了:
四、触摸部分及显示增加修改例程
1、宏定义
include也列在这吧
尺寸
spi和iic的一些地址
2、变量
跟之前的差不多,一些句柄
touch_event是我用来确保处理之后信号量再次通知,后边会有说到
3、新增加的函数
①、触摸芯片初始化
首先触摸芯片的初始化,跟其他iic没什么区别,就是通过下降沿触发的时候,去读取坐标:
②读取触摸的坐标函数:
③中断处理:
这里我做了确保是低电平和touch_event,其实还应该加一个消抖好点,例如在这里加一个静态变量cnt,cnt累加到一定次数再去xTaskNotifyFromISR
④、清屏和像素点位显示
然后因为例程没有给清屏和显示点像素的函数,自己做了:
⑤主任务
触摸的点位,我会显示白色,超时5s这个注释错了,尴尬,复制上一个工程的,截图的时候没看
我把原先例程显示的图片注释了,变成黑色背景,这样触摸显示点位清晰一点。
⑥原初始化微调
最最后,就是这个屏幕的方向,试了好几次,对比厂家给我的例程才发现写00就好:
五、烧录验证
这些白点就是我触摸的时候显示的。
这是打印出来的坐标信息,可以看到点一下还是会触发很多次,做下消抖或者10ms后再去读触摸芯片的数据会比较好
六、总结
总体来说,就是对着例程和厂家给的屏幕程序来,不会有什么问题。我调的时候有一个地方卡得比较久,就是做填充屏幕函数和点位像素函数的时候,总是会报spi_master: polling can't get buslock,这个应该是多个任务同时尝试访问同一SPI总线会报,但我一开始跑的时候,只执行一句,按理来说不会有多个任务去占用这个spi总线,这个应该是我知识面不足了,后来是看例程的lcd_get_id函数里,有加spi_device_acquire_bus(spi, portMAX_DELAY);spi_device_release_bus(spi);这个总线锁和释放,才解决的。