搞懂ST7735:从引脚到显示,一屏背后的工程细节
你有没有遇到过这样的场景?接上一块1.8寸彩屏,代码烧进去,结果屏幕要么全白、要么发紫,甚至干脆没反应。调试半天,发现不是线接错了,就是初始化序列用错了——而这块“背锅”的芯片,大概率就是ST7735。
作为嵌入式开发中最常见的TFT驱动IC之一,ST7735 虽然体积小、价格便宜,但背后却藏着不少“坑”。想要让它乖乖听话,光靠复制别人的例程可不够。今天我们就来拆开讲透:它到底怎么工作?每个引脚起什么作用?为什么有时候颜色不对、画面偏移?
不玩虚的,只讲实战中真正影响显示效果的核心逻辑。
为什么是ST7735?它凭什么火?
在智能手表、迷你气象站、DIY示波器这些小设备里,我们总能看到一块小小的彩色屏幕。它们分辨率不高(通常是128×160),但足够显示图标、文字和简单图形。这类屏幕的背后,往往站着同一个“幕后推手”——ST7735。
这款由Sitronix(矽创电子)推出的TFT控制器,之所以能在Arduino、ESP32、STM32等平台上广泛流行,靠的是三个字:省事。
- 它支持SPI四线通信,仅需5~6个IO就能驱动;
- 内置升压电路,单3.3V供电即可点亮;
- 集成显存(GRAM),MCU无需外挂帧缓冲;
- 社区生态成熟,Adafruit等开源库直接可用。
换句话说,哪怕你是刚入门的开发者,也能在半小时内点亮一块彩屏。但如果你真想把它用稳、用好,就得往下挖一层:搞清楚它是如何把一串SPI数据变成你看到的画面的。
ST7735是怎么把数据变画面的?
别看它只是个小小黑点,ST7735其实是个“五脏俱全”的微型显示系统。我们可以把它想象成一个带办公室的小工厂:
工厂四大核心模块
| 模块 | 功能 |
|---|---|
| 接口逻辑 | 接收主控发来的命令和数据(SPI或并行) |
| 命令解析器 | 判断这是“设置方向”还是“开始画图” |
| GRAM显存 | 存储每一个像素的颜色值(16位/像素) |
| 时序控制器 | 控制LCD逐行扫描,把显存内容刷到屏幕上 |
整个过程就像这样流转:
- MCU通过SPI发送一条命令,比如
0x2C—— 这意味着“接下来我要往显存写数据了”; - ST7735收到后,内部状态机识别这条指令,准备进入“写GRAM模式”;
- 紧接着,MCU发送一大段RGB565格式的像素数据,ST7735自动按地址顺序存入GRAM;
- 同时,芯片内部的时序控制器持续读取GRAM内容,生成行列驱动信号,推动液晶分子偏转;
- 最终,你在屏幕上看到了图像。
听起来很流畅?别急,中间任何一个环节出错,都会导致花屏、偏色、黑屏……
关键参数一览:选型前必须知道的事
在动手连线之前,先记住几个硬性指标:
| 参数 | 数值 | 实际意义 |
|---|---|---|
| 分辨率 | 128×160 | 可寻址像素数,注意实际可视区域可能略小 |
| 色深 | 16位(RGB565) | 每像素用2字节表示,共65,536色 |
| 接口速率 | 最高15MHz SPI | 建议控制在8~10MHz以内更稳定 |
| 工作电压 | 2.2V ~ 3.6V | 必须使用3.3V电源!5V会烧毁 |
| 显存大小 | 132×162×18-bit | 实际可用为128×160,多余用于边界补偿 |
| 功耗 | 正常约8mA,睡眠模式μA级 | 适合电池供电项目 |
⚠️ 特别提醒:虽然有些模块标称“兼容5V”,但ST7735本体是纯3.3V器件。长期接入5V IO,轻则通信异常,重则永久损坏。
引脚详解:每一根线都不能乱接
市面上常见的ST7735模块通常有8~10个引出脚。虽然名字五花八门(TFT_SCLK、SDIN、A0……),但功能基本一致。下面这张表帮你理清每根线的真实身份:
| 引脚名 | 常见别名 | 方向 | 作用说明 |
|---|---|---|---|
| VCC | VDD | 输入 | 接3.3V电源,务必加0.1μF去耦电容 |
| GND | GND | 输入 | 接地,建议就近接地 |
| SCL / SCK | CLK、SCLK | 输入 | SPI时钟线,上升沿采样数据 |
| SDA / MOSI | DIN、SDIN | 输入 | 主控发送数据,传命令和像素 |
| CS | CE | 输入 | 片选,低电平使能通信 |
| DC / A0 | RS | 输入 | 关键!高=数据,低=命令 |
| RST / RES | RESET | 输入 | 复位信号,低电平有效,建议接MCU控制 |
| BLK / LED / BACKLIGHT | LIGHT | 输入 | 背光控制,可接PWM调亮度 |
| MISO | DOUT | 输出 | 读取寄存器用,多数情况悬空 |
📌重点提示:DC引脚决定一切
很多人忽略这一点:ST7735靠DC引脚区分“命令”和“数据”。
举个例子:
- 当你要发送命令0x28(关闭显示),必须先把DC拉低,再发字节;
- 而当你发送成千上万的像素数据时,DC必须保持高电平。
一旦DC接反或者没控制好,就会出现“命令当数据处理”或“数据被当成命令执行”的问题,轻则显示错乱,重则死机。
典型连接方式(以STM32为例)
假设你用的是STM32F1系列,SPI1接口,可以这样连接:
MCU (STM32) ↔ ST7735 Module ----------------------------------------------- PA5 (SPI1_SCK) → SCL PA7 (SPI1_MOSI) → SDA PB6 → DC PB7 → CS PB8 → RST PB9 (TIM4_CH4) → BLK (PWM调光) 3.3V → VCC GND → GND注意事项:
- 使用硬件SPI比模拟SPI效率高得多;
- CS最好由MCU控制,不要直接接地(避免总线冲突);
- 如果使用Arduino Uno这类5V MCU,必须加电平转换器!
初始化为啥这么重要?不同“Tab”有何区别?
你以为只要通电就能显示?错。ST7735 上电后处于未知状态,必须通过一系列寄存器配置才能正常工作。
这个过程叫做初始化序列(Initialization Sequence),通常包含以下步骤:
- 拉低RST至少10ms,复位芯片;
- 拉高RST,延时120ms等待内部电路稳定;
- 发送多条命令配置电源参数、伽马曲线、显示方向等;
- 开启显示(
DISPON, 0xAF)。
但这里有个大坑:不同版本的ST7735模块需要不同的初始化配置!
常见类型包括:
| 类型 | 特征 | 初始化差异 |
|---|---|---|
| Red Tab(红标签) | 背面贴红色胶布 | 使用特定伽马校正表 |
| Green Tab(绿标签) | 背面绿色标记 | 默认gamma设置较亮 |
| Black Tab(黑标签) | PCB黑色,无标签 | 通常兼容Red Tab配置 |
| Mini (1.44”) | 小尺寸版本 | 地址窗口偏移不同 |
👉 举个真实案例:
如果你拿适用于Red Tab的初始化代码去驱动Green Tab模块,很可能得到一片惨白或偏蓝的屏幕——因为伽马参数不匹配,导致对比度过高。
✅ 解决方案:使用Adafruit_ST7735库时,务必根据你的模块选择正确的构造函数,例如:
// Red Tab 模块 Adafruit_ST7735 tft = Adafruit_ST7735(&SPI, CS, DC, RST); tft.initR(INITR_REDTAB); // Green Tab 模块 tft.initR(INITR_GREENTAB);否则,再好的代码也救不了你的屏。
常见问题排查指南
❌ 问题1:屏幕全白,但没有任何内容
可能原因:
- GRAM地址窗口未正确设置(setAddrWindow()没调用)
- 初始化序列错误(尤其是MADCTL方向寄存器)
- CS或DC接反
解决方法:
- 检查是否设置了正确的(x,y,width,height)区域;
- 打印调试信息确认初始化流程走到哪一步;
- 用万用表测DC电平变化,确认其随命令/数据切换而翻转。
❌ 问题2:颜色发紫、偏绿或倒过来
根本原因:RGB排列顺序错误!
ST7735 支持两种像素格式:
- RGB:红→绿→蓝
- BGR:蓝→绿→红(很多国产屏默认为此)
如果软件认为是RGB,但硬件是BGR,就会导致颜色严重失真。
🔧 修复方式:发送MADCTL命令(0x36),设置第3位(RGB/BGR标志):
// 设置为BGR模式(常见于廉价模块) uint8_t madctl = 0x08; // RGB->BGR sendCmd(0x36); sendData(madctl);也可以通过库函数一键切换:
tft.setSwapBytes(true); // 自动交换R/B字节❌ 问题3:SPI通信失败,无响应
排查清单:
- ✅ 接线是否牢固?特别是SCK和MOSI;
- ✅ SPI模式是否为Mode 0(CPOL=0, CPHA=0)?
- ✅ SPI频率是否过高?先降到4MHz试试;
- ✅ CS是否始终拉低?或未启用?
💡 小技巧:可以用逻辑分析仪抓包,查看是否有SCK波形、MOSI数据流,快速定位是硬件还是软件问题。
实战优化建议:让显示更稳更快
✅ 使用成熟的驱动库
强烈推荐组合拳:
- Adafruit_GFX :基础绘图引擎
- Adafruit_ST7735 :专为ST7735优化
优点:
- 自动处理不同Tab类型的初始化;
- 提供drawPixel、drawCircle、print等高级API;
- 支持字体渲染、旋转屏幕等功能。
✅ 合理控制刷新频率
ST7735 的SPI带宽有限(即使10MHz,理论也只有1.25MB/s)。频繁全屏刷新会导致卡顿。
✔️ 推荐做法:
- 只更新变化区域(“脏矩形”机制);
- 对静态内容缓存图像块(如logo);
- 使用局部窗口更新命令(CASET,RASET)限定范围。
✅ 背光PWM调光节能
BLK引脚支持PWM输入,可用于调节亮度:
analogWrite(BLK_PIN, 128); // 50%亮度好处:
- 白天提亮,夜间调暗保护眼睛;
- 显著降低功耗,延长续航。
总结:ST7735的价值不在“快”,而在“稳”
ST7735 并不是性能最强的TFT控制器(相比ILI9341、RM67162差远了),但它胜在简单可靠、成本极低、生态完善。
对于大多数不需要高速动画的应用来说——比如仪表盘、菜单界面、传感器数据显示——它完全够用,甚至可以说是性价比之王。
掌握它的关键,从来不是背下所有寄存器地址,而是理解:
- DC引脚决定了通信语义
- 初始化序列必须匹配硬件版本
- 电源干净、接线准确是前提
- 颜色异常多半是BGR/RGB搞反了
把这些底层逻辑吃透,下次再遇到“白屏”、“紫屏”、“偏移”,你就不会再盲目换线、重烧程序,而是能快速定位到真正的症结所在。
毕竟,在嵌入式世界里,能解决问题的,永远是懂原理的人。
如果你正在做一款带屏的小产品,或者想给自己的项目加个可视化界面,不妨试试这块经典小屏。只要用心调,它一定能给你稳定的回报。
你在使用ST7735时踩过哪些坑?欢迎留言分享经验,我们一起避坑前行。