问题解决

ST7735 屏幕边缘出现彩色花线:INITR_BLACKTAB 和 GREENTAB 怎么选

1.8 英寸 128×160 ST7735 已经能显示主体,右侧和底部却留下固定彩线。本文用一次单变量实测说明如何从画面偏移判断初始化参数不匹配,并验证 INITR_GREENTAB 是否适合当前面板。

如果 ST7735 的主体画面正常,但右侧或底部出现固定、连续的窄彩线,先不要急着判断屏幕损坏。保持接线和绘图代码不变,优先检查 initR() 的面板初始化类型与地址偏移。

问题不是“完全不显示”,而是边缘没有被正确覆盖

我在正在制作的 ESP32-S3 AI 语音对话原型中换用了一块 1.8 英寸、128×160 的 ST7735 屏幕。程序上传后,小圆脸已经完整显示,说明屏幕供电、SPI 通信和主体绘图都在工作。

但仔细看,画面右侧和底部仍有很细的彩色花线。它们集中在边缘,形状连续而固定,并没有随机散布在整个画面里。

修复前的 ST7735 实物画面,主体表情已经显示,右侧和底部边缘仍可见细窄彩线。

修复前的 ST7735 实物画面,主体表情已经显示,右侧和底部边缘仍可见细窄彩线。

看到异常时,我最初仍然怀疑屏幕本身有问题。转折来自公开记录学习过程后收到的一条评论:有人提醒我检查画面是否存在“偏移”。这个关键词把问题从“屏幕是不是坏了”变成了一个更具体的问题——程序写入的坐标,是否和这块面板真正的可见区域对齐?

先确认屏幕,再讨论初始化参数

这块模块背面明确标注 DRIVER IC: ST7735,正面规格为 1.8 英寸、128×160,接口为 SPI。这里的分辨率只能说明可见区域大小,不能单独决定应该选择哪一种 initR() 参数。

屏幕模块背面与排针实物,可见 DRIVER IC: ST7735 和模块版本丝印。

屏幕模块背面与排针实物,可见 DRIVER IC: ST7735 和模块版本丝印。

Adafruit 的 ST7735 库同时提供 INITR_BLACKTAB、INITR_GREENTAB、INITR_REDTAB 等选项。它们不是单纯的“主题颜色”,而是针对不同 ST7735 面板配置准备的初始化路径。官方示例也特别区分了普通 1.8 英寸屏幕与存在偏移的 1.8 英寸屏幕:Adafruit graphicstest 1.11.0 示例

本次实测环境与记录限制

  • 控制板:ESP32-S3;
  • 显示模块:背面标注 DRIVER IC: ST7735 的 1.8 英寸 128×160 SPI 模块;
  • 显示方向:setRotation(0)
  • 唯一修改项:initR()INITR_BLACKTAB 切换为 INITR_GREENTAB
  • 复测方式:重新上传后观察四边,再断电重启复测。

当时没有保存 Adafruit ST7735 库的精确版本号,因此本文不能证明所有库版本都会得到相同结果。下文把解释性源码固定到上游 1.11.0,仅用于说明初始化和偏移机制,不代表当时使用的就是这个版本。若要严格复现实验,应先记录 Arduino 库管理器中的版本或锁定对应提交,再执行同样的单变量测试。

BLACKTAB 与 GREENTAB 的关键差异是起始偏移

继续查看 Adafruit_ST7735.cpp 可以发现:INITR_GREENTAB 会把列起点设为 2、行起点设为 1;其他路径在没有额外设置时保留默认的零偏移。随后 setRotation() 会把这些起点用于当前方向下的显示坐标映射。对应实现可见 Adafruit_ST7735 1.11.0 源码

C++
// INITR_GREENTAB
_colstart = 2;
_rowstart = 1;

// 其他未单独设置偏移的路径
// colstart、rowstart 保持默认 0

可以把它理解为:程序中的逻辑坐标 (0, 0),不一定恰好对应液晶面板可见区域的第一个像素。不同模块即使都标为 ST7735、128×160,也可能因为面板与控制器显存的对应关系不同,需要不同的行列起点。

如果初始化参数使用了不适合当前面板的起点,主体仍可能正常出现,但整张图会相对可见区域发生轻微偏移,边缘便可能留下没有被本次绘图正确覆盖的窄条。

用单变量实验验证,而不是同时重接所有线

当时程序使用的是:

C++
tft.initR(INITR_BLACKTAB);
tft.setRotation(0);

为了让结果具有判断价值,我保持以下内容全部不变:

  • 屏幕与 ESP32-S3 的接线;

  • 128×160 分辨率与竖屏方向;

  • 绘制普通脸的坐标和颜色;

  • 按钮逻辑与其他程序结构。

唯一修改是:

纯文本Plain text
tft.initR(INITR_GREENTAB);
tft.setRotation(0);

重新上传后,右侧和底部的彩线完全消失,颜色、方向和画面位置也全部正常。随后我断电并重新启动,屏幕仍然恢复正常显示。这说明在这次已记录的硬件、方向和程序条件下,INITR_GREENTAB 是这块面板适用的初始化配置。

以后遇到同类问题,我会按这个顺序排查

  1. 先确认驱动芯片、可见分辨率和实际接口,不只看商品标题。

  2. 第一次点亮先显示全屏纯色,或画出覆盖四条边的测试图,检查颜色、方向、位置和完整边缘。

  3. 如果主体稳定、异常只是一条固定连续的边缘窄带,优先检查初始化类型与行列偏移。

  4. 每次只切换一个 BLACKTAB、GREENTAB 或 REDTAB 选项,不要同时改接线、SPI 引脚和绘图坐标。

  5. 找到正确配置后断电重启复测,并把它记录为这块具体模块的硬件配置。

这套顺序的价值是让每次修改都能回答一个明确问题。若画面内部出现随机噪点、闪烁或整屏不稳定,则还应回到供电、接触、SPI 速度和信号完整性等方向继续排查,不能把所有显示异常都归因于偏移。

公开学习让“不会提问”变成了可验证的问题

这次排查最大的感受是,公开学习的过程可以很快收到专业人士的评论,快速找到问题。一开始我以为是屏幕坏了,直到评论区有人告诉我需要看一下是否偏移,我才知道应该怎样继续和 AI 沟通。

这次真正起作用的并不是一句直接答案,而是一个更准确的观察角度。评论区提供了“偏移”这个关键词,我再把具体的屏幕型号、固定边缘彩线和初始化代码交给 AI,问题才从模糊猜测变成了可以查源码、改一行代码、重新上传和断电复测的实验。

对我来说,公开学习不是等全部做对之后再展示结果。把真实现象、失败照片和已经尝试过的步骤说清楚,本身就在增加获得有效反馈的机会。专业人士的经验、AI 的检索与整理能力,以及自己动手做单变量验证,三者结合起来,排查速度会快很多。

适用边界

本文结论已经在当前这块 1.8 英寸 128×160 ST7735 模块上完成断电重启复测,但它不是所有 ST7735 的统一答案。不同厂商、批次和面板组合可能需要 BLACKTAB、GREENTAB、REDTAB 或其他专用配置。正确做法仍然是先核对资料,再用覆盖四边的测试画面做单变量验证。

CONTINUE READING

继续阅读同一作品、元件或排查路径上的真实制作记录。

  1. 问题解决 · 2026年9月2日 · 8 分钟

    YCA2109 电子骰子通电不亮、芯片发热:两颗 DIP 芯片装反后的排查过程

    一块刚焊完的 YCA2109 电子骰子通电后 LED 全灭,接入电路板后的电压只有约 2.2V,约 10 分钟后两颗芯片明显发热。本文记录我怎样从电源、按钮、万用表档位和输入二极管一路排查,最终发现两颗 DIP 芯片方向错误;换向后,电子骰子恢复运行并能随机停在不同点数。

    阅读文章
  2. 概念科普 · 2026年8月28日 · 10 分钟

    ESP32ST7789 屏幕:7 根线分别是做什么的?

    第一次连接 GMT130-V1.0 时,我只会照着接线表操作。本文把 VCCGNDBLKRESSCKSDADC 分成四类,沿完整显示链路解释它们怎样把 ESP32 代码变成可见画面,以及理解以后怎样安全地重新规划线路。

    阅读文章