OLED模块-I2C协议
OLED模块概述
1.1 OLED简介
OLED
(Organic Light-Emitting Diode,有机发光二极管)显示屏由许多微小的发光二极管构成,每个发光二极管就对应着屏幕上的一个像素,通过控制二极管的亮灭就能在屏幕上显示图像或文字。
按照驱动方式划分,OLED
显示屏分可分为两类,分别是PMOLED
(Passive Matrix,被动矩阵)和AMOLED
(Active Matrix,主动矩阵)。
PMOLED
的驱动方式和LED
点阵类似,每次只能点亮一行或者一列,需要快速的逐行或者逐列扫描来显示内容。AMOLED
屏幕上的每个像素点都有一个单独的控制电路,可以独立进行控制。
本文使用的是一块PMOLED
(Passive Matrix,被动矩阵)屏,其分辨率为128x64
。
1.2 驱动芯片
市面上的多数OLED
显示屏都会带有驱动芯片,驱动芯片的核心作用是控制每个像素点的亮灭以显示图像或文字,此外它还会提供数据接口(例如I2C
),用于接收屏幕上要显示的数据。驱动芯片的存在使得我们可以通过简单的接口控制OLED
显示屏,大大简化了开发和控制流程。
本文所使用的这块OLED
屏的驱动芯片为SSD1315,由于我们需要通过它来控制OLED
显示的内容,所以需要重点学习它的用法。
1.2.1 基本工作原理
- 工作流程
1.2.2 IIC接口
虽然SSD1315
的MCU Interface
支持多种通信协议,但我们所选用的OLED
显示模块只暴露出了IIC
接口,如下图所示。
由于OLED
显示屏的作用是显示数据,它对于MCU
来讲更多的是一个输出设备,因此我们只需关注如何向SSD1315
写入数据即可。下面是写数据的时序图:
说明:SSD1315
的地址,高6位是固定的011110
,最后1位SA0
可由用户自定义。参考OLED
模块手册,可得最后1位的默认值为0R/W#
(读写标识)应为0。(增加或移出相应电阻可以更改高低电平实现修改地址)
结论:地址 + 读写标识应为01111000(0x78)
。
说明:
MCU
向SSD1315
发送的数据可分为两类 -- Controlbyte
和Data byte
。
Data byte
: 数据字节,其内容可能是Data
(显示数据),也可能是Command
(控制命令)。Control byte
: 控制字节,在Data byte
之前发送,用于声明后续Data byte
内容的类型和格式,该字节只有高2位有效,其余6位均为0;D/C#
(Data/Command): 用于声明后续的Data byte
是Data
还是Command
,1表示Data,0表示Command。Co
(Contination Bit): 用于声明后内容是否连续。0表示连续。此时后边可以连续发送多个Data bvte
;1表示不连续,此时后边只能发送一个Data byte
。需要注意的是,当
Co
设置0时,本次通信中后续所有的字节都会被视作Databyte
,co
位的具体用法如下:
1.2.3 GDDRAM
GDDRAM
的作用是存储显示数据,其容量是128×64 bit
,每个bit
对应着屏幕上的一个像素,该bit
的值就能决定该像素的亮灭。
1.2.3.1 内存组织结构
分为8页,每一页128x8个字节:
每一页的结构
写一个Data byte
:从上往下,而不是从左往右
1.2.3.2 内存寻址
在了解了内存组织结构之后,我们还需掌握内存的寻址方式,这样才能在我们指定的位置写入指定的内容。
向GDDRAM
写入数据时是以byte
为单位的,按照上述的内存组织结构, 定位一个byte
,至少需要明确两点,分别是第几页(Page Address,页地址)和第几列(Column Address,列地址)。因此GDDRAM
内部设有两个指针, Page Address Pointer和Column Address Pointer,分别指向当前要写入的页和列。为方便连续写入多个字节,每当成功写入一个字节后,Page Address Pointer或者Column Address Pointer会自动递增,指向下一个要写入的位置。
根据指针递增逻辑的不同,GDFRAM
提供了三种不同的寻址方式,分别是页寻址,水平寻址和垂直寻址,具体使用哪种模式,可以通过向SSD1315
发送控制命令进行选择,具体命令如下:
下面逐一介绍三种寻址方式的工作原理。
页寻址
这种寻址方式下,用户需要先向
SSD1315
发送控制命令设置页地址(例如Page1
)和列地址(例如COL3
),此时Page Address Pointer和Column Address Pointer就会指向对应的位置。之后便可开始连续发送数据,每成功写入一个字节,Column Address Pointer都会自动+1,而Page Address Pointer始终不变,如果写到当前页末尾,Column Address Pointer会回到当前页的第1列。
设置页地址的命令如下: X三位表示0-7行
设置列地址的命令如下: 两个字节拆开分别表示高位和低位,7位可以表示0-127列
水平寻址
这种寻址方式下,用户需要先向
SSD1315
发送控制命令,设置一个写入区域,具体来讲就是分别指定页的起始地址和结束地址(例如Page1~Page5
)以及列的起始地址和结束地址(例如COL2~COL125
)。此时Page Address Pointer和Column Address Pointer会指向该区域的左上角。之后便可开始连续发送数据,每成功写入一个字节,Column Address Pointer
会自动+1,当到达目标区域的右侧边界时,Page Address Pointer
便会自动+1。当写到目标区域的右下角时,两个指针会再次回到左上角。如下图所示。
设置页地址范围的命令如下。
如: 00100010 00000001 00000011 为1-3页
设置列地址范围的命令如下
如:00100001 00000001 00000011 为1-3列
垂直寻址
这种寻址方式下,用户需要先向
SSD1315
发送控制命令,设置一个写入区域,具体来讲就是分别指定页的起始地址和结束地址(例如Page1~Page5)以及列的起始地址和结束地址(例如COL2~COL125)。此时Page Address Pointer和Column Address Pointer会指向该区域的左上角。之后便可开始连续发送数据,每成功写入一个字节,Page Address Pointer会自动+1,当到达目标区域的底部边界时,Column Address Pointer便会自动+1。当写到目标区域的右下角时,两个指针会再次回到左上角。如下图所示:
1.2.3.3 内存bit与屏幕像素映射关系
GDDRAM
中的每个bit
都对应着屏幕上的一个像素,但具体哪个bit
对应着哪个像素,目前仍是不明确的,最理想的方式当然是每个bit
和每个像素的位置完全对应,但默认情况下并非如此。
bit
和像素之间的对应关系受两个环节的影响,第一个环节是GDDRAM
和SSD1315
输出引脚(64个COM和128个SEG)的对应关系,第二个环节是SSD1315
的输出引脚和OLED
屏幕的连线方式。下面逐一分析。
GDDRAM
和SSD1315
输出引脚对应关系,默认映射关系如下:一一对应
SSD1315
输出引脚和OLED
屏幕对应关系,行和列都与GDDRAM
和SSD1315
相反:
- 为了保证设计的灵活性,
SSD1315
提供了重映射功能,用户可以通过控制命令来重新定义GDDRAM
和输出引脚的对应关系,如下
映射过后,GDDRAM
行的0对应oled
屏幕行的0,GDDRAM
列的0对应oled
屏幕的列0,我们让左上角的二极管亮,只需要将SEG0
和COM0
定位的二极管亮即可;
设置Segment重映射的命令如下:
设置1即可让127映射为SEG0,从左到右127到0
设置Common重映射的命令如下:
X3设置为1即可从上到下为63到0
1
1
1
1
1
1
1
1
1
1