找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 544|回复: 9
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
本帖最后由 ztzp 于 2025-8-2 16:55 编辑

几年前买得有几片OLED液晶显示屏,驱动是SSD1306的。
引脚定义:

Vcc接液晶排线的6和9脚,Gnd接排线的25、29脚。
卖家给的信息:

根据“中景园电子科技”公司提供的例程,用了STC几种型号的单片机一直没点亮这个OLED。后来送了几片给网友“f556”,他很容易就点亮了这个OLED,他用的平台是MSP430。

根据他提供的例程,我也用自制的MSP430F4152最小系统点亮了这个OLED。



但用同一家公司提供的51单片机程序,却始终无法点亮它。
根据网友“f556”介绍,OLED的初始化程序完成后,屏幕显示雪花点,就算点亮了,后面显示其它字符的内容都不重要。
仔细地分析51单片机与MSP430单片机的初始化例程,逐行对比,本质上完全是一样的,但在STC单片机控制下,OLED屏幕一片黑暗,郁闷极了!
为了彻底弄清STC单片机驱动OLED的问题,买了一个简易的“逻辑分析仪”:

为了将单片机、OLED和逻辑分析仪连接在一起,又焊了一个5脚分线器。


根据资料,控制OLED的时序图是这样的:

由于MSP430控制OLED已经成功了,所以我就把它的时序图作为范本来进行研究。
先用分析仪捕获MSP430控制OLED的几根主要信号线(时钟、指令/数据标志、数据等),为了研究问题简单,只捕获初始化程序第一字节指令,时序图如下:

而初始化程序第一字节时序图的源代码为:

0xAE换算成二进制数就是:10101110,与捕获到的数据是一致的。
通过MSP430正确运行的代码而捕获到的以上时序图,也初步学会了“逻辑分析仪”的使用。
用STC单片机控制OLED的平台是前不久刚制作完成的STC32G最小系统板,此单片机可以工作在3.3V电压下,为了问题简便,只写了OLED的初始化代码,甚至在初始化函数中只向OLED发送了一字节指令,如上所示。
用“逻辑分析仪”捕获到的时序图为:

这个时序图一看就不正常,感觉时钟脉冲的“占空比”都比较小,形成的脉冲很窄,D/C波形也没看到有高电平,数据也不正确。
以“模拟电路”的思维分析这些脉冲,感觉是负载太重,驱动电路在输出高电平时,瞬间被负载拉低所造成的。
初步怀疑OLED需要的驱动电流比较大,STC单片机的“准双向口”无法胜任,故高电平无法维持足够长的时间,导致脉冲波变窄。
因为以前用STC的单片机驱动LCD时,使用的都是默认的“准双向口”,这次想到OLED与LCD都差不多,也就没特别去配置I/O口,默认使用它的“准双向口”。
后来将:时钟、指令/数据标志、数据、复位等控制线的I/O口模式改为“推挽模式”,亦即:

程序修改以后,时序图正常了。

其实“逻辑分析仪”的软件自己也会分析数据,根据设置的SPI协议,软件分析出来的数据又快又准:

在“逻辑分析仪”的帮助下,OLED屏久违的“雪花点”终于出现了。

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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 | 只看该作者
楼主和沙发板凳分析的都很到位。逻辑分析仪是开发常用的设备。在协议开发时非常有用。
回复

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

7#
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口设置成“准双向”,后来才改为“推挽”
回复

使用道具 举报

8#
ID:97023 发表于 2025-8-6 11:46 | 只看该作者
OLED左上角那三个下拉电阻R30、R31、R32,阻值510R,分流电流大约为:6.5mA,而STC32G单片机的接电流却不到300uA。

肯定带不动了。
初步计算了一下,如果下拉电阻为100K,则分流电流大概为33uA。
为方便,直接将它们拆除,在“准双向”模式下OLED终于显示了。



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

使用道具 举报

9#
ID:152164 发表于 2025-8-6 13:52 来自触屏版 | 只看该作者
ztzp 发表于 2025-8-5 23:14
手册肯定是看了的,一开始设置成了“准双向口”。

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

使用道具 举报

10#
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 单片机教程网

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