2026/8/1 21:56:14

1.9英寸LCD模块驱动全攻略:从ST7789/ST7735S到TFT_eSPI实战

1.9英寸LCD模块驱动全攻略:从ST7789/ST7735S到TFT_eSPI实战 1. 项目概述1.9英寸LCD模块的入门与价值最近在捣鼓一个需要小型显示界面的项目选型时1.9英寸的LCD模块进入了我的视线。这尺寸听起来不大但在嵌入式开发、便携设备和DIY项目中它是个非常经典的“甜点”尺寸。比0.96英寸的显示内容多又比2.4或3.5英寸的省电、便宜且易于集成。如果你正在为你的树莓派Pico、Arduino或者STM32寻找一块清晰、够用且驱动简单的屏幕那么深入了解这块1.9英寸LCD模块绝对能让你少走很多弯路。简单来说这是一个对角线为1.9英寸的液晶显示模块。市面上常见的有两种主流驱动芯片ST7789和ST7735S分辨率则多为170x320竖屏或320x170横屏。这种模块通常集成了背光、驱动电路和排针接口我们只需要通过几根线SPI或8位并行与主控MCU连接再写好驱动代码就能点亮它显示文字、图形甚至流畅的动画。它解决的正是小型化、低功耗项目中“人机交互界面”的核心需求无论是做个迷你游戏机、便携式传感器数据显示屏还是智能家居的微型控制面板它都能胜任。2. 核心驱动方案与接口选择当你拿到一块1.9寸LCD模块第一件事不是急着接线而是搞清楚它的“心脏”——驱动芯片是什么以及它支持哪种通信接口。这直接决定了你的硬件连接方式和后续的软件驱动库选择。2.1 驱动芯片辨识ST7789 vs ST7735S市面上绝大多数1.9寸LCD模块都采用这两款由意法半导体ST生产的控制器。它们功能相似但略有区别。ST7789这是更常见于1.9寸模块的驱动芯片尤其是那些170x320分辨率的型号。它支持最高262K色18位RGB 6-6-6格式显存GRAM足够大能完整缓存一屏170x320的图像数据。这意味着在实现全屏刷新或动画时性能表现更稳定。其指令集相对丰富支持局部刷新、睡眠模式等高级功能。ST7735S最初更多用于1.44寸或1.8寸屏但也有一些1.9寸模块使用其变种。它通常支持最高262K色但显存可能较小有时需要主控MCU进行分块刷新。其驱动代码库非常成熟在Arduino社区有大量现成例子。实操心得如何快速分辨最可靠的方法是查看模块背面或卖家提供的资料。如果资料不全可以尝试1观察分辨率170x320的多为ST77892用万用表测量ST7789的典型工作电压是2.8V-3.3VVCC而背光电压LED可能是3.3V或5V3最直接的是尝试用Arduino的TFT_eSPI库分别选择ST7789和ST7735S的配置进行测试哪个能正常显示就用哪个。2.2 通信接口详解SPI与8位并行接口选择是平衡速度和引脚资源的关键。SPI串行外设接口这是最常用、最省引脚的方式。通常需要4-5根线SCK时钟线。MOSI主设备输出从设备输入用于发送命令和数据。DC或RS数据/命令选择线。这是关键拉高时MOSI上传的是要显示的像素数据拉低时传的是控制命令如设置显示区域。CS片选线低电平有效。当连接多个SPI设备时用于选择当前操作的屏幕。RST复位线可选但建议连接。用于硬件复位屏幕解决初始化异常问题。SPI接口的优点是接线简单占用MCU的I/O口少。缺点是刷新速度受限于SPI时钟频率。对于1.9寸170x320的分辨率全屏刷新一帧图像需要传输1703202假设16位色深≈ 108,800字节。在40MHz的SPI时钟下理论刷新率可以达到十几帧每秒对于大多数UI应用足够了。8位并行接口这种方式会占用大量的I/O口通常需要D0-D7共8根数据线外加DC、WR、RD、CS、RST等控制线但优势是速度极快因为它每个时钟周期可以传输8位数据。如果你的主控MCU如STM32F4系列有富裕的I/O且对刷屏速度有极致要求比如显示高速变化的波形可以考虑此方式。但对于Arduino Uno或树莓派Pico这类引脚资源紧张的平台SPI是更务实的选择。注意事项购买模块时务必确认其接口类型。有些模块的排针焊盘同时支持SPI和8位并行需要通过焊点或电阻来选择模式。默认出厂通常是SPI模式。接线前仔细阅读模块的引脚定义图VCC和GND切勿接反背光LED的电压也要匹配接3.3V或5V串联一个限流电阻更安全。3. 硬件连接与供电设计要点正确的硬件连接是成功点亮屏幕的第一步这里面的细节决定了系统的稳定性和寿命。3.1 典型接线方案以SPI接口连接树莓派Pico为例假设我们使用一块基于ST7789、SPI接口的1.9寸LCD模块与树莓派Pico连接。树莓派Pico有硬件SPI接口我们使用其默认的SPI0。LCD模块引脚树莓派Pico GPIO引脚功能说明VCCVSYS 或 3V3(OUT)电源正极3.3V。注意务必确认模块逻辑电压是3.3V兼容。GNDGND电源地。SCL (SCK)GP2 (SPI0 SCK)SPI时钟线。SDA (MOSI)GP3 (SPI0 TX)SPI数据输出线。RES (RST)GP4复位引脚低电平有效。可接任意GPIO。DC (RS)GP5数据/命令选择引脚。可接任意GPIO。CSGP6片选引脚低电平有效。可接任意GPIO。BLK (LED)GP7 (通过一个100Ω电阻)背光控制。可接PWM引脚实现亮度调节。接线时建议使用杜邦线或焊接排针确保接触牢固。对于需要移动的项目可以考虑使用FFC软排线更为可靠。3.2 电源与背光电路设计电源是稳定的基石。1.9寸LCD模块的工作电流不大逻辑部分通常在几十毫安以内但背光LED是耗电大户。全亮时背光电流可能达到60-100mA。逻辑电源VCC必须与MCU的逻辑电平匹配。绝大多数现代MCU如RP2040、ESP32、STM32都是3.3V系统因此模块VCC接3.3V。如果MCU是5V系统如Arduino Uno而模块是3.3V逻辑则必须使用电平转换器或者确认模块是否标称支持5V输入有些模块板载了LDO从5V降压到3.3V。背光电源BLK/LED直接使能最简单的方法是接一个GPIO。输出高电平3.3V或5V点亮输出低电平关闭。务必在GPIO和LED之间串联一个限流电阻电阻值可以根据公式R (Vcc - Vf_led) / I_led计算。其中Vcc是GPIO输出电压如3.3VVf_led是LED正向压降通常约2.8V-3.0VI_led是期望的背光电流可从模块手册查得如60mA。计算可得R (3.3V - 2.9V) / 0.06A ≈ 6.7Ω可以选择一个10Ω/0.25W的电阻。如果没有电阻长时间工作可能烧毁背光LED或损坏GPIO口。PWM调光将BLK接到支持PWM的GPIO上。通过调节PWM的占空比可以无级调节屏幕亮度。这在电池供电的设备中非常有用可以动态降低亮度以节省电量。代码中只需使用analogWriteArduino或设置PWM占空比即可。踩坑记录我曾有一次直接将3.3V接至模块的LED引脚没有加限流电阻。屏幕点亮几分钟后背光区域开始发黄亮度逐渐下降最终彻底熄灭。这就是典型的过流导致LED光衰加速。一个几分钱的电阻就能避免几十块钱的模块损坏。4. 软件驱动与图形库实战硬件连接妥当后我们就进入了软件世界。选择一款高效、易用的驱动库能让你事半功倍。4.1 驱动库选型TFT_eSPI vs. LVGL vs. U8g2对于嵌入式开发有几个图形库值得考虑TFT_eSPIArduino/PlatformIO这是驱动ST7789/ST7735等屏幕的“瑞士军刀”。它本身是一个高度优化的底层驱动库支持多种芯片和接口。你需要编辑库中的用户配置文件User_Setup.h正确选择驱动芯片、设置分辨率、定义引脚然后它就能提供基础的画点、画线、填充、显示位图等函数。它效率高但构建复杂UI需要自己从零开始。LVGLLight and Versatile Graphics Library这是一个开源的高级嵌入式图形库功能极其强大。它自带丰富的控件按钮、标签、滑块、图表等、动画效果、主题系统和多语言支持。你可以先用TFT_eSPI作为它的“显示驱动程序”然后在其上构建复杂的用户界面。LVGL有专门针对STM32、ESP32等的移植示例。学习曲线稍陡但适合需要华丽UI的项目。U8g2这是一个专注于单色图形和文本显示的库但也支持像ST7789这样的彩色屏会以灰度或简单色彩显示。如果你的项目只需要显示文字和简单图标U8g2的字体和绘图API非常易用。它比TFT_eSPILVGL的组合更轻量。对于初学者或快速验证我强烈推荐从TFT_eSPI开始。4.2 使用TFT_eSPI驱动1.9寸ST7789屏以PlatformIO为例下面是一个完整的配置和测试流程步骤一创建项目并安装库在PlatformIO IDE中新建一个项目选择正确的开发板如Raspberry Pi Pico。打开platformio.ini文件在lib_deps部分添加lib_deps bodmer/TFT_eSPI^2.5.0步骤二配置TFT_eSPI库这是最关键的一步。在项目目录下找到并打开.pio/libdeps/[你的环境名]/TFT_eSPI/User_Setup.h这个文件。你需要修改以下关键部分// 取消注释你使用的驱动芯片例如 #define ST7789_DRIVER // 设置分辨率 #define TFT_WIDTH 170 #define TFT_HEIGHT 320 // 定义引脚根据你的实际接线修改 #define TFT_CS 6 // GP6 #define TFT_DC 5 // GP5 #define TFT_RST 4 // GP4 #define TFT_MOSI 3 // GP3 #define TFT_SCLK 2 // GP2 // 定义SPI频率可以尝试提高以获得更快刷新 #define SPI_FREQUENCY 40000000 // 40MHz // 如果屏幕颜色显示异常红蓝互换可能需要交换颜色模式 // #define TFT_RGB_ORDER TFT_RGB // 正常顺序 // #define TFT_RGB_ORDER TFT_BGR // 红蓝交换保存文件。步骤三编写测试代码创建一个main.cpp写入以下基础测试代码#include TFT_eSPI.h TFT_eSPI tft TFT_eSPI(); void setup() { tft.init(); tft.setRotation(1); // 设置屏幕方向0-3分别对应不同旋转角度根据你的安装方式调整 tft.fillScreen(TFT_BLACK); // 清屏为黑色 // 设置文本颜色和大小 tft.setTextColor(TFT_WHITE, TFT_BLACK); tft.setTextSize(2); // 在屏幕中央显示“Hello World” tft.setCursor(20, 120); tft.println(Hello, 1.9\ LCD!); // 画一个红色的矩形框 tft.drawRect(10, 10, 150, 100, TFT_RED); // 填充一个绿色的圆 tft.fillCircle(85, 200, 30, TFT_GREEN); } void loop() { // 主循环可以添加动态效果 static uint32_t lastTime 0; if (millis() - lastTime 1000) { lastTime millis(); // 每秒切换一次屏幕背景色 tft.fillScreen(random(0xFFFF)); // 随机颜色 delay(100); tft.fillScreen(TFT_BLACK); } }编译并上传到你的开发板。如果一切顺利你应该能看到屏幕点亮并显示文字和图形。注意事项如果屏幕白屏、花屏或显示错位请按以下顺序排查1) 检查User_Setup.h中的驱动芯片型号和引脚定义是否完全正确2) 检查硬件接线特别是VCC、GND和DC引脚3) 尝试降低SPI_FREQUENCY如改为200000004) 尝试在tft.init()后添加一小段延时delay(100)5) 检查背光是否点亮。5. 性能优化与高级功能探索当基础显示功能实现后我们通常会追求更流畅的体验和更丰富的功能。这里有几个进阶方向。5.1 提升刷新率与动画流畅度对于170x320的分辨率全屏刷新数据量不小。优化刷新率是关键。使用局部刷新只更新屏幕上发生变化的部分区域而不是整个屏幕。TFT_eSPI库的setAddrWindow和pushColors函数可以配合实现。例如更新一个区域tft.setAddrWindow(x, y, w, h); // 设置要更新的矩形区域 tft.pushColors(buffer, w*h, 1); // 推送颜色数据数组这比调用多次drawPixel或drawLine要快得多。启用双缓冲如果MCU RAM足够在内存中开辟一块和屏幕一样大的缓冲区对于16位色深1703202 ≈ 108KB。所有的绘图操作都先在这个缓冲区中进行完成一帧后一次性通过pushImage函数将整个缓冲区数据发送到屏幕。这可以完全消除屏幕绘制过程中的闪烁感。但请注意树莓派Pico只有264KB RAM分配108KB给显存后要谨慎管理剩余内存。优化SPI时钟和DMA确保在User_Setup.h中设置了尽可能高的SPI_FREQUENCY如80MHz前提是MCU和模块支持。对于像STM32或ESP32这类有DMA直接内存访问控制器的MCU可以配置SPI使用DMA传输。这样MCU在发送显示数据时CPU可以被释放出来处理其他任务极大提高效率。TFT_eSPI库对部分平台如ESP32的DMA有支持。5.2 显示图片与中文字符显示位图BMPTFT_eSPI库内置了drawBmp函数可以直接从SD卡读取并显示24位或16位的BMP图片。你需要先将图片转换为适合屏幕分辨率和色深的BMP格式推荐使用工具如IrfanView或在线转换器。注意从SD卡读取和解码会较慢适合显示静态logo或背景。显示中文字符库本身不支持直接显示中文。有两种主流方案使用位图字体将需要用到的汉字生成点阵字库可以用PCtoLCD等软件然后作为图片数组嵌入代码通过drawBitmap函数显示。优点是显示速度快缺点是字体固定、不灵活且占用程序存储空间。使用LVGL库LVGL内置了完善的字库支持可以轻松添加.bin或.ttf格式的中文字库文件并动态渲染文本。这是构建中文UI的最佳选择但需要引入整个LVGL框架。5.3 低功耗设计考虑对于电池供电的便携设备屏幕往往是耗电大户。动态控制背光如前所述使用PWM动态调节背光亮度。在待机或显示内容简单时将亮度调至最低可接受水平。利用睡眠模式ST7789驱动芯片支持睡眠模式Sleep In。在屏幕长时间不需要显示时可以通过发送命令让屏幕进入睡眠状态此时功耗可以降至微安级别。对应的唤醒命令是Sleep Out。在TFT_eSPI中可以使用tft.writecommand(ST7789_SLPIN)和tft.writecommand(ST7789_SLPOUT)。部分刷新模式有些高级驱动芯片支持仅刷新屏幕上变化的部分区域这比全屏刷新更省电。6. 常见问题排查与实战技巧在实际项目中你几乎一定会遇到各种奇怪的问题。这里汇总了一些典型故障和解决方法。6.1 上电无显示或白屏这是最常见的问题。请按照以下清单逐步排查现象可能原因排查步骤与解决方案屏幕完全无光1. 电源未接通或接反。2. 背光未开启或损坏。3. 模块已损坏。1. 用万用表测量VCC和GND引脚间电压是否为3.3V。2. 测量BLK引脚电压确认背光供电正常。检查限流电阻。3. 尝试用已知好的模块替换测试。屏幕有背光但全白1. 复位时序不正确。2. SPI通信失败引脚接错、频率过高。3. 驱动芯片型号配置错误。1. 确保RST引脚有正确的复位序列先拉低至少10ms再拉高。在setup()中手动执行一次digitalWrite(RST_PIN, LOW); delay(20); digitalWrite(RST_PIN, HIGH); delay(150);。2. 用逻辑分析仪或示波器检查SCK、MOSI、DC线上是否有波形。降低SPI频率再试。3. 核对User_Setup.h中的#define确认是ST7789_DRIVER而非ST7735_DRIVER。屏幕显示错乱、花屏1. 数据/命令DC引脚电平错误。2. 颜色格式或扫描方向设置错误。3. 电源噪声干扰。1. 用逻辑分析仪捕获SPI时序确认在发送像素数据时DC为高发送命令时DC为低。2. 尝试在User_Setup.h中启用或禁用TFT_RGB_ORDER、TFT_INVERSION_ON等宏定义。3. 在VCC和GND之间靠近模块引脚处并联一个10uF和0.1uF的电容以滤除电源噪声。6.2 显示颜色异常或图像错位如果屏幕能亮但颜色不对比如红色显示为蓝色或者图像被旋转、偏移。红蓝颜色交换这是RGB排列顺序的问题。在ST7789的初始化序列中有一个命令通常是0x36内存访问控制MAC的某个位控制着RGB还是BGR顺序。在TFT_eSPI中你可以通过修改User_Setup.h中的TFT_RGB_ORDER来切换// #define TFT_RGB_ORDER TFT_RGB // 正常红绿蓝顺序 #define TFT_RGB_ORDER TFT_BGR // 蓝绿红顺序修改后重新编译上传测试。屏幕方向不对使用tft.setRotation(0)到tft.setRotation(3)进行尝试。参数0-3分别对应0度、90度、180度、270度旋转。这会影响坐标系的起始点和增长方向。显示区域偏移有时屏幕的驱动IC默认配置的显示区域Display Window可能比物理像素区域小或有偏移。这需要在初始化代码中通过发送特定的命令来设置正确的列地址X轴和行地址Y轴范围。在TFT_eSPI的驱动文件TFT_Drivers/ST7789_Init.h中可以找到初始化命令序列。如果你发现图像只显示在屏幕的一部分可能需要在这里调整ST7789_CASET列地址设置和ST7789_RASET行地址设置命令的参数。6.3 刷新速度慢或操作卡顿检查SPI时钟频率确认SPI_FREQUENCY已设置为MCU和模块支持的最高值如40MHz或80MHz。过低的频率是速度瓶颈。避免频繁的全屏清屏tft.fillScreen(TFT_BLACK)会触发一次全屏数据传输非常耗时。在制作动画时考虑只重绘变化的元素或者使用局部刷新。优化图形绘制函数例如画水平或垂直线时使用drawFastHLine和drawFastVLine它们比通用的drawLine函数更快。填充矩形使用fillRect。MCU性能瓶颈如果MCU主频过低如Arduino Uno的16MHz处理复杂的图形计算本身就会很慢。考虑升级到更快的平台如ESP32、STM32F4或者简化UI逻辑。6.4 背光闪烁或亮度不均PWM频率过低如果使用PWM调光并且频率落在人眼可察觉的范围通常低于100Hz就会感觉到闪烁。将PWM频率提高到1kHz以上可以有效解决。在Arduino上可以使用analogWriteFrequency(pin, 1000)如果平台支持来调整频率。电源带载能力不足当背光全亮时瞬间电流较大。如果电源如USB口或LDO输出能力不足或响应慢会导致电压跌落可能引起屏幕复位或显示异常。确保电源能提供至少500mA的稳定电流并在电源输入端并联一个大电容如100uF电解电容。亮度不均这是LCD面板本身的工艺问题边缘可能比中心稍暗。通常属于正常现象如果非常严重可能是背光导光板或LED灯条有问题。经过这些步骤你应该能完全驾驭这块1.9英寸的LCD模块了。从硬件连接到软件驱动从基础显示到性能优化每一个环节的细节都决定了最终项目的稳定性和用户体验。这块小屏幕虽然不起眼但它却是连接数字世界与物理世界、连接代码逻辑与用户感知的重要桥梁。多动手尝试多思考优化你会发现它能实现的远比想象中更多。