当前位置: 首页 > article >正文

ESP32-idf学习(四)esp32C3驱动lcd

一、前言

屏幕是人机交互的重要媒介,而且现在我们产品升级的趋势越来越高大尚,不少产品都会用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);这个总线锁和释放,才解决的。

http://www.lryc.cn/news/2394694.html

相关文章:

  • 【python】uv管理器
  • 关于Web安全:7. WebShell 管理与持久化后门
  • 音视频中的复用器
  • 戴尔AI服务器订单激增至121亿美元,但传统业务承压
  • 远程线程注入
  • 如何手搓扫雷(待扩展)
  • 俄军操作系统 Astra Linux 安装教程
  • 第三方软件评测机构如何助力软件品质提升及企业发展?
  • Python打卡训练营Day40
  • 【仿生系统】爱丽丝机器人的设想(可行性优先级较高)
  • JS逆向案例—喜马拉雅xm-sign详情页爬取
  • 钩子函数的作用(register_hook)
  • 电子电路:深入了解CMOS技术构造和工作原理
  • STM32CubeMX定时器配置
  • QNAP MEMOS 域名访问 SSL(Lucky)
  • 跟单业务并发量分析
  • 如何将多张图组合到一张图里同时保留高的分辨率(用PPT+AdobeAcrobat)
  • pycharm找不到高版本conda问题
  • 支持selenium的chrome driver更新到137.0.7151.55
  • 2025年上半年软考系统架构设计师--案例分析试题与答案
  • Eclipse 插件开发 5.2 编辑器 获取当前编辑器
  • 讲述我的plc自学之路 第十二章
  • Visual Studio 的下载安装
  • C# 如何获取当前成员函数的函数名
  • 苍茫命令行:linux模拟实现,书写微型bash
  • 虚拟DOM和DOM是什么?有什么区别?虚拟DOM的优点是什么?
  • 累加法求数列通项公式
  • 鸿蒙NEXT应用加固工具哪家更好?国内主流的6款对比
  • 高效多线程图像处理实战
  • [特殊字符]《计算机组成原理》第 8 章 - CPU 的结构和功能