OLED液晶显示器模块(SSD1306驱动)I2C接口驱动程序编写

环境

软件环境

keil uVision V5.24.2.86
下载地址

硬件环境

STC89C52RC最小系统板
OLED液晶显示器模块(SSD1306驱动)I2C接口

OLED液晶显示器模块(SSD1306驱动)I2C接口驱动程序编写_第1张图片

程序编写

IIC通信时序

概述

IIC是inter integrated circuit的缩写,是一种两线接口。
IIC只需要两个线,一条Serial Data Line(SDA),一条Serial Clock(SCL)。
SCL:上升沿将数据输入到从机中,下降沿驱动从机将数据输出给主机。(边沿触发)
SDA:双向数据线,为OD门,与其他任意数量的OD门构成“与”关系。

空闲状态

IIC总线的SDA和SCL两条信号线同事处于高电平时,规定为总线的空闲状态。此时各个期间的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。

起始信号与停止信号的定义

  • 起始信号:当SCL为高期间,SDA由高到低的跳变
//起始信号
void I2C_Start(void)
{
	OLED_SDA_Set();//SDA置位
	OLED_SCL_Set();/SCL置位
	IIC_delay();//延时
	OLED_SDA_Clr();//SDA清零
	IIC_delay();//延时
	OLED_SCL_Clr();//SCL清零
	 
}
  • 停止信号:当SCL为高期间,SDA由低到高的跳变
//结束信号
void I2C_Stop(void)
{
	OLED_SDA_Clr();//SDA清零
	OLED_SCL_Set();//SCL置位
	IIC_delay();//延时
	OLED_SDA_Set();//SDA置位
}

接收成功信号

  • 接收信号
    发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。我们的单片机在发送完一个字节数据之后需要等待从机-OLED液晶屏中的SSD1306驱动芯片将SDA拉低。
//等待信号响应
void I2C_WaitAck(void) //测数据信号的电平
{
	OLED_SDA_Set();//SDA置位
	IIC_delay();//延时
	OLED_SCL_Set();//SCL置位
	IIC_delay();//延时
	OLED_SCL_Clr();//SCL清零
	IIC_delay();//延时
}
  • 数据的有效性
  • IIC总线进行数据传送时,时钟信号为高电平期间,数据线的电平必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的电平状态才允许变化。
    因为:数据是在SCL的上升沿到来时存入到接收器中。
    OLED液晶显示器模块(SSD1306驱动)I2C接口驱动程序编写_第2张图片
  • 数据的传送
    在IIC总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。数据位的传输是边沿触发。
//写入一个字节
void Send_Byte(u8 dat)
{
	u8 i;
	for(i=0;i<8;i++)//输入8位,1个字节数据
	{
		OLED_SCL_Clr();//SCL清零
		if(dat&0x80)//将dat的8位从最高位依次写入
		{
			OLED_SDA_Set();//发送1
    }
		else
		{
			OLED_SDA_Clr();//发送0
    }
		IIC_delay();//延时
		OLED_SCL_Set();//SCL置位
		IIC_delay();//延时
		OLED_SCL_Clr();//SCL清零
		dat<<=1;//要发送数据右移位
  }
}

工作过程

总线上的所有通信都是由主控器引发的。在一次通信中,主控器与被控器总是在扮演着两个不同的角色。

  • 主控器向被控器发送数据
    主控器发送起始位,这会通知总线上的所有设备传输开始了,接下来主控器发送设备地址,与这一地址匹配的被控器将继续这一传输过程,其他被控器将会忽略接下来的传输并等待下一次传输的开始。主控器寻址到从设备后,发送它所要读取或写入的被控设备的内部寄存器地址;之后,发送数据。数据发送完毕后,发送停止位;
    写入过程如下
  • 发送起始位
  • 发送被控设备的地址和读/写选择位;释放总线,等待被控设备拉低SDA数据总线进行应答;如果被控设备接收成功;若没有握手成功或发送的数据错误时被控设备没有产生应答,此时要求重新发送或终止。
  • 发送想要写入的内部寄存器地址;被控设备对其应答;
  • 主控设备发送数据;被控设备对其应答;
  • 主控设备发送停止位
  • 被控设备收到停止信号后,将进入一个内部的写入周期,大概需要10ms,此期间任何操作都不会被被控设备响应;( 因此以这种方式的两次写入之间需要插入一个延时,否则会导致失败)
  • 主控器读取数据的过程:
    读的过程比较复杂,在从slave读取数据前,你必须先要告诉它哪个内部寄存器是你想要读取的,因此必须先对其进行写入:
    • 发送起始位
    • 发送slave地址+

你可能感兴趣的:(单片机,OLED,SSD1306)