大家好,欢迎来到IT知识分享网。
在介绍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高,所以理论上168的字体是占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的地址为0b0,转换为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时序介绍到此为止。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/149103.html