STM32外设系列—OLED
🎀 文章作者:二土电子
🌸 关注文末公众号获取其他资料和工程文件!
🐸 期待大家一起学习交流!
文章目录
- 一、OLED简介
- 二、数据手册分析
- 2.1 供电电压
- 2.2 引脚定义
- 2.3 原理图介绍
- 2.4 数据手册程序
- 三、IIC通信
- 3.1 什么是IIC
- 3.2 IIC通信协议
- 3.3 IIC主从通信过程
- 3.3.1 写入数据
- 3.3.2 读取数据
- 四、OLED程序设计
- 4.1 OLED初始化
- 4.2 OLED控制函数编写
- 4.2.1 OLED显示开/关程序
- 4.2.2 OLED显示一组汉字程序
- 4.2.3 OLED显示一串字符串
- 4.2.3 OLED显示图片
- 五、OLED画点/画线
一、OLED简介
OLED是开发时常用的显示器件,这里介绍的是0.96寸的四针脚OLED,IIC控制。
二、数据手册分析
2.1 供电电压
供电电压在3V~5V,用3.3V即可。
2.2 引脚定义
2.3 原理图介绍
I2C通信接口由从地址位DC、I2C总线数据信号SDA(输出SDAOUT/D2输出,SDAIN/D1输入)和I2C总线时钟信号SCL(D0)组成。数据信号和时钟信号都必须连接到上拉电阻器上。
从属地址位(SA0)必须在通过I2C总线传输或接收任何信息之前,先识别该从属地址。设备将响应从地址,后面是从地址位(“SA0”位)和读/写选择位(“R/W#”,具有以下字节格式的位)
“SA0”位为从属地址提供了一个扩展位。可以选择“0111100”或“0111101”作为OLED的从属地址。D/C# pin作为SA0进行从属地址的选择”。“收发#”位用于确定I2c总线接口的操作模式。R/W#=1,它处于读取模式。R/W#=0,它处于写模式。
从属地址 DC 说明 0111 100(0x78) DC = 0 默认值 0111 1010(0x7A) DC = 1 用户需要切换电阻位置来修改IIC地址 2.4 数据手册程序
数据手册中会给出一些底层程序,可以通过这写程序快速的了解到如何使用。后面的程序设计中会详细介绍这部分,这里就不再做介绍了。
三、IIC通信
3.1 什么是IIC
IIC(Inter-Integrated Circuit)其实是IICBus简称,中文是集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。IIC支持一主多从,主机通过寻址的方式呼叫从机,然后进行数据传输。
I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有从设备的SDA和SLK都接到总线上。
3.2 IIC通信协议
IIC协议中有两种帧,一种是地址帧,用来寻找从设备。一种是数据帧,用来作主从机之间的数据交互。IIC协议还规定了起始信号,终止信号和应答信号。
- 空闲状态
I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。
- 起始信号
SCL为高电平期间,SDA信号线由高电平向低电平的变化表示起始信号
- 终止信号
SCL为高电平期间,SDA由低电平向高电平的变化表示终止信号
起始信号和终止信号都是由主机发送的,起始信号产生之后,总线处于被占用的状态,在终止信号产生之后,总线就处于空闲状态。
当从机接收完一帧时,会发送一个应答信号。应答信号为低电平时,规定为有效应答(ACK,简称应答位),表示接收器已经成功地接受了该字节应答位为高电平时,规定为非应答信号(NACK),一般表示接收器接收该字节没有成功。
IIC通信协议有自己的数据格式,每一个字节必须保证是8bit长度。数据传送时,先传送最高位,每一个被传送的字节后面都必须跟随1bit的应答位(即每一帧数据一共有9bit)。
3.3 IIC主从通信过程
3.3.1 写入数据
主设备往从设备写入数据需要有下面的过程
- 主设备发送一个起始信号(START)
- 主设备在数据线上广播从设备地址
- 确定数据传输方向(R/W)
- 等待从设备应答信号(ACK)
- 主设备发送数据到从设备,从设备接收到后,会返回给主设备一个应答信号,直到主设备发送完数据,或者从设备返回一个NACK信号,表示从设备不再接收数据
- 数据发送完毕,主设备发送终止信号(STOP)
3.3.2 读取数据
- 主设备发送起始信号(START)
- 主设备在数据线上广播从设备地址
- 确定数据传输方向(R/W)
- 等待从设备应答信号(ACK)
- 从机向主机发送需要读取的数据
- 主设备每接收到一个字节数据,后面就会跟着向从设备发送一个应答信号
- 接收完最后一个数据后,主机会发送一个无效应答信号(NACK)
- 主设备发送终止信号,数据读取完毕
四、OLED程序设计
4.1 OLED初始化
OLED初始化包括两部分,一部分是初始化STM32的GPIO,另一部分是根据数据手册提供的程序初始化OLED。STM32F103ZET6提供了两个IIC接口
SCL SDA IIC1 PB6 PB7 IIC2 PB10 PB11 实际使用软件模拟IIC时,使用任意的GPIO即可,不必要使用上面规定的IIC引脚。这里只是使用了IIC1的引脚而已。
首先是数据手册提供的IIC相关函数
/* *============================================================================== *函数名称:IIC_delay *函数功能:IIC延时 *输入参数:无 *返回值:无 *备 注:数据手册提供 *============================================================================== */ void IIC_delay (void) { u8 t = 1; while (t--); } /* *============================================================================== *函数名称:I2C_Start *函数功能:IIC起始信号 *输入参数:无 *返回值:无 *备 注:数据手册提供 *============================================================================== */ void I2C_Start (void) { OLED_SDA_Set(); OLED_SCL_Set(); IIC_delay(); OLED_SDA_Clr(); IIC_delay(); OLED_SCL_Clr(); IIC_delay(); } /* *============================================================================== *函数名称:I2C_Stop *函数功能:IIC终止信号 *输入参数:无 *返回值:无 *备 注:数据手册提供 *============================================================================== */ void I2C_Stop (void) { OLED_SDA_Clr(); OLED_SCL_Set(); IIC_delay(); OLED_SDA_Set(); } /* *============================================================================== *函数名称:I2C_WaitAck *函数功能:IIC等待应答 *输入参数:无 *返回值:无 *备 注:数据手册提供 *============================================================================== */ void I2C_WaitAck (void) { OLED_SDA_Set(); IIC_delay(); OLED_SCL_Set(); IIC_delay(); OLED_SCL_Clr(); IIC_delay(); } /* *============================================================================== *函数名称:Send_Byte *函数功能:写入一个字节 *输入参数:dat:需要写入的数据 *返回值:无 *备 注:数据手册提供 *============================================================================== */ void Send_Byte (u8 dat) { u8 i; for (i = 0;i
- 空闲状态