news 2026/7/27 16:14:07

ST7735显示模块新手教程:从点亮到显示文字

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ST7735显示模块新手教程:从点亮到显示文字

从零点亮一块小彩屏:手把手教你玩转ST7735显示模块

你有没有试过把一块1.8英寸的小屏幕接到单片机上,然后满怀期待地通电——结果黑屏、花屏、乱码?别急,这几乎是每个嵌入式新手都会踩的坑。今天我们就来彻底搞明白:如何让一块ST7735驱动的TFT屏幕真正“活”起来,并在上面显示第一行文字

这不是一份复制粘贴的数据手册摘要,而是一份来自实战经验的完整指南。无论你是用Arduino做实验的学生,还是正在开发物联网设备的工程师,只要你想在项目中加入一个彩色界面,这篇文章都能带你少走弯路。


为什么是ST7735?

在琳琅满目的TFT控制器中,ST7735是一款特别适合入门者的芯片。它常见于128×160分辨率的1.8寸彩色屏模块,价格便宜(十几元就能买到)、接口简单、社区资源丰富,而且可以直接和STM32、ESP32、Arduino等主流MCU对接。

更重要的是,它的驱动逻辑清晰,不涉及复杂的DMA或帧缓冲管理,非常适合理解“屏幕是怎么被点亮的”这一底层机制。

核心优势一句话总结
小尺寸 + 低功耗 + SPI接口 + 内置升压电路 + 成熟库支持 = 快速上手的理想选择。


硬件接线:第一步千万别接错电压!

很多初学者一上来就烧了屏幕,原因只有一个:误将VCC接到5V。绝大多数ST7735模块只支持3.3V供电和逻辑电平,直接连5V会永久损坏芯片

标准四线SPI接法(以Arduino Uno为例)

模块引脚推荐连接功能说明
VCC3.3V⚠️ 绝对不能接5V!
GNDGND共地
SCL/SCKD13SPI时钟线
SDA/MOSID11数据输出(主→从)
CSD10片选,低电平有效
DC/A0D9命令/数据切换
RSTD8复位控制
BLK/LED3.3V 或 PWM背光控制(可常亮或调光)

💡 提示:如果你使用的是ESP32、STM32F103等原生3.3V系统,则无需电平转换,可直接连接。

关键注意事项:

  • CS和RST建议加上拉电阻(10kΩ到3.3V),防止上电瞬间状态不确定。
  • 长导线或面包板容易引入噪声,SPI速率不要一开始就设太高(建议先用4MHz调试)。
  • BLK脚如果接PWM引脚,可以用analogWrite()调节亮度(注意频率设置为几kHz)。

SPI通信的本质:命令与数据的轮换

ST7735本质上是一个“听话的执行者”。你要告诉它:“现在我要下命令”或者“现在我要传数据”,它才能正确解析你发过去的内容。

这就是DC(Data/Command)引脚的作用:

  • DC = 0→ 接下来的字节是命令(比如“我要开始写显存了”)
  • DC = 1→ 接下来的字节是数据(比如“这个像素颜色是红色”)

而整个通信过程由SPI完成。典型的初始化流程如下:

拉低CS → 设置DC → 发送1字节 → 拉高CS

我们可以封装两个基础函数:

void spi_write_cmd(uint8_t cmd) { digitalWrite(PIN_CS, LOW); digitalWrite(PIN_DC, LOW); // 命令模式 SPI.transfer(cmd); digitalWrite(PIN_CS, HIGH); } void spi_write_data(uint8_t data) { digitalWrite(PIN_CS, LOW); digitalWrite(PIN_DC, HIGH); // 数据模式 SPI.transfer(data); digitalWrite(PIN_CS, HIGH); }

有了这两个函数,我们就可以开始“对话”了。


屏幕初始化:给屏幕“喂”一套标准动作

刚上电的ST7735就像一台没开机的电视,处于未知状态。我们必须按照厂商推荐的顺序,一步步把它“唤醒”。

这个过程叫做Power-on Sequence,不能跳步,也不能随意更改延时。

关键命令一览表

命令(Hex)名称作用
0x01Software Reset软复位
0x11Sleep Out结束睡眠,准备配置
0x36Memory Access Control设置显示方向
0x3APixel Format Set设为RGB565格式
0xC0..C5Power Control配置内部电源电压
0x29Display ON最后一步:打开显示

完整初始化代码(精简版)

void st7735_init() { pinMode(PIN_CS, OUTPUT); pinMode(PIN_DC, OUTPUT); pinMode(PIN_RST, OUTPUT); digitalWrite(PIN_CS, HIGH); // 硬件复位 digitalWrite(PIN_RST, LOW); delay(50); digitalWrite(PIN_RST, HIGH); delay(150); // 退出睡眠 spi_write_cmd(0x11); delay(20); // 设置显示方向:竖屏,X翻转 spi_write_cmd(0x36); spi_write_data(0xA0); // MX=1, MY=0, MV=0, ML=0, RGB=1 // 设置颜色格式为16位(RGB565) spi_write_cmd(0x3A); spi_write_data(0x05); // 电源控制配置(简化版) spi_write_cmd(0xC0); spi_write_data(0xA2); spi_write_data(0x02); spi_write_data(0x84); spi_write_cmd(0xC1); spi_write_data(0xC5); spi_write_cmd(0xC2); spi_write_data(0x0A); spi_write_data(0x00); spi_write_cmd(0xC5); spi_write_data(0x0E); // VCOM // 开启显示 spi_write_cmd(0x29); }

📌重点提醒
-0x36中的0xA0表示X轴翻转,适用于大多数竖屏安装方式;
-delay(150)不可省略,必须等待内部电路稳定;
- 如果屏幕始终黑屏,请优先检查是否遗漏了0x110x29


如何画一个像素?GRAM操作详解

ST7735内部有一块叫GRAM(Graphic RAM)的内存区域,大小正好是 128×160×2 字节(每个像素2字节,RGB565格式)。只要你往这块内存里写颜色值,屏幕就会自动刷新显示。

但你不能直接“随机访问”GRAM,必须先告诉它:“我要写哪一片区域”。

写像素三部曲:

  1. 设定列范围(Column Address Set)→ 命令0x2A
  2. 设定页范围(Page Address Set)→ 命令0x2B
  3. 开始写数据(Memory Write)→ 命令0x2C

例如,我们要在坐标 (50, 60) 写一个红色像素:

void draw_pixel(int16_t x, int16_t y, uint16_t color) { if (x < 0 || x >= 128 || y < 0 || y >= 160) return; // 设置列地址(X) spi_write_cmd(0x2A); spi_write_data(0x00); spi_write_data(x); spi_write_data(0x00); spi_write_data(x); // 设置行地址(Y) spi_write_cmd(0x2B); spi_write_data(0x00); spi_write_data(y); spi_write_data(0x00); spi_write_data(y); // 写入颜色 spi_write_cmd(0x2C); spi_write_data(color >> 8); // 高8位 spi_write_data(color & 0xFF); // 低8位 }

🎨 常见颜色定义:
```c

define COLOR_BLACK 0x0000

define COLOR_RED 0xF800

define COLOR_GREEN 0x07E0

define COLOR_BLUE 0x001F

define COLOR_WHITE 0xFFFF

```

虽然这样可以画点,但效率极低——每画一个点要发送7个命令+数据包。实际项目中应尽量使用批量写入(如填充矩形、绘制字符串时一次性写多像素)。


显示文字:自己实现一个微型字体引擎

想在屏幕上打印“Hello World”,我们需要一个最简单的点阵字体渲染器

实现思路:

  1. 准备一个8×16固定宽度的ASCII字符集(共95个可打印字符)
  2. 每个字符用16字节表示(每行1字节,高位在前)
  3. 遍历每一位,为“1”的位置调用draw_pixel

示例代码(简化版)

// 外部声明字体数组(可用progmem存储在Flash中节省RAM) extern const unsigned char font8x16[95][16]; void draw_char(uint8_t x, uint8_t y, char c, uint16_t color) { if (c < ' ' || c > '~') return; uint8_t idx = c - ' '; for (int row = 0; row < 16; row++) { uint8_t bits = pgm_read_byte(&font8x16[idx][row]); for (int col = 0; col < 8; col++) { if (bits & (0x80 >> col)) { draw_pixel(x + col, y + row, color); } } } } void draw_string(uint8_t x, uint8_t y, const char* str, uint16_t color) { while (*str && x <= 120) { draw_char(x, y, *str++, color); x += 8; // 字符间距 } }

📌优化建议
- 不要用draw_pixel逐点写,改为先计算区域,再批量写入颜色数据;
- 使用SPI.beginTransaction()提升传输速度;
- 字体数据放在Flash中(PROGMEM),避免占用宝贵RAM。


常见问题排查清单

问题现象可能原因解决方案
完全黑屏供电错误、RST悬空、CS未拉低检查3.3V电源,加RST上拉,确认片选
花屏/闪屏SPI速率过高降低至4~8MHz再测试
颜色发绿或偏蓝RGB565端序错误检查高低字节发送顺序
只显示半屏GRAM地址设置错误重新核对setAddrWindow函数
初始化失败命令序列缺失关键步骤对照数据手册补全0x11,0x29

🔧 调试技巧:先尝试运行官方例程(如Adafruit_ST7735库),确认硬件正常后再移植自己的代码。


进阶方向:不止于显示文字

当你成功显示第一行文本后,接下来可以尝试:

  • 绘制几何图形:直线、矩形、圆(Bresenham算法)
  • 加载图片:从SD卡读取BMP并解码显示
  • 添加触摸功能:配合XPT2046电阻屏实现交互
  • 移植轻量GUI:如LVGL Lite、uGUI,构建菜单系统
  • 低功耗设计:空闲时进入睡眠模式(0x10命令),关闭背光

这些能力会让你的项目从“能看”进化到“好用”。


写在最后:动手才是最好的学习

ST7735看似复杂,其实核心只有三点:

  1. SPI通信要稳定(电压、接线、速率)
  2. 初始化流程要完整(顺序不能乱)
  3. GRAM操作要准确(地址窗口+写入模式)

一旦你亲手点亮屏幕并在上面写出“Hello, TFT!”,那种成就感远超任何理论讲解。

技术的成长从来不是靠“知道”,而是靠“做到”。现在,就去接好你的那根3.3V线,写第一行代码吧!

如果你在实现过程中遇到了其他挑战,欢迎在评论区分享讨论。我们一起把这块小屏幕,变成无限可能的起点。

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

CCPD数据集完全攻略:从零开始掌握车牌识别核心技术

CCPD数据集完全攻略&#xff1a;从零开始掌握车牌识别核心技术 【免费下载链接】CCPD [ECCV 2018] CCPD: a diverse and well-annotated dataset for license plate detection and recognition 项目地址: https://gitcode.com/gh_mirrors/cc/CCPD CCPD数据集作为中国车牌…

作者头像 李华
网站建设 2026/7/24 16:29:10

终极教程:5步搞定Labelme转YOLO格式转换

终极教程&#xff1a;5步搞定Labelme转YOLO格式转换 【免费下载链接】Labelme2YOLO Help converting LabelMe Annotation Tool JSON format to YOLO text file format. If youve already marked your segmentation dataset by LabelMe, its easy to use this tool to help conv…

作者头像 李华
网站建设 2026/7/24 20:18:31

Hourglass:Windows平台零基础入门到精通的免费倒计时器完整教程

还在为时间管理发愁吗&#xff1f;Hourglass作为一款专为Windows用户设计的开源免费倒计时器&#xff0c;以其强大的时间识别能力和个性化的主题定制功能&#xff0c;成为你时间管理的最佳助手。无论是工作学习还是日常生活&#xff0c;都能提供精准可靠的时间提醒服务。 【免费…

作者头像 李华
网站建设 2026/7/15 4:53:07

vgpu_unlock完整实践指南:解锁消费级GPU虚拟化功能

vgpu_unlock是一款革命性的开源工具&#xff0c;专门用于解锁消费级NVIDIA GPU的vGPU功能。通过软件方式解除限制&#xff0c;让您的GeForce显卡也能享受虚拟化技术&#xff01;本文将为您提供从技术原理到实战部署的完整指导。 【免费下载链接】vgpu_unlock Unlock vGPU funct…

作者头像 李华
网站建设 2026/7/14 23:39:05

GitHub仓库集成Miniconda-Python3.11作为默认运行时

GitHub仓库集成Miniconda-Python3.11作为默认运行时 在人工智能项目协作中&#xff0c;你是否经历过这样的场景&#xff1a;新成员花了整整一天配置环境&#xff0c;却仍因某个包版本冲突导致训练脚本报错&#xff1f;又或者&#xff0c;在本地调试通过的模型&#xff0c;推送到…

作者头像 李华
网站建设 2026/7/13 11:41:57

Miniconda-Python3.11镜像提升GPU算力利用率实战案例

Miniconda-Python3.11镜像提升GPU算力利用率实战案例 在当今AI模型训练日益复杂、算力成本不断攀升的背景下&#xff0c;一个看似微小的技术选择——Python环境管理方式&#xff0c;往往成为决定GPU资源是否“空转”的关键。我们曾见过太多这样的场景&#xff1a;团队成员本地跑…

作者头像 李华