我们之前讲了 LCD1602,今天我们将它的进阶模块——OLED。它接线更少,性能更强,也能显示中文和图像了。
大家在学习单片机的时候是否会遇到调试的问题呢?例如 “这串代码我到底运行成功了没有” ,我相信很多刚开始学习单片机的小白一般都遇到过这样的问题。但是单片机不像电脑,是没有屏幕也没有输出结果窗口的。那么我们该如何得知调试的结果呢?有一个方法是通过串口打印在运行成功代码会向串口发送特定的字符到电脑上,但是这个方法的弊端是如果单片机被放置到一个实际的项目当中,就无法通过串口来得知结果了。还有一个方法就是将结果打印到屏幕上,当然我们的单片机是没有屏幕的,所以我们需要为单片机增添一个外置的屏幕模块。我们今天就来学习一下如何使用 OLED 屏幕模块。
OLED(Organic Light-Emitting Diode)具有高亮度、高对比度和快速响应的特点,能够提供生动逼真的图像和文字显示效果。由于不需要背光源,OLED 屏更薄、更轻、更省电。它在智能手机、可穿戴设备、汽车仪表盘等领域得到广泛应用。本文将通过介绍 OLED 的工作原理、特性和应用案例,带大家深入了解 OLED。
1. 源码下载及前置阅读
本文首发 良许嵌入式网 :https://www.lxlinux.net/e/ ,欢迎关注!
本文所涉及的源码及安装包如下(由于平台限制,请点击以下链接阅读原文下载):
https://www.lxlinux.net/e/stm32/oled-tutorial.html
如果你是嵌入式开发小白,那么建议你先读读下面几篇文章。
- 嵌入式基本功,为后续学习打下坚实的基础:STM32串口接收不定长数据(接收中断+超时判断)
- 手把手教你安装和使用STM32CubeMX:一文教你使用STM32CubeMX开发工具
- 手把手让你掌握MDK的使用方式和技巧,助你更高效地进行开发:一文教你使用MDK开发工具
往期教程,有兴趣的小伙伴可以看看。
- 如果想知道自己对嵌入式知识掌握程度:嵌入式自测题
- 蓝牙模块详解,轻松掌握一种无线通信技术:手把手教你玩转蓝牙模块(原理+驱动)
- 让你轻松掌握温湿度传感器:手把手教你玩转DHT11(原理+驱动)
作者简介 |
---|
大家好,我是良许,博客里所有的文章皆为我的原创。 下面是我的一些个人介绍,欢迎交个朋友: · 211工科硕士,国家奖学金获得者; · 深耕嵌入式11年,前世界500强外企高级嵌入式工程师; · 书籍《速学Linux作者》,机械工业出版社专家委员会成员; · 全网60W粉丝,博客分享大量原创成体系文章,全网阅读量累计超4000万; · 靠自媒体连续年入百万,靠自己买房买车。 |
我本科及硕士都是学机械,通过自学成功进入世界500强外企。我已经将自己的学习经验写成了一本电子书,超千人通过此书学习并转行成功。现在将这本电子书免费分享给大家,希望对你们有帮助:
电子书链接:https://www.lxlinux.net/1024.html
2. IIC通信
OLED 屏幕模块是通过 IIC 进行通信的,什么是 IIC 通信呢?
2.1 IIC通信介绍
IIC 通信通常也叫 I2C,I2C( Inter-Integrated Circuit ),中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,是由飞利浦( Philips )公司在 1980 年代初设计的一种串行、半双工的通信,主要用于近距离、低速的芯片之间的通信。I2C 总线有两根双向的信号线,一根数据线 SDA 用于收发数据,一根时钟线 SCL 用于通信双方时钟的同步。I2C 总线硬件结构简单,简化了 PCB 布线,降低了系统成本,提高了系统可靠性,由于它的简单性,它被广泛用于微控制器与传感器阵列,显示器,IoT 设备,EEPROM 等之间的通信。
I2C 通信协议的特点:
同步、半双工;
只需要两条总线;
所有组件之间都存在简单的主/从关系,连接到总线的每个设备均可通过唯一地址进行软件寻址;
I2C 是真正的多主设备总线,可提供仲裁和冲突检测;
没有严格的波特率要求,例如使用 RS232 ,主设备生成总线时钟;
I2C 总线是一种多主机总线,连接在 I2C 总线上的器件分为主机和从机。主机每一次发起和结束一次通信,从机只能被动呼叫;当总线上有多个主机同时启用总线时,I2C 也具备冲突检测和仲裁的功能来防止错误产生。总线具有极低的电流消耗,抗噪声干扰能力强,增加总线驱动器可以使总线电容扩大10倍,传输距离达到 15m ;兼容不同电压等级的器件,工作温度范围宽。
I2C 总线可以通过外部连线进行在线检测,便于系统故障诊断和调试,故障可以立即被寻址,软件也有利于标准化和模块化,缩短开发时间。
每个连接到 I2C 总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为主机也可以作为从机(但是同一时间主机只能有一个),总线上的器件增加和删除不影响其他器件正常工作。I2C 总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器。
I2C 总线上可挂接的设备数量受总线的最大电容 400pF 限制。串行的8位双向数据传输速率在标准模式下可达 100Kbit/s ,快速模式下可达 400Kbit/s ,高速模式下可达 3.4Mbit/s 。
2.2 IIC通信协议
那么 I2C 是如何实现通信的呢?
- 主机发送起始信号然后启用总线;
- 主机发送一个字节数据指明从机地址和后续字节的传送方向;
- 被寻址的从机发送应答信号去回应主机;
- 发送器发送一个字节数据;
- 接收器发送应答信号回应发送器;
- 接下来会一直重复 4 和 5 的步骤直到通信完成后主机发送停止信号并释放总线。
起始信号与停止信号
当 SCL 为高电平时,SDA 产生下降沿,就是电平由高变低表示起始信号;
当 SCL 为高电平时,SDA 产生上升沿,就是电平由低变高表示停止信号;
当 SCL 与 SDA 同时为高电平时,表示当前为空闲状态。
起始信号和停止信号都是由主机发出,起始信号产生后总线处于占用状态,停止信号产生后总线被释放,处于空闲状态。
应答信号与非应答信号
I2C 总线上的所有数据都是以 8bit 字节传输的,发送器每发送一个字节,就在第 9 个时钟开始时释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。对于反馈有效应答位 ACK 的要求是,接收器在第 9 个时钟脉冲之前的低电平期间将 SDA 线拉低,并且确保在该时钟的高电平期间为稳定的低电平。 如果接收器是主控器,则在它收到最后一个字节后,发送一个 NACK 信号,以通知被控发送器结束数据发送,并释放 SDA 线,以便主控接收器发送一个停止信号。
2.3 软件模拟IIC通信
STM32 的硬件 I2C 存在着一些 BUG ,有时候莫名会出现问题,所以大多数情况下都会使用软件模拟 I2C 。使用软件模拟 I2C 主要是方便程序的移植,在使用时只需要修改一下相应的 GPIO 口即可。而 oled 屏幕模块就是使用软件模拟 I2C 通信的,我们将会在下文学习软件模拟 I2C 通信。
3. OLED屏幕
OLED 屏幕模块型号多种多样,屏幕大小、引脚(4P 支持 I2C,7P 支持 I2C 和 SPI)、字体颜色不同。本次我们以 0.96 寸,4P,白色为例来讲解,一通百通。
3.1 0.96OLED屏幕介绍
0.96 寸 4P OLED 屏幕模块是一种显示屏模块,它包括一个 0.96 英寸的 OLED 显示屏和四个引脚。这种 OLED 屏幕模块通常用于嵌入式系统和小型电子设备中,可以显示文本、图像和其他类型的信息。由于其小尺寸和低功耗,也常用于智能手表、健康追踪器和其他便携式设备中。
下面这个是一款常见的 0.96 寸四针 OLED 屏幕模块,某宝价格在 7~15 左右。
0.96OLED 参数:
- 驱动芯片:SSD1306
- 分辨率:128 × 64
- 显示尺寸:0.96英寸
- 外形尺寸:27.5 × 27.8(mm)
- 玻璃尺寸:26.7 × 19.26 × 1.4(mm)
- 显示区域:21.74(W)× 10.864(mm)
- 视角:全视角
- 工作电压:3.3V ~ 5V
- 工作温度:-20℃ ~ 70℃
- 存储温度:-30℃ ~ 80℃
- 使用寿命:>=16000 小时
- 支持接口:I2C
参考接线如下:
OLED | STM32 | 备注 |
---|---|---|
GND | G | 电源负极 |
VCC | 3.3/5V | 电源正极 |
SCL | B8(SCL1)/B10(SCL2) | 时钟线 |
SDA | B9(SDA1)/B11(SDA2) | 数据线 |
0.96OLED 屏幕模块的优点有:
- 高对比度和高亮度:OLED 屏幕模块可以提供深黑色背景和明亮的字色,因此可以实现高对比度和高亮度的显示效果;
- 自发光:OLED 屏幕模块不需要背光灯,因此可以实现更薄、更轻的设计;
- 响应速度快:OLED 屏幕模块的响应速度非常快,可以实现流畅的动画和视频效果;
- 视角宽:OLED 屏幕模块的视角非常宽,即使从不同角度观察,图像和文字也能保持清晰。
0.96OLED 屏幕模块的缺点有:
- 显示寿命短:与 LCD 显示屏相比,OLED 的显示寿命相对较短,因为它的有机材料会随着时间的推移而逐渐失效;
- 显示面积小:0.96 寸 OLED 屏幕模块的显示面积相对较小,因此不适合用于需要大屏幕的应用。
3.2 SSD1306介绍
接下来我们介绍一下 OLED 屏模块的芯片——SSD1306。
SSD1306 是一款带控制器的用于 OLED 点阵图形显示系统的单片 CMOS OLED/PLED 驱动器。它由 128 个 SEG(列输出)和 64 个 COM(行输出)组成。该芯片专为共阴极 OLED 面板设计。 SSD1306 内置对比度控制器、显示 RAM(GDDRAM)和振荡器,以此减少了外部元件的数量和功耗。该芯片有 256 级亮度控制。数据或命令由通用微控制器通过硬件选择的 6800/8000 系通用并行接口、I2C 接口或串行外围接口发送。该芯片适用于许多小型便携式应用,如手机副显示屏、MP3 播放器和计算器等。
SSD1306 芯片结构图:
SSD1306 芯片引脚图:
SSD1306 芯片引脚说明:
NC:空引脚,不要短接;
VCC:显示面板驱动电源引脚;
VCOMH:用于 COM 的高电平电压输出的引脚,与 VSS 之间应该连接一个电容;
IREF:段输出电流参考脚,VSS 间应连接一个电阻,以将 IREF 电流保持在 12.5uA ;
D[7~0]:连接到 MCU 的 8 位双向数据总线,不同 MCU 总线接口有不同用法;
E (RD#):与 6800/8080 通用并行总线接口相关,使用串行接口时作拉高处理;
R/W#(WR#):与 6800/8080