STM32-OLED屏幕显示教程

1.OLED屏幕介绍(点击黄色字体领相关资料)

OLED即有机发光管(Organic Light-Emitting Diode,OLED)。OLED显示技术具有自发光、广视角、几乎无穷高的对比度、较低功耗、极高反应速度、可用于绕曲性面板、使用温度范围广、构造及制程简单等有点,被认为是下一代的平面显示屏新兴应用技术。

OLED显示和传统的LCD显示不同,其可以自发光,所以不需要背光灯,这使得OLED显示屏相对于LCD显示屏尺寸更薄,同时显示效果更优。 常用的OLED屏幕有蓝色、黄色、白色等几种。屏的大小为0.96寸,像素点为 128*64,所以我们称为0.96oled屏或者12864屏。

OLED屏幕特点

1.模块尺寸:23.7 *23.8mm

2.电源电压:3.3-5.5V

3.驱动芯片:SSD1306

4.测试平台:提供 k60/k10,9s12XS128,51,stm32,stm8等单片机

OLED屏幕接线说明

OLED屏幕显存

OLED本身是没有显存的,他的现存是依赖SSD1306提供的,而SSD1306提供一块显存。

SSD1306显存总共为128*64bit大小,SSD1306将这些显存分成了8页。每页包含了128个字节。

OLED屏幕原理

STM32内部建立一个缓存(共128*8个字节),每次修改的时候,只是修改STM32上的缓存(实际上就是SRAM),修改完后一次性把STM32上的缓存数据写入到OLED的GRAM。这个方法也有坏处,对于SRAM很小的单片机(51系列)就比较麻烦。

OLED屏幕常用指令

· 命令0X81: 设置对比度。包含两个字节,第一个0X81为命令,随后方法是的一个字节要设置这个对比度,值越大屏幕越亮。

·命令0XAE/0XAF: 0XAE为关闭显示命令,0XAF为开启显示命令

·0X8D: 包含两个字节,第一个为命令字,第二个为设置值,第二个字节的BIT2表示电荷泵的开关状态,该位为1开启电荷泵,为0则关闭。模块初始化的时候,这个必须要开启,否则看不到屏幕显示。

·命令0XB0~B7:用于设置页地址,其低三位的值对应GRAM页地址。

·命令0X00~0X0F:用于设置显示时的起始列地址低四位。

·命令0X10~0X1F: 用于设置显示时的起始列地址高四位。

2.OLED屏幕显示一个点的思路

OLED屏幕分为页寻址模式,水平地址模式,垂直地址模式。

这里主要介绍用的最多的页寻址模式,页寻址模式如下图,把整个OLED屏幕分成了八页,说白了就是把OLED的屏幕把宽平均分成了八份。比如想要在第0列第三行的开头显示一个点那就是按位来配置,0000 0100(0x08)。

3.配置OLED屏幕

我们配置硬件IIC的步骤就是根据下面这张时序图,发送一次数据后不断获取不同的应答即可。

硬件IIC配置

#include "stm32f10x.h" #include "oled.h" void IIC_Configuration(void) {
	 GPIO_InitTypeDef  GPIO_InitStructure;
	 I2C_InitTypeDef   I2C_InitStructure;
	
	 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE	);
     RCC_APB1PeriphClockCmd( RCC_APB1Periph_I2C1, ENABLE	); //PB6--SCL   PB7--SDL GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
	 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
	 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	 GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	 I2C_DeInit(I2C1);
	 I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
	 I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
	 I2C_InitStructure.I2C_ClockSpeed = 400000;
	 I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
	 I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
	 I2C_InitStructure.I2C_OwnAddress1 = 0x30;
     I2C_Init(I2C1, &I2C_InitStructure);
	 I2C_Cmd(I2C1, ENABLE);
 
} void I2C_WriteByte(uint8_t addr,uint8_t data) { while( I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); //检查IIC总线是否繁忙 I2C_GenerateSTART(I2C1, ENABLE); //开启IIC,发送起始信号 while(!I2C_CheckEvent(I2C1,  I2C_EVENT_MASTER_MODE_SELECT)); //EV5主模式 I2C_Send7bitAddress(I2C1, OLED_ADDRESS ,  I2C_Direction_Transmitter); //发送OLED地址 while(!I2C_CheckEvent(I2C1,  I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //检查EV6 I2C_SendData(I2C1, addr); //发送寄存器地址 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING));
	
    I2C_SendData(I2C1, data); //发送数据 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING));
 
    I2C_GenerateSTOP(I2C1, ENABLE);
 
 
}


完整代码可进群免费领取!!!

嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。点击下方链接,0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦!

点击这里找小助理0元领取

the end

评论(0)