OLED模块简介
OLED (Organic Light-Emitting Diode)即:有机发光二极管。
主流的OLED器件(模块)的规格如下:
尺寸 | 0.96寸OLED显示屏(驱动芯片:SSD1306/SSD1315) |
1.3寸OLED显示屏(驱动芯片:SH1106) | |
接口 | 4针脚 I2C接口 |
7针脚 SPI接口 | |
像素 | 128*64像素 |
颜色 | 颜色不限 |
对于其接口,如果购买的是OLED模块,而非裸屏,那么生产厂家通常已经配置好接口模式了,如下图所示,分别配置为I2C接口(左)和SPI接口(右):
OLED模块结构 :
模块是由一片真正的屏幕和一块PCB底板组成:PCB底板上就是一些最小系统电路,加底板的主要目的是方便我们插接电路;玻璃屏幕通过密集的软排线与底板焊接在一起,如下图所示:
驱动芯片SSD1306
对于OLED显示屏,点阵屏幕需要不断进行扫描刷新,但128*64的点阵屏直接用单片机驱动,显然无法完成(光从接线上看,就需要近200根线)。因此我们需要给它单独装一个负责扫描驱动的芯片,以SSD1306为例,如下所示:
SSD1306是一款OLED/PLED点阵显示屏的驱动芯片(控制器),可以嵌入在屏幕中,用于执行接受数据、显示存储、扫描刷新等任务。
-----引脚分布-----
芯片上面一排密密麻麻的SEG引脚,总共128个,直接接到了点阵屏的128列;左边和右边(包括左下和右下部分),每边32个COM引脚,分别接到了点阵屏的64行。
下面还有一排引脚,为电源、配置、通信引脚,我们想要显示什么就通过通信引脚告诉驱动芯片,驱动芯片接收到数据后,就会刷新显示到点阵屏上。
1、内置显示存储器(GDDRAM):用来存储所需显示内容的RAM存储器,容量为128*64bit(即1024字节),对应点阵屏的128*64的屏幕像素(1个bit对应一个像素点:bit写1—>像素点亮)。
2、供电:使用SSD1306,必须提供两个电源,如下表所示:
VDD供电 | VCC供电 |
1.65~3.3V | 7~15V |
提供给IC逻辑电路(芯片内部逻辑电路、存储器等) | 主要用于面板驱动(即点亮像素点) |
对于OLED模块,屏幕厂商为了方便我们使用,在屏幕内部已经集成了一个升压电路,只要开启升压电路,面板的7~15V驱动电源就有了。同时模块上有LDO降压芯片,即使外加5V,它也可以降到3.3V,给内部逻辑供电。
注意,LDO降压芯片位于PCB底板,只有加了底板,VCC才能接5V。如果单独买裸屏,VCC不能接5V。
3、通信接口:支持8位6800/8080并行接口、3/4线SPI接口、I2C接口,但一次只能使用一种。
SSD1306框图及引脚定义
1、芯片内部结构框图
MCU通信接口负责接收我们发送的字节,然后进行分流(发送一个字节后,可以指定这个字节是作为数据还是命令)。
-----数据与命令-----
对于命令,会进入下面的命令译码器,用于控制内部电路的执行,例如开启显示、关闭显示、设置对比度、设置显示起始位置等。芯片内有一个命令表,参考命令表就能知道这个命令是什么功能。
对于数据,会进入右边的图形显示数据RAM存储器(GDDRAM)被存储起来,定义为数据的字节就决定了屏幕上显示什么内容。将想显示的内容写入GDDRAM的对应位置,在屏幕上就会显示对应的内容。
显示控制器:负责读取GDDRAM,将里面的内容扫描刷新到屏幕上。
振荡器:用于提供刷新的时钟,CL是时钟输入脚、CLS是时钟源选择脚。SSD1306内部自带时钟,具体用法如下:
1、CLS接高电平 | 2、CLS接低电平 |
选择内部时钟 | 选择外部时钟 |
CL引脚不使用 | CL引脚接外部时钟源 |
电流控制与电压控制:V_comH是公共端的电压输出,一般在外面接个电源滤波电容即可;I_REF是驱动电流控制,在外面接个电阻,可以控制驱动屏幕的电流(不同厂商生产的屏幕所需驱动电流可能不同)。
2、引脚定义
BS0、BS1、BS2
用于选择通信接口,上文提到SSD1306支持 6800 /8080 /3线SPI /4线SPI /I2C,具体使用哪种,由这3个引脚来决定,具体如下:
I2C | 6800 | 8080 | 4线SPI | 3线SPI | |
BS0 | 0 | 0 | 0 | 0 | 1 |
BS1 | 1 | 0 | 1 | 0 | 0 |
BS2 | 0 | 1 | 1 | 0 | 0 |
D0~D7
作为数据传输线,在不同通信模式下,引脚功能也不同,如下表所示:
6800/8080 | D0~D7为:8位双向数据总线 |
3/4线SPI | D0为SCLK、D1为SDIN |
I2C | D0为SCL、D1为SDAin、D2为SDAout |
值得注意的是,虽然I2C有SDAout,但实际上,在串行模式下(SPI、I2C),不支持读取芯片内的数据(即:只能写不能读)。
R/W#(WR#)
在6800模式下,为R/W#,指定读/写操作,其中写为低电平有效。在8080模式下,为WR#,即写使能。
E(RD#)
在6800模式下,为E,即读/写使能。在8080模式下,为RD#,即读使能。
D/C#
对于6800/8080/4线SPI,通过此引脚来选择传输的是数据还是命令;对于I2C,通过此引脚来指定从机地址最低位。(其数据、命令选择通过时序来选择)
各种模式下字节传输时序
1、I2C时序
首先需要主机发送一个起始位,起始后需要再发送一个字节(7位的从机地址+1位的读写位)寻址。如图,SSD1306的从机地址为011110x,x由SA0引脚配置,用于更改从机地址;最后一位是R/W#,表示读写,但串行模式只能写入,因此始终给0,表示写入。
寻址完后,就可以进行数据或命令的发送了。在我们发送一个Data byte之前,需要先发送一个Control byte,用于指定后面的字节是命令还是数据。
Control byte的定义如上图右下角部分:其最高位是Co连续模式、次高位就是指定的D/C、剩下的没用,均为低电平。
Co连续模式如下:
Co=1 | 表示每个Data byte前都要加Control byte(可以数据和命令交互发送,命令与数据可以灵活切换) |
Co=0 | 表示先发生一个Control byte,其后面的字节均为Data byte(指定了命令,则后面全是命令;数据同理) |
2、3线SPI时序
3、4线SPI时序
OLED整体执行逻辑框图
对于GDDRAM,其Y轴每8个坐标为一组,进行分页。坐标范围为:PAGE0~PAGE7,总共分为8页。
如何写入数据:假如我们先设定页地址为PAGE0,列地址设定为8,那么就指定了起始坐标是上图中0x55所对应的位置;然后写入数据,每写完一个字节后,内部的地址指针会自动向右移一个单位;如果写完一页中最后一个字节,再继续写,默认会回到此页最开头。
当然也可以配置自动换页,换到下一页的开头,通过配置寻址模式(写命令)来实现。