网站seo优化检测云服务器能干啥
网站seo优化检测,云服务器能干啥,给彩票网站做代理违法吗,学生个人网页制作素材基于ESP32-S3的1.8寸彩色触摸屏(ST7735SXPT2046)驱动移植与画板应用实战
最近在玩ESP32-S3开发板#xff0c;手头正好有一块1.8寸的SPI彩色触摸屏#xff0c;驱动芯片是ST7735S#xff0c;触摸芯片是XPT2046。很多朋友拿到这种屏幕后#xff0c;不知道如何把官方或社区的驱…基于ESP32-S3的1.8寸彩色触摸屏(ST7735SXPT2046)驱动移植与画板应用实战最近在玩ESP32-S3开发板手头正好有一块1.8寸的SPI彩色触摸屏驱动芯片是ST7735S触摸芯片是XPT2046。很多朋友拿到这种屏幕后不知道如何把官方或社区的驱动代码成功“挪”到自己的ESP-IDF工程里更别提实现一个有趣的触摸应用了。今天我就以实战的角度带你一步步完成这块屏幕的驱动移植并最终实现一个简单的触摸画板功能。整个过程就像搭积木我会把每一步的原理和操作细节都讲清楚确保你跟着做就能成功点亮屏幕并画出第一笔。1. 硬件准备与连接在写代码之前咱们得先把硬件连好。这块1.8寸屏是12Pin的接口采用SPI通信协议。1.1 屏幕规格与引脚说明先来认识一下咱们的“主角”屏幕尺寸1.8英寸分辨率128 x 160像素 (RGB)驱动芯片ST7735S (负责显示)触摸芯片XPT2046 (负责检测触摸)通信接口SPI (Serial Peripheral Interface串行外设接口)工作电压3.3V (和ESP32-S3的IO电压完美匹配)引脚间距2.54mm (就是最常用的排针间距)这块屏需要连接12个引脚。为了方便接线我为你整理了一个推荐连接表。这里我选择使用软件SPI的方式因为软件SPI不限制特定的硬件SPI引脚你可以自由选择ESP32-S3上几乎任何可用的GPIO灵活性非常高。表1屏幕引脚与ESP32-S3连接参考软件SPI屏幕引脚标号屏幕引脚定义连接至ESP32-S3引脚作用说明1LED3.3V背光电源接3.3V常亮2SCKGPIO 12SPI时钟信号3SDAGPIO 11SPI数据信号MOSI4DC (A0)GPIO 10数据/命令选择引脚5RESETGPIO 9复位引脚6CSGPIO 8屏幕片选引脚7GNDGND电源地8VCC3.3V电源正极3.3V9T_CLKGPIO 7触摸芯片SPI时钟10T_CSGPIO 6触摸芯片片选11T_DINGPIO 5触摸芯片数据输入12T_DOGPIO 4触摸芯片数据输出注意上表中的GPIO编号如GPIO 12是你可以根据自己板子空闲情况灵活调整的只要在后续的代码配置中保持一致即可。这是软件SPI的优势。按照上表用杜邦线把屏幕和你的ESP32-S3开发板连接起来。接线时务必仔细接反或接错可能烧坏屏幕或单片机。1.2 理解ESP32-S3的SPI简单说一下原理。SPI是一种高速的全双工通信总线需要至少4根线时钟(SCLK)、主机输出从机输入(MOSI)、主机输入从机输出(MISO)和片选(CS)。ESP32-S3芯片内部集成了4个SPI控制器SPI0 / SPI1主要留给内部Flash和PSRAM使用我们一般不用。SPI2 (GP-SPI2) / SPI3 (GP-SPI3)这是两个通用的SPI控制器可以给我们外设用。不过咱们这次用的是软件模拟SPI。什么意思呢就是不用芯片内置的硬件SPI控制器而是用普通的GPIO引脚通过程序代码模拟出SPI的时序来通信。这样做的好处是引脚分配极其自由不受硬件SPI固定引脚映射的限制特别适合学习、调试或者引脚紧张的情况。缺点是对CPU占用稍高但对于驱动屏幕这种速度要求ESP32-S3完全绰绰有余。2. 驱动代码移植硬件连好了接下来就是“软件搬家”。官方或社区通常已经提供了写好的驱动代码我们的任务就是把这些代码文件放到自己的工程里并告诉编译系统它们的存在。2.1 获取驱动文件首先你需要拿到屏幕的驱动代码。通常供应商会提供一个资料包。假设你已经下载并解压里面应该有两个关键的文件夹或文件集LCD驱动用于控制ST7735S显示芯片文件夹名可能叫LCD、ST7735或OLED虽然屏不是OLED但驱动结构类似。TOUCH驱动用于读取XPT2046触摸芯片的数据文件夹名可能叫TOUCH或XPT2046。这两个文件夹里一般包含.c源文件和.h头文件。2.2 将驱动文件加入你的工程假设你已经在VSCode中使用ESP-IDF创建了一个空工程工程目录下有一个main文件夹。复制文件将下载到的LCD和TOUCH两个文件夹整个复制到你工程的main目录下。现在你的main文件夹里应该至少有main.c、CMakeLists.txt以及LCD和TOUCH这两个新文件夹。配置CMakeLists.txt这是关键一步目的是告诉ESP-IDF的构建系统你新加入的.c文件也需要被编译。用VSCode打开main文件夹下的CMakeLists.txt文件。默认的CMakeLists.txt可能只有简单几行。我们需要在其中添加新源文件的路径。找到idf_component_register部分在SRCS那一项后面添加你刚复制进来的.c文件。修改后的CMakeLists.txt核心部分看起来像这样idf_component_register(SRCS main.c LCD/lcd.c LCD/lcd_init.c TOUCH/touch.c INCLUDE_DIRS . LCD TOUCH)SRCS后面列出了所有需要编译的C源文件。你需要根据实际文件名调整比如你的文件可能叫st7735.c或xpt2046.c。INCLUDE_DIRS后面添加了头文件所在的目录LCD和TOUCH这样编译器才能找到对应的.h文件。提示如果驱动文件夹里还有字体文件font.c或图片文件pic.c也需要一并添加到SRCS列表中。3. 引脚配置与驱动初始化驱动文件放好了但代码里用的引脚号可能还是默认值不一定和我们刚才的接线表一致。所以我们需要根据表1的接线修改驱动代码中的引脚定义。3.1 修改LCD驱动引脚通常在LCD文件夹的lcd_init.h或lcd.h文件中会有一系列#define来定义引脚。找到它们并修改成我们表1中对应的GPIO号。例如你可能会找到如下代码将其修改// 修改前示例你的可能不同 #define LCD_SCLK_GPIO_NUM 18 #define LCD_MOSI_GPIO_NUM 23 #define LCD_DC_GPIO_NUM 5 #define LCD_RESET_GPIO_NUM 4 #define LCD_CS_GPIO_NUM 2 // 修改后根据我们的表1 #define LCD_SCLK_GPIO_NUM 12 // 对应屏幕SCK接GPIO12 #define LCD_MOSI_GPIO_NUM 11 // 对应屏幕SDA接GPIO11 #define LCD_DC_GPIO_NUM 10 // 对应屏幕DC接GPIO10 #define LCD_RESET_GPIO_NUM 9 // 对应屏幕RESET接GPIO9 #define LCD_CS_GPIO_NUM 8 // 对应屏幕CS接GPIO83.2 修改TOUCH驱动引脚同样在TOUCH文件夹的touch.h或类似文件中修改触摸芯片的引脚定义。// 修改前示例 #define TP_CLK_GPIO_NUM 25 #define TP_CS_GPIO_NUM 26 #define TP_DIN_GPIO_NUM 27 #define TP_DOUT_GPIO_NUM 14 // 修改后根据我们的表1 #define TP_CLK_GPIO_NUM 7 // 对应屏幕T_CLK接GPIO7 #define TP_CS_GPIO_NUM 6 // 对应屏幕T_CS接GPIO6 #define TP_DIN_GPIO_NUM 5 // 对应屏幕T_DIN接GPIO5 #define TP_DOUT_GPIO_NUM 4 // 对应屏幕T_DO接GPIO44. 编写画板测试程序一切配置就绪现在可以编写我们的主程序main.c了。这个程序的目标是初始化屏幕和触摸然后在屏幕上实时显示触摸点的坐标并实现画线功能。4.1 程序框架与初始化打开main/main.c替换为以下代码。代码中包含了详细的注释帮你理解每一部分在做什么。#include stdio.h #include inttypes.h #include sdkconfig.h #include freertos/FreeRTOS.h #include freertos/task.h #include esp_chip_info.h #include esp_flash.h #include esp_timer.h // 引入我们移植的驱动头文件 #include lcd_init.h #include lcd.h #include touch.h void app_main(void) { // 用于记录上一次触摸点的坐标实现连续画线 u16 last_pos[2]; // 1. 初始化LCD屏幕 LCD_Init(); // 清屏为白色 LCD_Fill(0, 0, LCD_W, LCD_H, WHITE); // 将上一次坐标标记为无效值0xFFFF last_pos[0] 0xFFFF; // 2. 初始化触摸芯片 TP_Init(); // 3. 在屏幕底部固定位置创建坐标显示区域 // 显示X:标签 LCD_ShowString(10, LCD_H - 40, (uint8_t *)X:, RED, WHITE, 16, 0); // 初始显示X坐标为0 LCD_ShowIntNum(26, LCD_H - 40, 0, 3, RED, WHITE, 16); // 显示Y:标签 LCD_ShowString(10, LCD_H - 20, (uint8_t *)Y:, RED, WHITE, 16, 0); // 初始显示Y坐标为0 LCD_ShowIntNum(26, LCD_H - 20, 0, 3, RED, WHITE, 16);4.2 主循环触摸扫描与画线初始化完成后程序进入一个无限循环不断检测触摸并更新显示。while (1) { // 扫描触摸状态参数0表示连续扫描模式 tp_dev.scan(0); // 判断是否有触摸按下 (TP_PRES_DOWN是触摸按下的状态标志位) if (tp_dev.sta TP_PRES_DOWN) { // 必要的短延时用于去抖动防止误触发 delay_ms(1); // 判断触摸点坐标是否在屏幕有效区域内避免边缘误触 // tp_dev.x[0]和tp_dev.y[0]存储了第一个触摸点的坐标 if ((tp_dev.x[0] (LCD_W - 1) tp_dev.x[0] 1) (tp_dev.y[0] (LCD_H - 1) tp_dev.y[0] 1)) { // 如果是第一次有效触摸last_pos还是无效值 if (last_pos[0] 0xFFFF) { // 直接记录当前点不画线因为画线需要两个点 last_pos[0] tp_dev.x[0]; last_pos[1] tp_dev.y[0]; } else { // 从上一个触摸点(last_pos)到当前触摸点画一条蓝色的线 LCD_DrawRoughLine(last_pos[0], last_pos[1], tp_dev.x[0], tp_dev.y[0], BLUE); // 更新“上一个点”为当前点为画下一段线做准备 last_pos[0] tp_dev.x[0]; last_pos[1] tp_dev.y[0]; } // 在屏幕底部更新显示当前的X、Y坐标 LCD_ShowString(10, LCD_H - 40, (uint8_t *)X:, RED, WHITE, 16, 0); LCD_ShowIntNum(26, LCD_H - 40, tp_dev.x[0], 3, RED, WHITE, 16); LCD_ShowString(10, LCD_H - 20, (uint8_t *)Y:, RED, WHITE, 16, 0); LCD_ShowIntNum(26, LCD_H - 20, tp_dev.y[0], 3, RED, WHITE, 16); } } else { // 如果没有触摸按下将上一次坐标标记为无效 // 这样下次触摸开始时会被认为是新的起点 last_pos[0] 0xFFFF; } // 主循环延时控制触摸扫描频率这里约10Hz delay_ms(100); } }5. 编译、烧录与调试代码写完了最后一步就是让它跑起来。编译工程在VSCode中按F1键输入ESP-IDF: Build your project并选择或者使用界面上的编译按钮。确保终端没有报错。连接开发板用USB线将ESP32-S3开发板连接到电脑。选择串口在VSCode底部状态栏点击选择正确的串口号。烧录程序按F1输入ESP-IDF: Flash (UART)并选择开始烧录。打开串口监视器程序烧录完成后打开串口监视器波特率通常为115200你会看到ESP32的启动日志。如果一切顺利你的1.8寸屏幕应该会先白屏然后在底部显示“X: 0 Y: 0”。此时用指甲或触笔点击屏幕你会看到坐标值变化并且手指划过的地方会留下蓝色的轨迹一个简单的触摸画板就实现了常见问题排查屏幕不亮/白屏首先检查背光LED引脚1是否接了3.3V。然后检查电源VCC和GND是否接反或接触不良。最后检查SPI数据线SCK, SDA是否接对。触摸无反应重点检查触摸芯片的4根SPI线T_CLK, T_CS, T_DIN, T_DO连接是否正确以及代码中的引脚定义是否与实物接线一致。编译报错“找不到头文件”回头仔细检查CMakeLists.txt中INCLUDE_DIRS的路径添加是否正确以及头文件是否真的在那些文件夹里。这个画板示例虽然简单但它完整验证了屏幕显示和触摸输入两大核心功能。基于这个框架你可以轻松扩展出更复杂的UI、菜单或者游戏。希望这篇教程能帮你顺利点亮手中的屏幕享受嵌入式开发的乐趣。