找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1491|回复: 9
收起左侧

用STC单片机驱动OLED液晶的感受

  [复制链接]
ID:97023 发表于 2025-8-2 16:48 | 显示全部楼层 |阅读模式
本帖最后由 ztzp 于 2025-8-2 16:55 编辑

几年前买得有几片OLED液晶显示屏,驱动是SSD1306的。
引脚定义:
2021-11-18 接口定义.jpg
Vcc接液晶排线的6和9脚,Gnd接排线的25、29脚。
卖家给的信息:
卖家信息.jpg
根据“中景园电子科技”公司提供的例程,用了STC几种型号的单片机一直没点亮这个OLED。后来送了几片给网友“f556”,他很容易就点亮了这个OLED,他用的平台是MSP430。
2022-08-18 冯乔春的实验.jpg
根据他提供的例程,我也用自制的MSP430F4152最小系统点亮了这个OLED。
2022-08-19 电路.jpg

2022-08-19 显示.jpg
但用同一家公司提供的51单片机程序,却始终无法点亮它。
根据网友“f556”介绍,OLED的初始化程序完成后,屏幕显示雪花点,就算点亮了,后面显示其它字符的内容都不重要。
仔细地分析51单片机与MSP430单片机的初始化例程,逐行对比,本质上完全是一样的,但在STC单片机控制下,OLED屏幕一片黑暗,郁闷极了!
为了彻底弄清STC单片机驱动OLED的问题,买了一个简易的“逻辑分析仪”:
01 分析仪.jpg
为了将单片机、OLED和逻辑分析仪连接在一起,又焊了一个5脚分线器。
04 分线器2.jpg
IMG_20221201_112527.jpg
根据资料,控制OLED的时序图是这样的:
SSD1306 SPI时序图.png
由于MSP430控制OLED已经成功了,所以我就把它的时序图作为范本来进行研究。
先用分析仪捕获MSP430控制OLED的几根主要信号线(时钟、指令/数据标志、数据等),为了研究问题简单,只捕获初始化程序第一字节指令,时序图如下:
MSP430,第一字节时序图.png
而初始化程序第一字节时序图的源代码为:
向OLED发送的第一字节指令代码.png
0xAE换算成二进制数就是:10101110,与捕获到的数据是一致的。
通过MSP430正确运行的代码而捕获到的以上时序图,也初步学会了“逻辑分析仪”的使用。
用STC单片机控制OLED的平台是前不久刚制作完成的STC32G最小系统板,此单片机可以工作在3.3V电压下,为了问题简便,只写了OLED的初始化代码,甚至在初始化函数中只向OLED发送了一字节指令,如上所示。
用“逻辑分析仪”捕获到的时序图为:
STC32G,准双向,第一字节,时序图.png
这个时序图一看就不正常,感觉时钟脉冲的“占空比”都比较小,形成的脉冲很窄,D/C波形也没看到有高电平,数据也不正确。
以“模拟电路”的思维分析这些脉冲,感觉是负载太重,驱动电路在输出高电平时,瞬间被负载拉低所造成的。
初步怀疑OLED需要的驱动电流比较大,STC单片机的“准双向口”无法胜任,故高电平无法维持足够长的时间,导致脉冲波变窄。
因为以前用STC的单片机驱动LCD时,使用的都是默认的“准双向口”,这次想到OLED与LCD都差不多,也就没特别去配置I/O口,默认使用它的“准双向口”。
后来将:时钟、指令/数据标志、数据、复位等控制线的I/O口模式改为“推挽模式”,亦即:
推挽模式.png
程序修改以后,时序图正常了。
STC32G,推挽输出,第一字节时序图.png
其实“逻辑分析仪”的软件自己也会分析数据,根据设置的SPI协议,软件分析出来的数据又快又准:
软件自动分析的数据.png
在“逻辑分析仪”的帮助下,OLED屏久违的“雪花点”终于出现了。
IMG_20221201_011606.jpg

评分

参与人数 2黑币 +40 收起 理由
f556 + 10
wpppmlah + 30 赞一个!

查看全部评分

回复

使用道具 举报

ID:111099 发表于 2025-8-3 10:19 来自触屏版 | 显示全部楼层
看起来OLED屏的几个通信脚都串联了510欧电阻,原本是为了兼容5V电平,这里就造成了很大的影响。按理应该使用几十欧即可,所以过大就很难用常规准双向IO推动了。LZ可以考虑把那几个电平转换电阻换一下,估计会有惊喜。
回复

使用道具 举报

ID:807591 发表于 2025-8-4 08:25 | 显示全部楼层
双向驱动电流最大 500uA,,一个下拉电阻510欧,妥妥的给把信号干没了
回复

使用道具 举报

ID:276663 发表于 2025-8-4 11:15 | 显示全部楼层
楼主和沙发板凳分析的都很到位。逻辑分析仪是开发常用的设备。在协议开发时非常有用。
回复

使用道具 举报

ID:152164 发表于 2025-8-5 09:01 来自触屏版 | 显示全部楼层
原因很简单,就是不看手册的问题。stc8和之后的stc32单片机默认端口上电为高阻状态,和以前的系列不一样
回复

使用道具 举报

ID:97023 发表于 2025-8-5 23:14 | 显示全部楼层
ziiyn 发表于 2025-8-5 09:01
原因很简单,就是不看手册的问题。stc8和之后的stc32单片机默认端口上电为高阻状态,和以前的系列不一样

手册肯定是看了的,一开始设置成了“准双向口”。
回复

使用道具 举报

ID:97023 发表于 2025-8-5 23:20 | 显示全部楼层
ziiyn 发表于 2025-8-5 09:01
原因很简单,就是不看手册的问题。stc8和之后的stc32单片机默认端口上电为高阻状态,和以前的系列不一样
  1. void main(void)
  2. {
  3.         P3M1 = 0x00;        //把P3.2~P3.5设置为“推挽输出”
  4.         P3M0 = 0x3C;

  5. //        P3M1 = 0x00;        //把P3.2~P3.5设置为“准双向”
  6. //        P3M0 = 0x00;

  7.         OLED_Init();                        //初始化OLED  
  8.        
  9. //        Line();
  10.         while(1);
  11. }
复制代码

当初I/O口设置成“准双向”,后来才改为“推挽”
回复

使用道具 举报

ID:97023 发表于 2025-8-6 11:46 | 显示全部楼层
OLED左上角那三个下拉电阻R30、R31、R32,阻值510R,分流电流大约为:6.5mA,而STC32G单片机的接电流却不到300uA。
2025-08-06 3.jpg
肯定带不动了。
初步计算了一下,如果下拉电阻为100K,则分流电流大概为33uA。
为方便,直接将它们拆除,在“准双向”模式下OLED终于显示了。
2025-08-06 1.jpg

2025-08-06 2.jpg
总结,以前看手册时也不太认真,另外在使用OLED时,只把它当作一个模块来看,没去分析它上面的电路,导致走了很多弯路。
犯了这些错误,自己也有了提高。
谢谢以上各位朋友有帮助!
回复

使用道具 举报

ID:152164 发表于 2025-8-6 13:52 来自触屏版 | 显示全部楼层
ztzp 发表于 2025-8-5 23:14
手册肯定是看了的,一开始设置成了“准双向口”。

我一开始没细看电路图照片, 用准双模式的时候信号会被R30~R33几个对地510欧电阻拉低了电平,造成波形不正常,把那几个电阻拆了再用准双模式应该就正常了。按常理说那几个电阻应该设计成串联来兼容5v电平,结果却是并联到地。
回复

使用道具 举报

ID:97023 发表于 2025-8-6 21:35 | 显示全部楼层
ziiyn 发表于 2025-8-6 13:52
我一开始没细看电路图照片, 用准双模式的时候信号会被R30~R33几个对地510欧电阻拉低了电平,造成波形不 ...

这个OLED虽然说是工作在3.3V,但拆除那三个电阻前,我确实也用STC的5V单片机驱动,I/O口设置为“推挽”的情况下,也是可以工作的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表