news 2026/1/17 11:33:46

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/1/3 23:00:01

ESP32文件上传终极指南:5分钟快速部署完整教程

ESP32文件上传终极指南&#xff1a;5分钟快速部署完整教程 【免费下载链接】arduino-esp32fs-plugin Arduino plugin for uploading files to ESP32 file system 项目地址: https://gitcode.com/gh_mirrors/ar/arduino-esp32fs-plugin 你是否曾为ESP32项目中的静态文件管…

作者头像 李华
网站建设 2025/12/31 6:39:18

GitHub Projects管理Miniconda-Python3.11相关开发进度

GitHub Projects 管理 Miniconda-Python3.11 开发进度的实践与思考 在如今 AI 项目日益复杂、团队协作频繁的背景下&#xff0c;一个常见的痛点反复浮现&#xff1a;为什么代码能在开发者的本地机器上完美运行&#xff0c;却在 CI 或他人环境中频频报错&#xff1f;更令人头疼的…

作者头像 李华
网站建设 2026/1/11 4:02:22

Conda环境克隆:Miniconda-Python3.11快速复制PyTorch配置

Conda环境克隆&#xff1a;Miniconda-Python3.11快速复制PyTorch配置 在人工智能项目开发中&#xff0c;你是否曾遇到过这样的场景&#xff1a;本地训练模型一切正常&#xff0c;但一换到服务器上就报错&#xff1f;或者新同事花了整整两天才把开发环境配好&#xff1f;更别提论…

作者头像 李华
网站建设 2025/12/31 6:38:57

无需Anaconda下载完整包!用Miniconda-Python3.11精简启动AI项目

无需Anaconda下载完整包&#xff01;用Miniconda-Python3.11精简启动AI项目 在一台刚配好的远程GPU服务器上&#xff0c;你准备开始新的图像分类实验。可还没写一行代码&#xff0c;就得先花半小时下载 Anaconda——那个动辄3GB的“科学计算全家桶”。更糟的是&#xff0c;团队…

作者头像 李华
网站建设 2025/12/31 6:38:18

Miniconda-Python3.11镜像助力开发者低成本获取GPU与Token

Miniconda-Python3.11镜像助力开发者低成本获取GPU与Token 在AI模型训练动辄需要数百GB显存的今天&#xff0c;一个刚入门深度学习的研究生却还在为“ImportError: cannot import name ‘MultiHeadAttention’ from ‘tensorflow.keras.layers’”而焦头烂额——不是代码写错了…

作者头像 李华
网站建设 2026/1/16 6:42:27

Proteus元器件库大全之电源模块仿真解析

Proteus电源模块仿真实战&#xff1a;从整流到稳压的完整设计链路你有没有遇到过这样的情况&#xff1f;辛辛苦苦焊好一块电源板&#xff0c;上电后却发现输出电压不对、纹波大得像海浪&#xff0c;甚至芯片直接“冒烟”——结果一查&#xff0c;原来是变压器匝比算错了&#x…

作者头像 李华