news 2026/4/23 11:33:32

系统学习ST7735寄存器功能与作用机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
系统学习ST7735寄存器功能与作用机制

从零掌控ST7735:寄存器级驱动开发实战指南

你有没有遇到过这样的场景?
明明代码烧录成功,背光也亮了,但屏幕要么全白、要么花屏乱码,甚至完全没反应。查遍资料,别人说“初始化序列贴对就行”,可你的就是不行。

如果你正在用ST7735驱动一块1.8英寸TFT屏,那你很可能忽略了一个关键点:寄存器不是配置项,而是控制权的开关

本文不讲API封装,也不堆砌例程。我们要做的,是钻进ST7735的底层逻辑里,搞清楚每一条命令背后到底发生了什么。只有真正理解这些寄存器的作用机制,才能在面对各种“奇怪问题”时游刃有余。


为什么ST7735这么“难搞”?

市面上很多TFT模块都标着“ST7735兼容”,但实际上可能是ST7735S、ST7735R、甚至是克隆芯片。它们的初始化流程略有差异,稍有不慎就会导致显示异常。

更麻烦的是,大多数开源库(比如Adafruit的)为了通用性,把初始化序列写成了一大段“魔法数组”。你复制粘贴能跑,但一旦出问题——黑屏、倒置、偏色——你就无从下手。

根本原因是什么?
因为你不知道每个命令码(CMD)到底在操作哪个内部状态

而这一切的核心,就是寄存器控制模型


ST7735是怎么工作的?先看这张“大脑图”

想象一下,ST7735就像一个听话但有点倔强的小助手:

  • 你通过SPI发指令,它只认两种消息:命令(Command)和数据(Data)
  • 每次通信前,你要告诉它是“下命令”还是“给数据”——这就是DC引脚的作用
  • 它收到命令后,会去修改某个“内部设置表”(即寄存器)
  • 当你开始传像素数据时,它就知道该往GRAM里塞东西了

这个“内部设置表”,就是我们所说的寄存器空间。所有功能,无论旋转、颜色格式、地址范围,全都靠写寄存器来实现。

所以,学会和ST7735“对话”的本质,就是掌握它的命令语言。


关键寄存器逐个击破:不只是知道“怎么用”,更要明白“为什么”

软复位 ——CMD: 0x01,一切的起点

这一步看似简单,却是最常被忽视的关键。

执行0x01后,ST7735会把自己所有的内部状态恢复到出厂默认值。这意味着:
- 所有配置丢失
- 回到睡眠模式
- GRAM不清零,但扫描停止

重点来了:软复位之后必须等待至少120ms,否则后续命令可能被忽略。因为芯片需要时间完成内部电源稳定和振荡器起振。

void st7735_reset() { lcd_cd_low(); // 命令模式 spi_write(0x01); // 发送软复位命令 delay_ms(150); // 必须等够!别省这点时间 }

💡坑点提示:有些开发者以为硬件复位就够了,跳过软复位。结果发现某些型号死活不亮——就是因为部分变种芯片上电后处于未知状态,必须用软复位拉回正轨。


退出睡眠 ——CMD: 0x11,唤醒沉睡的屏幕

上电后,ST7735默认进入Sleep In状态,几乎所有电路都关闭以省电。此时你发任何命令都没用!

所以第二步必须是:

lcd_cd_low(); spi_write(0x11); // 唤醒! delay_ms(120); // 又要等…… datasheet写的不能省

📌 这里的延时要求来自官方手册中的tSLPOUT参数(典型值120ms)。如果你缩短或去掉这段延时,可能会出现“偶尔点亮”的诡异现象——这就是典型的时序违规。


设置像素格式 ——CMD: 0x3A,决定色彩与效率的平衡

接下来要告诉ST7735:“以后我给你传的颜色数据长什么样”。

常用选项有两个:
-0x05→ RGB565(16位/像素)
-0x06→ RGB666(18位/像素)

虽然ST7735支持18位输入,但绝大多数MCU都用RGB565,原因很简单:节省带宽。

假设你要刷新一帧128×160的画面:
- RGB565:128×160×2 = 40,960 字节
- RGB666:128×160×3 = 61,440 字节(多出50%!)

对于SPI接口来说,这直接影响刷新率和CPU占用。

void st7735_set_pixel_format(uint8_t format) { lcd_cd_low(); spi_write(0x3A); lcd_cd_high(); spi_write(format); // 推荐传0x05 }

⚠️ 注意顺序:必须在MADCTL之后设置?错!正确顺序应该是MADCTL → Pixel Format → 地址窗口 → 写GRAM

因为MADCTL会影响地址映射方式,而像素格式决定了你怎么打包数据。


屏幕旋转的秘密 ——CMD: 0x36MADCTL 寄存器详解

这是最容易让人头大的寄存器之一。我们来看它的8个bit分别代表什么:

Bit名称功能
7MYY轴翻转(行地址从下往上)
6MXX轴翻转(列地址从右往左)
5MVX/Y轴互换(行列交换)
4ML扫描方向(逐行反向)
3RGB数据顺序(0=RGB, 1=BGR)

别记!我们直接看常用组合:

旋转角度对应值配置说明
0°(竖屏)0x00正常方向
90°(横屏右旋)0x60MV=1, MX=1 → 交换+X翻转
180°(倒置)0xC0MX=1, MY=1
270°(横屏左旋)0xA0MV=1, MY=1
void st7735_set_rotation(uint8_t rotation) { uint8_t val = 0; switch(rotation % 4) { case 0: val = 0x00; break; // 0° case 1: val = 0x60; break; // 90° case 2: val = 0xC0; break; // 180° case 3: val = 0xA0; break; // 270° } lcd_cd_low(); spi_write(0x36); lcd_cd_high(); spi_write(val); }

🎯 小技巧:如果你发现屏幕颜色偏红或偏蓝,大概率是RGB/BGR顺序搞反了。这时候只需把第3位取反即可,例如将0x60改为0x68


如何精准绘图?靠的是“地址窗口”机制

你想画一个矩形,总不能每次都刷全屏吧?ST7735提供了精细的区域控制能力。

列地址设置 ——CMD: 0x2A
行地址设置 ——CMD: 0x2B

这两个命令配合使用,定义一个“写入窗口”。之后的所有像素数据,都会按当前MADCTL规则自动填充进去。

举个例子:你想在 (10,20) 到 (50,60) 区域画图:

void st7735_set_address_window(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1) { lcd_cd_low(); spi_write(0x2A); // Set Column Address lcd_cd_high(); spi_write(x0 >> 8); spi_write(x0 & 0xFF); spi_write(x1 >> 8); spi_write(x1 & 0xFF); lcd_cd_low(); spi_write(0x2B); // Set Row Address lcd_cd_high(); spi_write(y0 >> 8); spi_write(y0 & 0xFF); spi_write(y1 >> 8); spi_write(y1 & 0xFF); }

✅ 调用完这个函数后,再发0x2C开始写数据,就能精确命中目标区域。

这也是实现GUI中“局部刷新”的基础。


真正的图像刷新 ——CMD: 0x2CMemory Write

终于到了最关键的一步:把像素数据送进去。

void st7735_write_pixels(uint16_t *pixels, size_t count) { lcd_cd_low(); spi_write(0x2C); // Start writing to GRAM lcd_cd_high(); for (size_t i = 0; i < count; i++) { spi_write(pixels[i] >> 8); // High byte spi_write(pixels[i] & 0xFF); // Low byte } }

📌 一旦发出0x2C,ST7735就会进入“连续写模式”:
- 每收到两个字节,就当作一个RGB565像素存入GRAM
- 地址按MADCTL设定的方向自动递增
- 到达窗口边界后折返或换行

💡 提示:如果想提高性能,可以用DMA+SPI双缓冲技术,避免CPU阻塞。


显示开关控制 ——CMD: 0x130x28

最后两个实用命令:

// 开启显示输出 void st7735_display_on() { lcd_cd_low(); spi_write(0x13); delay_ms(10); } // 关闭显示(黑屏) void st7735_display_off() { lcd_cd_low(); spi_write(0x28); delay_ms(20); }

有趣的是,0x13其实是“Normal Display On”,而有些人习惯用0x29(Display On)。两者在多数情况下等效,但在某些版本中行为略有不同。

建议统一使用0x13,因为它明确表示“恢复正常显示”,更适合初始化结尾调用。


实战:一次完整的初始化流程该怎么写?

不要照搬网上的“万能初始化表”,我们要自己构建可靠的流程:

void st7735_init() { st7735_reset(); // 1. 软复位 st7735_wakeup(); // 2. 退出睡眠 st7735_set_pixel_format(0x05); // 3. RGB565 st7735_set_rotation(1); // 4. 横屏90度 // 5. 设置全屏窗口 st7735_set_address_window(0, 0, 127, 159); st7735_display_on(); // 6. 开启显示 }

📌 附加建议:
- 如果你的屏幕有背光引脚(BLK),记得单独控制
- 某些型号需要额外配置Gamma曲线或电源参数(如ST7735R需写0xB1,0xB4等)


常见问题排查清单:别再靠猜了

现象可能原因检查点
白屏/黑屏未退出睡眠是否发送0x11并延时足够?
花屏、错位MADCTL配置错误检查MV/MX/MY位是否正确?
颜色发紫、偏红RGB/BGR顺序反了0x36第3位
初始化失败时序不满足检查各步骤间delay是否达标
只闪一下就灭忘开显示最后有没有调0x13

🔧 调试利器推荐:
- 用逻辑分析仪抓SPI波形,确认命令顺序和DC电平
- 分阶段测试:先让屏幕亮起来,再尝试旋转,最后刷图


更进一步:如何写出可移植的驱动?

与其写一堆重复代码,不如做点抽象:

#define ST7735_MADCTL_MY (1 << 7) #define ST7735_MADCTL_MX (1 << 6) #define ST7735_MADCTL_MV (1 << 5) #define ST7735_MADCTL_RGB (1 << 3) // 组合更清晰 st7735_write_cmd(0x36); st7735_write_data(ST7735_MADCTL_MX | ST7735_MADCTL_MY);

这样不仅可读性强,还能轻松适配不同屏幕方向需求。

此外,可以为不同芯片型号(ST7735R/S/B)维护各自的初始化序列表,运行时动态加载。


写在最后:掌握寄存器,才是真正“掌控”硬件

当你不再依赖别人的库,而是亲手写出每一行初始化代码;
当你面对花屏不再慌张,而是冷静地检查MADCTL和时序;
当你能自由切换旋转、优化刷新区域、甚至实现低功耗待机……

那一刻你会明白:所谓高手,不过是把基础踩得足够深的人

ST7735只是一个起点。同样的思维方式适用于SSD1306、ILI9341、GC9A01……只要你愿意深入底层,就没有搞不定的屏幕。

如果你在项目中遇到了具体的显示问题,欢迎留言讨论。我们可以一起分析命令流、解码SPI数据,直到找到那个隐藏的bug。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 13:47:02

YOLOv9推理API封装:gRPC服务构建实战

YOLOv9推理API封装&#xff1a;gRPC服务构建实战 1. 引言 1.1 业务场景描述 在现代计算机视觉系统中&#xff0c;YOLOv9作为当前性能领先的实时目标检测模型之一&#xff0c;已被广泛应用于智能安防、自动驾驶、工业质检等高并发、低延迟的生产环境。然而&#xff0c;官方提…

作者头像 李华
网站建设 2026/4/16 18:07:38

轻量大模型怎么选?DeepSeek-R1 1.5B部署对比评测

轻量大模型怎么选&#xff1f;DeepSeek-R1 1.5B部署对比评测 1. 引言&#xff1a;轻量化大模型的选型背景 随着大语言模型在实际业务场景中的广泛应用&#xff0c;如何在资源受限环境下实现高效推理成为关键挑战。尤其是在边缘设备、本地服务器或对数据隐私要求较高的场景中&…

作者头像 李华
网站建设 2026/4/18 9:49:49

GLM-TTS从零开始:批量推理自动化处理实战手册

GLM-TTS从零开始&#xff1a;批量推理自动化处理实战手册 1. 快速开始 1.1 启动 Web 界面 GLM-TTS 是由智谱开源的高质量文本转语音&#xff08;TTS&#xff09;模型&#xff0c;支持零样本语音克隆、情感迁移与音素级发音控制。本手册基于科哥二次开发的 WebUI 版本&#x…

作者头像 李华
网站建设 2026/4/23 11:31:50

⚡_实时系统性能优化:从毫秒到微秒的突破[20260118172925]

作为一名专注于实时系统性能优化的工程师&#xff0c;我在过去的项目中积累了丰富的低延迟优化经验。实时系统对性能的要求极其严格&#xff0c;任何微小的延迟都可能影响系统的正确性和用户体验。今天我要分享的是在实时系统中实现从毫秒到微秒级性能突破的实战经验。 &#…

作者头像 李华
网站建设 2026/4/23 11:18:42

UNet人像卡通化社区共建倡议:贡献代码与反馈建议渠道

UNet人像卡通化社区共建倡议&#xff1a;贡献代码与反馈建议渠道 1. 功能概述 本工具基于阿里达摩院 ModelScope 的 DCT-Net 模型&#xff0c;支持将真人照片转换为卡通风格。项目由“科哥”主导开发并开源共享&#xff0c;旨在构建一个开放、协作的人像卡通化技术生态。 核…

作者头像 李华
网站建设 2026/4/23 9:55:51

GLM-TTS批量处理教程:JSONL任务文件编写规范详解

GLM-TTS批量处理教程&#xff1a;JSONL任务文件编写规范详解 1. 引言 1.1 技术背景与应用场景 随着AI语音合成技术的快速发展&#xff0c;高质量、个性化的文本转语音&#xff08;TTS&#xff09;需求日益增长。GLM-TTS作为智谱开源的一款先进语音合成模型&#xff0c;在零样…

作者头像 李华