尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

ST7567串口屏调试避坑指南:引脚电平、复位时序与对比度调节

发布时间:2026/9/24 13:01:01

资讯中心
01
ARTICLE

ST7567串口屏调试避坑指南:引脚电平、复位时序与对比度调节

ST7567串口屏调试避坑指南:引脚电平、复位时序与对比度调节
接手过ST7567这颗驱动IC的朋友应该都懂最容易让人崩溃的不是它有多复杂而是明明照着别人的代码抄了一遍屏就是不亮或者白屏一片怀疑自己焊坏了屏。上个月帮一个网友调了一块12864“串口屏”他把初始化代码发给我看命令和时序表面上都没问题最后用万用表量了一圈发现模块上的PS引脚悬空了串行模式根本没被选中。这让我决定把这几年调ST7567屏踩过的坑系统整理一遍尤其是标题里提到的引脚电平、复位时序和对比度调节这三块每一个都能让屏“看起来坏了”。这里要先把一个容易混淆的概念说清楚标题里的“串口屏”指的是采用ST7567控制器的SPI串行接口单色LCD屏不是那种通过UART发指令控制的大彩屏、迪文屏。后者是带智能协议的主控屏驱动逻辑完全不同。本文所有内容只针对ST7567这种通过SPI写入像素数据的液晶屏。文章内容全部来自我自己的调试记录适合正在用STM32裸机驱动这种屏、又遇到白屏花屏问题的朋友参考。1. ST7567“串口屏”到底是什么接口类型与引脚电平的坑1.1 “串口屏”这个叫法最容易造成的误会很多淘宝店的标题把ST7567的12864屏叫“串口屏”新同学买回来以为像串口屏一样两根线发字符就行结果发现根本不出字。这里必须明确ST7567是一颗纯液晶驱动芯片本身没有任何中文字库更没有串口协议解析功能。它所谓的“串口”只是说这颗IC支持串行SPI接口输入显示数据大小和普通的8128像素LCD一样显示内容需要单片机一页一页地写进去。ST7567本身支持8080并口、6800并口和4线SPI串行接口三种方式模块上通常只把其中一种或两种引出来。串口模式使用SCL作为时钟、SI很多模块标成SDA或MOSI作为数据输入、A0也叫RS、DC区分命令与数据、CS作为片选。你买的模块如果只引出了这几个接口说明厂家已经默认工作在串行模式。如果模块还引出了更多引脚比如DB0到DB7那你需要先检查PS或者PSB引脚确认它被正确设置为串行模式。1.2 最小硬件连接与逻辑电平兼容性先列一个最常用的接线方式这是ST7567屏在串口模式下的最小系统连接ST7567模块引脚STM32引脚说明VDD3.3V逻辑电源绝大多数模块为3.3VVSSGND地CSPA4片选低有效A0RSPA3命令/数据选择低为命令、高为数据SCLPA2SPI时钟SISDAPA1SPI数据输入RSTPA0复位低有效LEDA/LEDK3.3V或5V加限流电阻背光极性别接反引脚电平这块是标题里第一个核心坑。ST7567的VDD典型工作电压是3.3V数据手册里的输入高电平阈值一般是0.7倍VDD左右也就是说VDD3.3V时只要高电平超过2.31V就能稳定识别STM32的3.3V推挽输出完全没问题。但如果你图方便把5V接到了VDD上事情就变了。VDD5V时输入高电平阈值变成3.5VSTM32的3.3V高电平虽然勉强接近但这个电压已经不够裕量再加上连线阻抗、板内压降很容易出现“时好时坏”的间歇性白屏。我见过一个案例初始化命令偶尔生效、偶尔不生效就是VDD接了5V又没做电平转换。如果你必须用5V供电请在SCL、SI、A0、CS、RST这几根线上加电平转换电路别直接拿3.3V推5V逻辑输入。还有一个需要注意的背光供电最好和逻辑供电分开。很多模块的LEDA引脚没有内置限流电阻直接接5V可能过流建议串一个10到100欧的电阻根据背光亮度实测调整。2. 引脚电平与SPI连接里那些“看起来正常”的陷阱2.1 PS引脚的串/并选择是最隐蔽的开关PS引脚在ST7567的数据手册里叫串行/并行接口选择有些模块会把它引出来有些模块直接在PCB上用焊锡焊接选择。这个引脚如果被拉高芯片工作在并口模式你不管怎么发SPI命令屏幕都不会有任何反应。我遇到的实际情况是某款模块的PS引脚被引出到排针但厂家没有在丝印上写清楚它到底需要接高还是接低。当时我只按常规接了VDD、GND和SPI四根线PS悬空结果屏幕永远是白屏。用万用表量PS排针电压发现是浮空的不确认是高是低芯片内部状态完全不确定。后来把PS接GND屏幕立刻有反应。排查这类问题时第一件事就是翻模块原理图或者数据手册确认PS引脚的电平要求。ST7567在串行模式时PS必须拉低具体以你的模块丝印为准。如果模块没有引出PS那一般已经硬接好了就不需要管它。2.2 JTAG复用引脚和GPIO配置的暗坑引脚电平的另一个经典坑是用了STM32上电默认被JTAG占用的引脚。这类引脚包括PA13、PA14、PA15、PB3、PB4。很多教程喜欢把SCL放在PB3、SDA放在PB4或者在PA15上接CS看起来完全没有问题因为代码里也做了GPIO初始化。但STM32F103的这些引脚在芯片上电后默认不是普通IO而是JTAG调试接口。你把GPIO模式配置成推挽输出写高电平它可能拉不起来或者写低电平也不受控制。屏幕表现出来的症状就是SPI波形不对发命令毫无反应。解决办法有两个。第一个是避开这些引脚重新画接线用PC13、PA0、PA1这些普通引脚这是最省心的方案。第二个是使用重映射功能GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);这行代码的作用是关闭JTAG、保留SWD执行之后PA15、PB3、PB4才能当普通IO用。不过我建议如果屏对引脚没有硬性要求直接换引脚更稳妥毕竟重映射代码写错或者下载前没设置好可能导致下载器连不上芯片。2.3 硬件SPI和模拟SPI怎么选ST7567的串行SPI频率上限并不高很多模块的SCL时钟最快也就2MHz左右STM32跑72MHz主频时如果直接AHC最高分频到18MHz去发数据大概率花屏或者乱码。我用硬件SPI时习惯把波特率预分频设成64也就是1.125MHz左右完全够用而且特别稳。硬件SPI的极性选择也很容易踩坑。ST7567的串行时序是SCL空闲为低、数据在SCL上升沿被采样对应SPI Mode0也就是CPOLLow、CPHA1Edge。实际使用中Mode3有时也能工作但我不推荐赌这种兼容性老老实实用Mode0最保险。但我自己更喜欢用模拟GPIO去实现SPI原因很简单时序完全可控不容易受主频分频影响而且调试时可以很直观地看每一位的电平是否正确。模拟SPI写一个字节的核心逻辑如下void ST7567_SPI_WriteByte(uint8_t dat) { for (uint8_t i 0; i 8; i) { SCL_L(); if (dat 0x80) SDA_H(); else SDA_L(); dat 1; SCL_H(); // 上升沿ST7567采样数据 } }注意这里必须先拉低SCL然后改变SDA电平再拉高SCL。如果SCL拉高期间SDA还在变采样到的数据就是错的。这样写虽然比硬件SPI慢一些但驱动一块12864的单色屏完全够用。3. 复位时序一个最容易“偶发白屏”的环节3.1 规格书上没写明白的上电细节很多人的初始化代码里复位时序只是象征性地拉低、拉高没有去认真思考上电后芯片处于什么状态。ST7567上电后内部电路需要一个VDD从0爬升到稳定值的过程。如果你在VDD还没稳定时就执行复位和初始化命令芯片可能根本没有正确进入工作状态表现出来就是偶发白屏按一下复位键又正常了。我通常这样处理先等主控上电稳定至少延时100ms再去碰屏的引脚然后执行复位脉冲。不要上电后立刻初始化更不要和STM32的SystemInit挤在同一个瞬间去操作外设。单片机上电后跑得比屏的电源稳定快得多这个时间差必须用Delay补上。复位引脚的实际操作我会给出一个偏保守但足够可靠的时序LCD_RST_H(); DelayMs(10); LCD_RST_L(); DelayMs(20); // RST低电平维持20ms LCD_RST_H(); DelayMs(50); // 复位释放后等待50ms再发命令为什么这么长的延迟因为不同厂家模块在ST7567前面可能还搭了电平转换或者滤波电路RC时间常数不一样。数据手册上的最小复位脉宽只有1微秒左右但工程上不能按极限值去设计多留余量可以省掉一大半“上电偶发不亮”的麻烦。3.2 复位脉冲宽度与初始化命令间隔除了复位引脚本身的脉冲初始化命令之间的间隔同样重要。ST7567有些命令需要内部电路稳定比如打开升压电路之后如果没有等待足够的时间就马上去设对比度显示效果可能不正确。我写初始化函数时会在几个关键节点加延时0xE2软复位命令之后至少等5ms0x2F开升压之后等20ms以上让内部升压电路建立稳定的LCD驱动电压最后写0xAF开显示之后等20ms再清屏。这些时间不是拍脑袋定的而是实测中发现如果命令发得太快屏偶发显示异常。具体表现是上电后第一次正常第二次白屏或者复位后正常断电重上电就花。把初始化命令之间的间隔拉大后问题消失。3.3 和MCU共用复位信号是个隐患有人会把屏的RST引脚直接接到STM32的NRST复位脚上觉得这样省一个GPIO。这个做法偶尔能用但存在一个典型问题MCU复位释放后内部程序启动需要一段时间而屏的复位释放也同时开始等MCU跑到初始化函数时屏可能还在复位状态或者刚复位完内部寄存器还没准备好接收命令。更稳妥的做法是屏的RST用一个单独的GPIO控制这样你可以精确控制复位释放的时机。如果PCB已经画死了、屏的复位和MCU复位必须共用那解决方案是软件里补救重新对屏执行一次0xE2软复位然后等足够长时间再初始化。3.4 软复位命令0xE2的用法0xE2是ST7567的软件复位命令功能是让芯片内部所有寄存器恢复默认状态。它的作用和外部RST引脚类似但不需要硬件连线在调试阶段特别好用。如果屏已经处于工作状态但显示乱了直接在代码里执行一次0xE2再重新执行完整初始化流程等于给屏做了一次“软件断电重启”。我在调试菜单切换导致花屏时会优先尝试软复位。注意软复位命令后也要延时至少等5ms确保内部状态稳定再发后面的命令。4. 初始化命令序列升压、偏置、温度补偿怎么协同工作4.1 能直接抄的初始化代码先用标准库给出一个完整的初始化函数这个序列我实测可以点亮绝大多数ST7567模块用的是STM32F103模拟GPIO方式void ST7567_WriteCmd(uint8_t cmd) { CS_L(); A0_L(); // 命令模式 ST7567_SPI_WriteByte(cmd); CS_H(); } void ST7567_WriteData(uint8_t dat) { CS_L(); A0_H(); // 数据模式 ST7567_SPI_WriteByte(dat); CS_H(); } void ST7567_Init(void) { // 复位时序 RST_H(); DelayMs(10); RST_L(); DelayMs(20); RST_H(); DelayMs(50); // 初始化命令序列 ST7567_WriteCmd(0xE2); // 软复位 DelayMs(5); ST7567_WriteCmd(0xA2); // 1/9偏置比用于12864屏 ST7567_WriteCmd(0x2F); // 打开升压电路1、升压电路2、电压跟随器 DelayMs(20); // 等升压稳定 ST7567_WriteCmd(0x25); // 温度补偿系数选择第二档 ST7567_WriteCmd(0x22); // 内部电阻比例 ST7567_WriteCmd(0x81); // 电子对比度设置命令 ST7567_WriteCmd(0x1F); // 对比度初始值后续按需调整 ST7567_WriteCmd(0xA0); // ADC输出方向正常的列方向 ST7567_WriteCmd(0xC8); // COM扫描方向正常扫描 ST7567_WriteCmd(0xA6); // 正常显示关闭反显 ST7567_WriteCmd(0xAF); // 打开显示 DelayMs(20); ST7567_ClearScreen(); // 清屏 }4.2 0x2F升压电路不开就是白屏0x2F这个命令在ST7567初始化里排在非常重要的位置。ST7567内置了DC-DC升压电路用来产生液晶面板需要的驱动电压V0。如果这个升压电路没有打开驱动IC虽然能收到命令但液晶两端没有足够的电压差屏幕看起来就是白花花一片和没通电差不多。0x2F是完整开启三个电源模块——升压电路1、升压电路2、电压跟随器。有些初始化示例只写了0x2E也就是只开了升压电路1屏幕也可能亮但显示对比度可能偏弱驱动能力不足。我建议直接写0x2F一步到位。以后遇到白屏优先确认这一条命令有没有正确执行以及0x2F后面有没有留足升压稳定时间。4.3 偏置比、显示方向和非显示模式命令0xA2设置的是1/9偏置比这个参数要和屏幕面板的实际液晶层厚度、驱动电压匹配。12864这种结构用1/9偏置比较常见如果选择错误比如用了0xA3的1/7偏置画面会明显过暗或者过浓这不是对比度寄存器能完全弥补的。0xA0和0xC8决定扫描方向。0xA0是ADC正常方向0xC8是COM反向扫描这个组合在大多数模块上显示方向正确。如果你的屏幕装上去发现内容左右反了把0xA0改成0xA1上下反了把0xC8改成0xC0。如果左右和上下都反就把两个命令都换掉相当于旋转180度。另外有两个命令容易误触0xA5是“显示全亮”0xA4是“显示正常”。如果你初始化代码里不小心把0xA4写成了0xA5屏幕会整个变成深色或者全黑很多人误以为是屏坏了。5. 对比度调节的实战从0x20开始往上试5.1 0x81之后那个数据到底在调什么ST7567的电子对比度调节是通过命令0x81后跟一个0x00到0x3F之间的值来完成的。这个值控制的是芯片内部电阻网络的分压比直接影响输出给液晶面板的V0电压。V0电压不同液晶翻转程度就不同显示出来的笔画深度也就不一样。这里要特别注意0x3F是六位数据有些代码写成0x81、0x1F有些写成0x81、0x25都没有问题只要范围在0x00到0x3F之间。对比度数值越大显示越浓越黑。我在多数3.3V供电的模块上初始值用0x1F到0x25之间都能获得不错的显示效果。对比度和供电电压强相关。同样一个模块VDD3.3V时对比度0x22刚好如果把VDD换成5V同样的值可能显示过深甚至出现鬼影。所以网上抄对比度参数时最好确认对方的供电电压是多少否则抄过来不一定适配。5.2 调对比度的具体步骤与范围我调对比度有一套固定流程简单粗暴但高效把0x81后跟的数据先设成0x20屏幕显示一些规则图案比如全屏写0xFF的方框测试图肉眼观察如果笔画清晰、底色干净说明当前值合适如果太淡按0x02的步进往上加比如0x22、0x24、0x26直到显示清晰如果出现残影、横纹或者底色发黑说明对比度过高往回降到临界值以下2到4格把最终值固化到工程里最好用宏定义或者全局变量留出运行时修改口。常见误区的实际对比参照对比度值典型效果适用情况0x0C ~ 0x10笔画很淡接近看不清极少见仅个别高VDD模块0x1A ~ 0x22多数模块的甜点区间3.3V供电、常见ST7567模块0x25 ~ 0x2E显示较浓适合暗环境光线强、视角较偏时可用大于0x30容易出残影、横条纹一般不推荐5.3 温度补偿和内部电阻比例的配合ST7567提供了一组温度补偿系数命令0x24到0x27对应不同的电压温度系数。液晶材料在低温下响应变慢、显示偏淡在高温下容易显示过浓。温度补偿命令就是让V0电压跟随温度变化补偿液晶的这种漂移。如果你在北方冬天做户外项目初始化里最好选偏大的温度补偿系数。室内常温环境选0x25通常就够。有些模块出厂已经固化了合适的补偿系数但代码仍然应该设置因为你不知道卖家默认值是什么。内部电阻比例命令0x20到0x23影响的是对比度寄存器的可调范围。板子上如果没做硬件电位器一般设0x22或者0x23。调试遇到对比度调到0x30还是很淡时可以尝试把内部电阻比例增大一档再重新从0x20开始调对比度。这两个参数需要配合着调不要只动一个。5.4 对比度过头会出什么现象对比度调太高最典型的症状是出现横条纹或者“鬼影”也就是不该显示的像素也有淡淡的痕迹。这是因为V0电压过高或者过低导致液晶分子没有被正确地驱动到纯亮或者纯暗状态。还有一个容易忽略的问题对比度太高会加剧残影画面切换后上一帧的内容还能看到影子长时间停留一个界面后再刷新前一帧残像可能要几秒才消。遇到这个现象别怀疑屏坏了先把对比度降下来试试。我实测ST7567在0x2F附近或者更高时残影出现的概率显著增加。6. 故障排查不亮、白屏、花屏的定位思路6.1 先测硬件电压和引脚状态屏不出显示时第一步永远是测量硬件不要急着改代码。先用万用表量模块的VDD和GND之间电压确认有3.3V左右。然后量RST引脚正常状态应该接近VDD高电平。如果RST一直是低检查GPIO初始化和外部复位电路。然后量CS引脚它应该在你的初始化代码运行期间有拉低的动作。如果CS电平一直不变说明程序可能没有执行到初始化函数或者GPIO配置有问题。A0引脚也要看命令阶段是低电平数据阶段是高电平如果SCL和SDA有波形而A0不动检查命令发送函数。SCL和SDA的波形有条件就用示波器看没有示波器就查代码里SPI_WriteByte函数是否真的执行了。模拟SPI的话在关键引脚操作后面加几个GPIO翻转用来调试也是很有效的手段。6.2 现象与原因对照表这张表是我每次帮人调ST7567屏时都会发一次的速查表经验值很高现象可能原因优先排查方向白屏、无任何显示升压电路未打开缺0x2F检查初始化命令序列白屏、复位后偶尔正常上电延时不足或复位脉宽过短增加上电延时和RST低电平时间白屏、且VDD电压正常PS引脚悬空或电平错误检查PS/PSB引脚连接有显示但极淡对比度值过低增大0x81后跟的数据有显示但过浓、有残影对比度值过高降低0x81后跟的数据花屏、乱码SPI速率过高、A0不稳定降低SCL频率检查A0时序内容左右反ADC方向命令错误0xA0改为0xA1内容上下反COM扫描方向错误0xC8改为0xC0全黑或全亮误触0xA5显示全亮命令用0xA4恢复正常首次上电白屏、按复位正常初始化时序太快加长0x2F后的延时到20ms以上特定温度下变淡或过浓温度补偿系数不匹配调整0x24到0x276.3 最小点亮法验证屏本身是否健康当画面完全无反应又不想一上来就排查整个初始化流程时我习惯先做一个“最小点亮验证”用最少的命令确认屏和硬件接线是好的// 最短命令序列只开升压、设偏置、开显示 ST7567_WriteCmd(0xA2); ST7567_WriteCmd(0x2F); DelayMs(50); ST7567_WriteCmd(0xAF); DelayMs(20); // 然后直接往第0页写满0xFF看有没有对应的横线显示 ST7567_WriteCmd(0xB0); // 第0页 ST7567_WriteCmd(0x10); // 列地址高4位 ST7567_WriteCmd(0x00); // 列地址低4位 for (uint8_t i 0; i 128; i) { ST7567_WriteData(0xFF); }如果执行这个最小序列后屏幕顶部出现了一条横实线说明屏、接线、SPI通信都是通的问题出在完整初始化代码的某个细节上。如果完全没有反应那重点检查硬件层面尤其是PS引脚、复位引脚和供电电压。使用这种方法时建议用比较低的频率或者干脆用模拟SPI排除掉频率过高带来的问题。最小点亮法我几乎每次都会用它能把“硬件问题”和“软件时序问题”快速切分开避免在没有头绪的情况下反复刷写程序浪费时间。最后说一个我自己的体会ST7567这颗IC本身很皮实绝大多数“屏坏了”的结论最后都指向初始化不完整或者时序不稳。尤其是0x2F这个开升压的命令稍微粗心漏掉就会换来长时间的怀疑人生。如果你把通用初始化代码搬过来仍然不亮我建议按最笨的办法从最小点亮序列开始一步步往上加命令直到定位到是哪一条命令的影响。这样调完一次你对这颗屏的理解会比直接抄一堆代码要深得多。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。