0.91寸 SSD1306 OLED介绍(一) --- 整体介绍/IIC时序介绍

在介绍0.91寸 SSD1306之前先附上模块链接:点击购买SSD1306 OLED显示模块

1. SSD1306 OLED介绍

OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、使用温度范围广等优异之特性,被认为是下一代的平面显示器新兴应用技术。
OLED显示技术具有自发光的特性,采用非常薄的有机材料涂层和玻璃基板,当有电流通过时,这些有机材料就会发光,而且OLED显示屏幕可视角度大,并且能够节省电能, LCD都需要背光,而OLED不需要,因为它是自发光的。这样同样的显示,OLED效果要来得好一些。以目前的技术,OLED的尺寸还难以大型化,但是分辨率确可以做到很高。
OLED在手机子屏,MP3,计算器以及穿戴产品中广泛应用。
SSD1306像素为12864像素,一共分为8个页,如图
在这里插入图片描述
你可以不用管他的名词COM&SEG,你可以这样理解,宽是128bit高是64bit,分为8个页,所以一页的宽度是128bit宽,8bit高,所以理论上16
8的字体是占2个页,以及8列,所以理论上168的字体,最多能显示4行,16列, 86的字体最多显示8行,21列。

2. SSD1306 OLED显示模块介绍

如图,我们的模块是IIC接口,引脚分别为VCC,GND,SCL,SDA,
在这里插入图片描述

3. IIC时序介绍

由于网络上一直散播着stm32f103的硬件IIC有问题,所以此部分我们直接采用软件模拟更为保险,通过图3.4可以看出我们OLED SCL接在PB6,SDA接在PB7,之所以接在这两个脚是有讲究的,直接接在了硬件IIC的PIN上,对于想试硬件IIC的同学可以自己尝试下
在这里插入图片描述

3.1 GPIO初始化

SSD1306 OLED的SCL,SDA GPIO对应的初始化代码如下:

	GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(SSD1306_PERIPH_CLK, ENABLE);
    GPIO_InitStructure.GPIO_Pin = SSD1306_SCL_PIN|SSD1306_SDA_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(SSD1306_SCL_GPIO, &GPIO_InitStructure);
    GPIO_SetBits(SSD1306_SCL_GPIO,SSD1306_SCL_PIN|SSD1306_SDA_PIN);

对于软件模拟IIC,GPIO的初始化相对于简单,就是使能下GPIO的外设时钟,然后把SCL,SDA设置为推挽输出即可,我把外设时钟以及对于的GPIO PIN设置为宏定义,对于改变PIN脚来说只是简单的修改下宏定义就可以,不需要修改对应的代码,宏定义代码如下:

#define SSD1306_PERIPH_CLK RCC_APB2Periph_GPIOB
#define SSD1306_SCL_GPIO GPIOB
#define SSD1306_SDA_GPIO GPIOB
#define SSD1306_SCL_PIN GPIO_Pin_6
#define SSD1306_SDA_PIN GPIO_Pin_7

3.2 IIC start/stop时序

可以看到SSD1306数据手册start/stop的时序如图所示
在这里插入图片描述

3.2.1 start时序介绍

如上图我们可以看到start的条件就是 SCL拉高,然后SDA由高变低,所以对应的软件代码如下:

/******************************************************************************
 * 函数名:	protocol_iic_start
 * 参数:  	NULL
 * 返回值: 	NULL
 * 描述:		software模拟IIC起始信号,信号时序是
 				SCL高电平,SDA从高到低跳变
******************************************************************************/
static void protocol_iic_start()
{
    IIC_SCLK_HIGH;
    IIC_SDIN_HIGH;
    IIC_SDIN_LOW;
}

其中IIC_SCLK_LOW/ IIC_SCLK_HIGH/ IIC_SDIN_LOW/ IIC_SDIN_HIGH的定义如下:

#define IIC_SCLK_LOW GPIO_ResetBits(SSD1306_SCL_GPIO,SSD1306_SCL_PIN)
#define IIC_SCLK_HIGH GPIO_SetBits(SSD1306_SCL_GPIO,SSD1306_SCL_PIN)
#define IIC_SDIN_LOW GPIO_ResetBits(SSD1306_SDA_GPIO,SSD1306_SDA_PIN)
#define IIC_SDIN_HIGH GPIO_SetBits(SSD1306_SDA_GPIO,SSD1306_SDA_PIN)

说白了就是普通的GPIO的拉高/拉低的动作来模拟IIC的硬件时序
3.2.2 stop时序
如上图我们可以看到stop的时序是SCL高电平,SDA由低变高,代码如下:

/******************************************************************************
 *	函数名:	protocol_iic_stop
 * 参数:  	NULL
 * 返回值: 	NULL
 * 描述:		software模拟IIC停止信号,信号时序是
 				SCL高电平,SDA从低到高跳变
******************************************************************************/
static void protocol_iic_stop()
{
    IIC_SCLK_HIGH;
    IIC_SDIN_LOW;
    IIC_SDIN_HIGH;

}

3.3 IIC数据传输时序

SSD1306数据手册中数据传输的时序如图所示:
在这里插入图片描述
可以看出写一个bit的时候,SCL开始为低电平,然后SDA如果这个bit是0b1就是高电平,如果这个bit是0b0,那么就是低电平,SDA电平保持,此时SCL变为高电平,然后发送给salve,然后SCL由高变低,此bit发送完成,开始下一个bit的发送,以此循环,直到发送完毕,代码如下:


/******************************************************************************
 *	函数名:	protocol_iic_write_byte
 * 参数:  	byte(IN)		-->要写的数据
 * 返回值: 	NULL
 * 描述:		软件模拟IIC写byte
******************************************************************************/
static void protocol_iic_write_byte(uint8_t byte)
{
    uint8_t i;
    uint8_t m,da;
    da=byte;
    IIC_SCLK_LOW;
    for(i=0; i<8; i++)
    {
        m=da;
        m=m&HIGH_BIT_MASK;
        if(m==HIGH_BIT_MASK)
        {
            IIC_SDIN_HIGH;
        }
        else IIC_SDIN_LOW;
        da=da<<1;
        IIC_SCLK_HIGH;
        IIC_SCLK_LOW;
    }

}

3.4 IIC总时序

总时序内容相对于多一点, 在介绍总时序图之前我们先来介绍一些基本的概念
1)salve address:此地址就是SSD1306 OLED在IIC的地址,定义如图
在这里插入图片描述
R/W就是标示是写还是读,1对应的是read,0对应的是write,由于我们此部分是作为IIC master往OLED写数据,所以这个我们一直用做write,read基本不用,所以
可以确定slave的地址为0b01111000,转换为16进制就是0x78
2)control byte,各个bit定义如图所示
在这里插入图片描述
Co – Continuation bit If the Co bit is set as logic “0”, the transmission of the following information will contain data bytes only.此部分我们一直设置为0
D/C- determines the next data byte is acted as a command or a data. If the D/C# bit is set to logic “0”, it defines the following data byte as a command. If the D/C# bit is set to logic “1”,如果是command,那么我们设置为0,如果是普通的data,那么我们设置为1
回归正题,介绍总时序,如图
在这里插入图片描述
现在我们就能无压力看懂这个了,发送一个byte的顺序为
Start时序—> slave address ack control byte ack 需要发送的数据 ack stop
并且用逻辑分析仪录制了一下,时序跟我们一样,如图所示
在这里插入图片描述
在这里插入图片描述
所以对应代码如下所示,我一直秉持的宗旨是:
Talk is cheap.Show me your code.所以有的时候我觉得理论讲的太多,不如直接贴上关键代码更通俗易懂
1)写command的代码

/******************************************************************************
 * 函数名:	protocol_iic_write_cmd
 * 参数:  	command(IN)		-->要写的command
 * 返回值: 	NULL
 * 描述:	软件模拟IIC写命令
******************************************************************************/
static void protocol_iic_write_cmd(uint8_t command)
{
    protocol_iic_start();
    protocol_iic_write_byte(SSD1306_SLAVE_ADDR | SSD1306_IIC_WRITE);
    protocol_iic_wait_ack();
    protocol_iic_write_byte(SSD1306_IIC_CMD_MASK);
    protocol_iic_wait_ack();
    protocol_iic_write_byte(command);
    protocol_iic_wait_ack();
    protocol_iic_stop();
}

2)写data的代码

/******************************************************************************
 * 函数名:	protocol_iic_write_data
 * 参数:  	data(IN)		-->要写的data
 * 返回值: 	NULL
 * 描述:	软件模拟IIC写数据
******************************************************************************/
static void protocol_iic_write_data(uint8_t data)
{
    protocol_iic_start();
    protocol_iic_write_byte(SSD1306_SLAVE_ADDR | SSD1306_IIC_WRITE);
    protocol_iic_wait_ack();
    protocol_iic_write_byte(SSD1306_IIC_DAT_MASK);
    protocol_iic_wait_ack();
    protocol_iic_write_byte(data);
    protocol_iic_wait_ack();
    protocol_iic_stop();
}

3)其中的宏定义

#define HIGH_BIT_MASK 0x80
#define SSD1306_IIC_CMD_MASK (0<<6)
#define SSD1306_IIC_DAT_MASK (1<<6)
#define SSD1306_SLAVE_ADDR 0x78
#define SSD1306_IIC_READ 0x1
#define SSD1306_IIC_WRITE 0x0

OK,OLED介绍,以及IIC时序介绍到此为止。

SSD1306是一种OLED显示模块,它可以用于在电子设备上显示图像和文本。0.91是指该模块的显示屏0.91。 在使用SSD1306模块之前,你需要了解一些宏定义。这些宏定义用于设置通信协议和设备地址。下面是一些常用的宏定义: - `HIGH_BIT_MASK`:用于设置数据传输的高位掩码。 - `SSD1306_IIC_CMD_MASK`:用于设置IIC通信的命令掩码。 - `SSD1306_IIC_DAT_MASK`:用于设置IIC通信的数据掩码。 - `SSD1306_SLAVE_ADDR`:用于设置SSD1306模块的设备地址。 - `SSD1306_IIC_READ`:用于设置IIC通信的读取命令。 - `SSD1306_IIC_WRITE`:用于设置IIC通信的写入命令。 请注意,以上只是一些常用的宏定义,实际使用时可能还有其他宏定义。 如果你想使用SSD1306模块来显示图像或文本,你需要使用相应的库或驱动程序来控制模块。这些库或驱动程序可以提供简单的接口来控制SSD1306模块,并在屏幕上显示所需的内容。 以下是一个使用SSD1306模块显示文本的示例代码: ```python import Adafruit_SSD1306 # 创建SSD1306对象,指定屏幕尺和设备地址 disp = Adafruit_SSD1306.SSD1306_128_32(rst=None, i2c_address=SSD1306_SLAVE_ADDR) # 初始化SSD1306模块 disp.begin() # 清空屏幕 disp.clear() disp.display() # 设置文本显示位置和字体大小 disp.set_font_size(12) disp.set_cursor(0, 0) # 在屏幕上显示文本 disp.print("Hello, World!") disp.display() ``` 这段代码使用了Adafruit_SSD1306库来控制SSD1306模块。首先,我们创建了一个SSD1306对象,并指定了屏幕尺和设备地址。然后,我们初始化模块并清空屏幕。接下来,我们设置文本显示位置和字体大小,并在屏幕上显示了一段文本。 请注意,以上代码只是一个示例,实际使用时可能需要根据具体情况进行修改。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wireless_Link

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值