资讯详情

ST7735屏幕驱动移植:SPI时序与Arduino/STM32/C51实现

📅 2026/9/15 18:48:35 | 华诺云谱 👁 阅读
ST7735屏幕驱动移植:SPI时序与Arduino/STM32/C51实现
简介面向1.44英寸ST7735 LCD串口屏的嵌入式开发场景这份资源包整合了从硬件原理图到软件驱动代码的完整资料适合正在做单片机实训、毕业设计或小型显示产品的开发者。驱动代码覆盖三种主流平台Arduino串口库、C51的SPI驱动以及STM32硬件SPI的英文与中文显示测试工程基本可做到购买模块后按接线说明直接烧录。配套的Altium封装库、模块原理图与尺寸图能显著减少PCB设计环节的重复劳动图片取模软件和文字取模软件用于生成显示字模芯片PDF则补充了ST7735的寄存器与指令说明帮助开发者理解初始化序列和底层工作原理。资源包采用RAR压缩大小约18.05MB平台展示文件总数为0明细暂未显示但内部实际包含源码、原理图、封装库、PDF及工具程序等结构较为完整。目前已有219人学习浏览对刚接触ST7735或需要快速完成LCD显示功能的开发者是一份兼顾硬件参考与软件验证的全套资料省去四处寻找零散例程的时间。1. 一块ST7735屏串口背后是三套移植路径的共用接口很多卖家把这块1.44寸屏叫LCD串口模块这里的串口指的是SPI串行总线不是UART。模块的核心是ST7735驱动IC对外只引出CS、RST、DC、SDA、SCK五根信号线数据是一位一位送进去的。刚拿到手时真正值钱的不是屏本身而是配套的说明和源码C51、STM32、Arduino三套生态对同一份SPI协议的落地方式差异很大Arduino里有现成库函数几行出图C51要自己造时序STM32要处理硬件SPI分频、DMA和中文显示的配合。这套资料把原理图PDF、Altium封装库、两套取模软件和三份驱动源码放在一起正好能把一条完整的显示链路从头走通从原理图阅读到中文点阵显示每一步都有对应的文件可以对照。2. 硬件层拆解ST7735引脚定义、SPI时序与Altium封装库落位2.1 为什么ST7735走SPI而不是8080并口这块屏的分辨率是128x12816位色下一帧数据量约32KB属于小尺寸、低频刷新的典型场景。SPI总线的核心优势是引脚占用少SCK、MOSI、CS、DC、RST五根线就能完成全部数据交互相比8080并口需要的十几根线对C51这种GPIO资源紧张的平台尤其友好。ST7735内部自带GRAM和电源电路MCU只需要按时序把像素数据推进去行场扫描、帧刷新这些事由驱动IC自己完成这也是这颗芯片在1.44寸和1.8寸小屏上被广泛采用的原因。时序上ST7735的SPI模式固定为CPOL0、CPHA0即SCK空闲为低、上升沿采样数据。这个细节在三个平台的移植中都要保持一致后面比对C51软件模拟和STM32硬件SPI配置时对照的就是这一点。另一个常被忽略的点是DC信号它决定当前字节是命令还是数据必须在SCK上升沿之前稳定下来硬件接线时把DC放在普通GPIO上即可不需要占用SPI的硬件NSS。2.2 引脚定义与接线对照模块对外引出的信号线通常是八根两根电源、五根控制和数据、一根背光。以资源包里的接线说明为准常见定义如下引脚方向功能接线建议VCC电源模块供电3.3V或5VGND电源地与MCU共地CS输入片选低有效接GPIO或SPI_NSSRST输入复位低有效接GPIODCA0输入命令/数据选择接GPIOSDAMOSI输入串行数据接SPI_MOSISCK输入串行时钟接SPI_SCKLEDBLK输入背光控制接3.3V或PWMCS在单屏场景下可以直接接地但保留GPIO控制更稳妥尤其是后面要接多个SPI设备时可以用软件片选避免总线冲突。RST必须由MCU控制因为初始化流程里需要在发送命令前给一个低电平脉冲上电瞬间的RC复位有时序不确定性靠MCU复位最可靠。2.3 原理图阅读要点与封装库核对2.3.1 电源和背光限流ST7735的工作电压范围是2.4V到3.6V模块上一般会做电平转换或直接兼容5V供电。原理图PDF里重点看两部分一是VCC引脚的滤波电容通常有0.1uF和1uF并联二是LED背光引脚的限流电阻阻值决定背光最大亮度。如果自己画板背光串一个100Ω电阻再接3.3V即可想要可调亮度就用三极管或MOS管配合MCU的PWM输出。2.3.2 复位时序与命令数据切换RST低电平脉宽至少要保持10us释放后需要等待约120ms让驱动IC内部完成上电复位之后才能发送初始化命令。这个延时如果省掉最典型的故障是屏幕显示雪花点或者干脆不亮。DC信号的电平切换发生在每个字节传输之前在软件里体现为写命令函数和写数据函数两个不同入口后面STM32的代码会直接体现这个划分。2.4 Altium封装库的检查与落位资源包里的Altium封装库包含原理图符号和PCB封装。导入前先核对两点一是焊盘间距与模块尺寸图是否一致1.44寸模块的排针间距是2.54mm标准间距但引脚顺序不同批次可能有差异二是一脚方向PCB封装上的丝印圆点要和实际模块的丝印对应反了的话焊上去就是镜像或者错位。封装库里的器件名如果带QDtech字样直接调用即可如果库版本较旧建议对照芯片资料PDF确认ST7735的QFN封装散热焊盘有没有画到PCB封装里。3. Arduino与C51点亮屏幕与初始化寄存器比对3.1 Arduino接线与快速出图Arduino平台最小接线方案是四根SPI线外加复位和DC以UNO为例SCK接D13MOSI接D11CS接D10DC接D8RST接D9。资源包里对应的Arduino例程基于Serial_ST7735实际是Adafruit_ST7735的兼容层。出图代码只有几行#include Adafruit_GFX.h #include Adafruit_ST7735.h #include SPI.h #define TFT_CS 10 #define TFT_RST 9 #define TFT_DC 8 Adafruit_ST7735 tft Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); void setup() { tft.initR(INITR_144GREENTAB); tft.fillScreen(ST77XX_BLACK); tft.drawPixel(64, 64, ST77XX_RED); tft.println(Hello ST7735); }initR(INITR_144GREENTAB)是这块1.44寸屏的初始化入口GREENTAB表示屏幕的偏移和色彩映射采用绿色标签版本不同批次模块如果颜色偏色可以换成INITR_144GREENTAB之外的参数试验。fillScreen和drawPixel是Adafruit_GFX提供的绘图原语底层已经封装了STA7735的写命令和写数据时序。这段代码跑通后屏幕正中应该出现一个红点左上角显示一行文字说明SPI通路和初始化序列都正常。3.2 C51软件SPI的时序实现C51例程用的是软件模拟SPI原因很直接51单片机经典型号不带硬件SPI外设即便STC系列有库函数兼容性和端口映射也不如直接模拟来得可控。核心代码是位翻转sbit LCD_SCK P1^5; sbit LCD_SDA P1^6; sbit LCD_CS P1^4; sbit LCD_DC P1^3; sbit LCD_RST P1^2; void SPI_WriteByte(unsigned char dat) { unsigned char i; for (i 0; i 8; i) { if (dat 0x80) LCD_SDA 1; else LCD_SDA 0; LCD_SCK 0; LCD_SCK 1; // 上升沿采样 dat 1; } }这段代码对应模式0时序SCK空闲为低先置数据再拉高SCK产生上升沿ST7735在上升沿锁存数据。LCD_SDA需要先于LCD_SCK置位如果顺序反过来采样到的就是旧数据屏幕上会出现整行数据错位。dat 1把次高位移到最高位高位先出对应SPI的MSB先行约定。如果单片机主频较高可以在SCK拉低和拉高之间插入几个空指令保证时钟高电平脉宽不小于100ns。3.3 初始化序列里决定成败的寄存器C51和Arduino例程里都有一长串初始化命令不需要逐条背但下面几个是关键改错任何一个都会出症状寄存器/命令值作用出错表现SLPOUT 0x11-退出睡眠不执行则黑屏MADCTL 0x360xC0扫描方向和RGB/BGR花屏、镜像COLMOD 0x3A0x0516位色模式颜色条带DISPON 0x29-开显示数据写入但不见MADCTL的低三位控制RGB还是BGR排列如果屏幕显示红色却变成蓝色就是这一位反了。COLMOD设置为0x05对应65K色即每像素两个字节如果改成0x06的18位模式颜色转换函数和取模数据全部要跟着改三套驱动源码里都按16位色处理。3.4 取模方向与颜色格式的一致性Arduino和C51例程都能显示图片图片素材是用资源包赠送的取模软件生成的C数组。取模方向必须和屏幕扫描方向一致否则图片显示为镜像或旋转90度。通用的做法是取模软件里选择逐行式、阴码、MSB在前生成的数据每两个字节组成一个565格式的像素点高字节在前。这里的高低位顺序和STM32例程里一致跨平台复用素材时不需要重新取模这是这套资料设计上比较省事的地方。4. STM32硬件SPI移植与中文显示完整实现4.1 硬件SPI引脚分配与CubeMX配置STM32例程用的是硬件SPI1引脚分配如下引脚功能说明PA5SPI1_SCK时钟PA7SPI1_MOSI数据输出PA4GPIO输出CS片选PA2GPIO输出DC命令/数据PA1GPIO输出RST复位MISO未使用ST7735是单工写设备不需要读取。CubeMX里SPI1的参数配置为Mode选择Transmit Only Master硬件NSS关闭CPOL设为LowCPHA设为1 Edge即模式0Prescaler先按32分频跑起来STM32F103主频72MHz下对应2.25MHz的SCK绝大多数模块在这个速率下稳定工作之后再慢慢提高。DC和RST配置为GPIO输出初始电平RST拉高、DC拉高避免上电瞬间误触发。4.2 HAL库下的命令与数据写函数硬件SPI的读写函数和C51的软件模拟在结构上完全对应只是把位翻转换成了HAL接口static void LCD_WriteCommand(uint8_t cmd) { LCD_DC_LOW(); LCD_CS_LOW(); HAL_SPI_Transmit(hspi1, cmd, 1, 10); LCD_CS_HIGH(); } static void LCD_WriteData(uint8_t dat) { LCD_DC_HIGH(); LCD_CS_LOW(); HAL_SPI_Transmit(hspi1, dat, 1, 10); LCD_CS_HIGH(); }写命令时DC拉低写数据时DC拉高这个划分和ST7735数据手册里的命令/数据引脚定义完全一致。HAL_SPI_Transmit最后一个参数是超时时间单位毫秒这里给10ms足够了如果超时设置过短调试时会出现偶发丢字节。连续写大量像素时不建议一个字节调用一次而是把缓冲区一次性传进去void LCD_DrawRGB(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t *pixels) { LCD_SetWindow(x, y, x w - 1, y h - 1); LCD_DC_HIGH(); LCD_CS_LOW(); HAL_SPI_Transmit(hspi1, (uint8_t *)pixels, w * h * 2, 100); LCD_CS_HIGH(); }LCD_SetWindow先发送CASET和RASET命令锁定写入区域然后连续填充像素数据ST7735内部会自动换行。每次传输的字节数是w * h * 2因为每个像素是16位。这种批处理方式比逐像素调用效率高一个数量级因为省去了每次传输前的函数调用和CS电平翻转。4.3 中文显示GB2312字模定位与取模参数资源包里STM32硬件SPI的中文显示例程核心是16x16点阵汉字字库。取模软件生成的字模按GB2312编码排列区位码到偏移地址的换算公式为// 获取GB2312码H为高字节L为低字节 uint8_t H str[i]; uint8_t L str[i 1]; uint16_t offset ((H - 0xA1) * 94 (L - 0xA1)) * 32;GB2312汉字从0xA1A1开始连续编码每区94个汉字每个16x16字模占用32字节。offset计算出的就是该汉字在字库数组中的起始下标。使用这个公式前要确认源字符串的编码格式MDK默认编辑器保存为GB2312时字符串常量里的汉字直接就是GB2312码如果工程文件是UTF-8编码需要先转换成GB2312再定位否则偏移全错显示出来是乱码。取模软件里的参数设置为字宽16、字高16、阴码、逐列式还是逐行式取决于字库的排列习惯STM32例程用的是逐行式生成的数据每行两个字节对应16个像素。4.4 刷新性能与DMA优化方向全屏刷新128x128像素共16384个点每个点2字节总计32KB数据。在2.25MHz SCK下理论传完需要约114ms实际因为有命令开销会更慢。想要提升刷新率先提高SPI分频到8分频或4分频SCK到9MHz或18MHz大部分模块在9MHz下工作正常。再进一步就是用DMAHAL_SPI_Transmit_DMA(hspi1, (uint8_t *)pixels, len);DMA传输不占用CPU但要注意两点一是CS和DC仍需软件控制DMA只负责MOSI数据输出二是传输完成前不能修改缓冲区内容否则会出现画面撕裂常见做法是用双缓冲或等HAL_SPI_TxCpltCallback回调再填充下一帧。Arduino端因为库封装比较厚一般不做这层优化C51受限于主频也较少涉及DMA这条路径基本是STM32平台特有的性能空间。5. 取模工具链与排错清单把最后的调试时间压到最小5.1 图片与文字取模的参数设置资源包里的图片取模软件和文字取模软件功能上互补图片工具把BMP或JPG转成16位色C数组文字工具把汉字和ASCII字符转成点阵。图片取模时先缩放到128x128颜色格式选RGB565输出格式选C语言数组字节序选高字节在前这个配置和前面STM32例程的缓冲区格式完全对应。文字取模软件里常用字号是16x16和8x16字符集选择GB2312生成的字模按区位码顺序排列直接对应前面的偏移公式。两套工具生成的C文件复制进工程后注意检查数组名和extern声明的类型是否一致——uint8_t数组和uint16_t数组混用是常见的编译告警来源。5.2 白屏、花屏、乱色的排查顺序现象优先检查项处理方式完全黑屏电源和RST时序确认VCC电压在2.4V以上RST释放后延时120ms再初始化白屏初始化命令是否发完SLPOUT后必须要延时DISPON缺失也会白屏花屏/镜像MADCTL寄存器对照表改扫描方向0xC0附近试几个值红蓝互换MADCTL的RGB/BGR位置位或清零第3位颜色有条带COLMOD设置确认是0x05而不是0x06数据错位SPI模式CPOL/CPHA必须为模式0检查SCK空闲电平和采样沿显示闪烁背光PWM频率PWM频率提高到1kHz以上调试时最有效的方法是逐步缩小范围先用fillScreen整屏填充纯色能出正确纯色说明初始化、SPI和颜色格式三个环节都通过再画一个十字交叉线验证扫描方向最后才加载图片和中文。如果纯色都不对不要动上层绘图代码回头查初始化序列。另外CS在每次传输之间拉高再拉低这个动作很多例程省略了但它能避免SPI总线上其他设备的干扰在模块和MCU之间连线超过10cm时这个措施尤其值得保留。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。