本文主要参考:
1.【基础知识】【模块介绍】0.96寸OLED显示屏(SSD1306)基础命令和寻址方法
2.详细解析OLED及相关代码,基于SH1107的1.3寸OLED屏
OLED的点亮原理(映射的关系)
OLED的构造
OLED屏幕就是一个个小的有机自发光二极管组成的阵列。OLED由128*64个像素组成,即64行,每行有128个发光二极管。
以此为基础建立一个坐标系如下:
OLED的驱动芯片:
OLED的核心驱动芯片是SSD1306,单片机与SSD1306通信,SSD1306再驱动OLED点亮对应的OLED像素点。SSD1306内部有一个GDDRAM数据内存,它有128*8字节,即128*64bit(对应OLED128*64个像素),每一个位对应一个像素点。
将同一列的8个点阵编成一组,用一个8bit数表示。这样屏幕就被分割为了64/8=8块(每块为8行128列)。将GDDRAM的128*8字节分别存储在Page0~Page7中。
这样的8行128个数被称为1页,每一个页存储128*1个字节。
每一个bit存储在一个方格中,每一个方格代表着一个像素点,这样GDDRAM就和像素对应起来了,0和1代表灭和亮,越靠近上方的是低位。
SSD1306是如何寻址的?
寻址模式
寻址模式有三种,水平寻址模式,垂直寻址模式,页寻址模式
最常用的是页寻址模式,水平寻址方式和垂直寻址方式在写入整个屏幕时方便,水平寻址模式和页寻址模式的取模方法相同。
设置方法
- 进入命令设置模式
- 进入寻址设置模式
- 选择寻址模式
先设置内存的寻址模式,接着发送寻址模式
SendByte(0x00); //命令设置
SendByte(0x20); //寻址设置 内存寻址
SendByte(0x02); //页寻址 [1:0],00:垂直地址模式,01:水平地址模式,10:页地址模式
页寻址模式
寻址特点
页地址模式是指从设定的页和列开始写入数据后,列地址的指针会自动加1。如果列地址指针到达终止地址(0x7F)后,列地址指针将会返回到起始地址(0x00),但是页地址指针不会改变,如果需要访问下一页的内容,我们需要手动设置下一页的页地址和列地址。如果超出范围则超出部分无效,可以不用事先指定每页中每列的长度。所以此模式下是OLED是一页一页刷新显示的。
注意:进入下一页时需要重新设置地址。
设置流程
- 进入命令发送模式
- 设置寻址模式
- 设置页地址
- 设置列地址起始位
通常在页地址模式下访问GDDRAM, 需要如下步骤来定义起始RAM访问指针指向:
通过命令(B0h-B7h)设置目标显示位置页起始地址
通过命令(00h-0Fh)设置列起始地址低位
通过命令(10h-1Fh)设置列起始地址高位
地址设置
页地址
OLED_WR_Byte (0xb0,0)的0xb0是设置页的地址,格式是根据设置页地址命令(Set Page Address)进行编写,该命令格式高四位的1011是固定的,而低四位是根据8个页(00H-07H)进行改变,命令如下:
因此第一页为0b1011 0000即0xb0。
列地址
列地址范围是00H-7FH(128),但是在发送命令的时候需要将列地址的高四位和低四位分开进行发送。设置列地址高四位的前4位固定是0b0001,低四位的前4位固定是0b0000,如图:
OLED_WR_Byte (0x00,0)的0x00是设置列的低地址,格式是根据设置列低地址(Set Column Address 4 Lower Bits)进行编写,该命令格式高四位的0000是固定的,而低四位则需要将程序指定列的列地址0x00(0000 0000的低四位0000写入该命令的低四位,和命令格式固定高四位0000拼接起来就是0x00。取值范围:0000-1111。
OLED_WR_Byte (0x10,0)的0x10是设置列的高地址,格式是根据设置列高地址(Set Column Address 4 Higher Bits)进行编写,该命令格式高四位的0001是固定的,而低四位则需要将程序指定的第16列的列地址0x0f(0000 0000)的高四位0000写入该命令的低四位,和命令格式固定高四位0001拼接起来就是0x10,取值范围:0000-0111。
由前面我们知道有128列,对应二进制就是0111 1111即0x7F,列地址是00H-7FH的,所以高位最大值0111,即为7。低地址最大值1111,即为F。
例如页地址是B2H,列地址的低地址是03H,列地址的高地址是10H,GDDRAM的访问指针如下:
给GDDRAM写数据的时候,其列地址会自动加1,列地址到SEG127之后会复位到SEG0,但是行地址不会自动增加,为了写下一页的数据,必须重新设置页地址和列地址。
代码实现:
/** 屏幕默认显示 初始化中调用
* @brief
* @param 显示数据 此时0x00即黑屏
* @returnl 无
*/
void OLED_FillPicture(uint8_t fill_Data)
{
uint8_t m, n;
for(m = 0;m < 8;m++)
{
OLED_WR_Byte(0xb0 + m, 0); // 设置页地址
OLED_WR_Byte(0x00, 0);// 设置显示位置一列的低地址
OLED_WR_Byte(0x10, 0);// 设置显示位置一列的高地址
for(n = 0;n < 128;n++)
{
OLED_WR_Byte(fill_Data, 1);
}
}
}
水平地址模式:
水平地址模式下,GDDRAM访问,列地址自动加1,到达列地址终止地址时,复位到列地址起始地址,且页地址也自动加1
水平地址的访问图解如下,在页地址和列地址都达到终止地址的时候,都将复位到起始地址

垂直地址模式:
垂直地址模式下,GDDRAM访问,页地址自动加1,到达页地址终止地址时,复位到页地址起始地址,且列地址也自动加1
垂直地址的访问图解如下,在页地址和列地址都达到终止地址的时候,都将复位到起始地址
通常在(垂直/水平)地址模式下访问GDDRAM, 需要如下步骤来定义起始RAM访问指针指向:
通过命令(21h)设置目标显示位置列起始地址以及列终止地址
通过命令(22h)设置目标显示位置页起始地址以及页终止地址
SSD1306提供的通信方式是多种的,IIC,4线SPI,3线SPI,还有6800并行,8080并行方式
关于SSD1306的指令详解