IIC协议及Oled显示屏模块的使用

文章目录

IIC协议概述

IIC全称Inter-Integrated Circuit (集成电路总线)
是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双工同步通信方式

特点

  • 简单性和有效性。
    由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件

  • 多主控(multimastering)
    其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。

构成
IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,其时钟信号是由主控器件产生。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。对于并联在一条总线上的每个IC都有唯一的地址
在这里插入图片描述
IIC协议
IIC总线在传输数据的过程中一共有三种类型信号,分别为:开始信号、结束信号和应答信号
起始位,停止位,数据位,速度
这些信号中,起始信号是必需的,结束信号和应答信号

  • 起始信号
  • 终止信号

在这里插入图片描述

  • 应答信号
  • 发送器每发送一个字节(8个bit),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。
  • 应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节
  • 应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功

在这里插入图片描述
数据发送的时序
在这里插入图片描述

sbit scl = P0^1;
sbit sda = P0^3;
void IIC_Start()
{
sda = 1;
scl = 1;
_nop_();
sda = 0;
_nop_();
} 
void IIC_Stop()
{
sda = 0;
scl = 1;
_nop_();
sda = 1;
_nop_();
} 
char IIC_ACK()
{
char flag;
sda = 1;//就在时钟脉冲9期间释放数据线
_nop_();
scl = 1;
_nop_();
flag = sda;
_nop_();
scl = 0;
_nop_();
return flag;
} 
void IIC_Send_Byte(char dataSend)
{
int i;
for(i = 0;i<8;i++){
scl = 0;//scl拉低,让sda做好数据准备
sda = dataSend & 0x80;//1000 0000获得dataSend的最高位,给sda
_nop_();//发送数据建立时间
scl = 1;//scl拉高开始发送
_nop_();//数据发送时间
scl = 0;//发送完毕拉低
_nop_();//
dataSend = dataSend << 1;
}
}

OLED写命令
在这里插入图片描述
写命令/数据的代码

/
*
1. start()
2. 写入 b0111 1000 0x78
3. ACK
4. cotrol byte: (0)(0)000000 写入命令 (0)(1)000000写入数据
5. ACK
6. 写入指令/数据
7. ACK
8. STOP
*/
void Oled_Write_Cmd(char dataCmd)
{
// 1. start()
IIC_Start();
//
// 2. 写入从机地址 b0111 1000 0x78
IIC_Send_Byte(0x78);
// 3. ACK
IIC_ACK();
// 4. cotrol byte: (0)(0)000000 写入命令 (0)(1)000000写入数据
IIC_Send_Byte(0x00);
// 5. ACK
IIC_ACK();
//6. 写入指令/数据
IIC_Send_Byte(dataCmd);
//7. ACK
IIC_ACK();
//8. STOP
IIC_Stop();
} 
void Oled_Write_Data(char dataData)
{
// 1. start()
IIC_Start();
//
// 2. 写入从机地址 b0111 1000 0x78
IIC_Send_Byte(0x78);
// 3. ACK
IIC_ACK();
// 4. cotrol byte: (0)(0)000000 写入命令 (0)(1)000000写入数据
IIC_Send_Byte(0x00);
// 5. ACK
IIC_ACK();
///6. 写入指令/数据
IIC_Send_Byte(dataData);
//7. ACK
IIC_ACK();
//8. STOP
IIC_Stop();
}

OLED的寻址模式
如何显示一个点?
有三种,分别位页地址模式,水平地址模式和垂直地址模式,可以通过一下表格进行配置
内存管理
在这里插入图片描述
在这里插入图片描述
页地址模式
在这里插入图片描述
水平地址模式
在这里插入图片描述
垂直地址模式
在这里插入图片描述
在这里插入图片描述
如果写入0x08(b00001000)会显示什么呢
一个字节负责一个Page的一列显示
在这里插入图片描述

//显示“老婆我爱你”
#include "reg52.h"
#include "intrins.h"
sbit scl = P0^1;
sbit sda = P0^3;
void IIC_Start()
{
	scl = 0;
	sda = 1;
	scl = 1;
	_nop_();
	sda = 0;
	_nop_();
}
void IIC_Stop()
{
	scl = 0;
	sda = 0;
	scl = 1;
	_nop_();
	sda = 1;
	_nop_();
}
char IIC_ACK()
{
	char flag;
	sda = 1;//就在时钟脉冲9期间释放数据线
	_nop_();
	scl = 1;
	_nop_();
	flag = sda;
	_nop_();
	scl = 0;
	_nop_();
	return flag;
}
void IIC_Send_Byte(char dataSend)
{
	int i;
	for(i = 0;i<8;i++){
		scl = 0;//scl拉低,让sda做好数据准备
		sda = dataSend & 0x80;//1000 0000获得dataSend的最高位,给sda
		_nop_();//发送数据建立时间
		scl = 1;//scl拉高开始发送
		_nop_();//数据发送时间
		scl = 0;//发送完毕拉低
		_nop_();//
		dataSend = dataSend << 1;
	}
}
void Oled_Write_Cmd(char dataCmd)
{
	// 1. start()
	IIC_Start();
	//
	// 2. 写入从机地址 b0111 1000 0x78
	IIC_Send_Byte(0x78);
	// 3. ACK
	IIC_ACK();
	// 4. cotrol byte: (0)(0)000000 写入命令 (0)(1)000000写入数据
	IIC_Send_Byte(0x00);
	// 5. ACK
	IIC_ACK();
	//6. 写入指令/数据
	IIC_Send_Byte(dataCmd);
	//7. ACK
	IIC_ACK();
	//8. STOP
	IIC_Stop();
}
void Oled_Write_Data(char dataData)
{
	// 1. start()
	IIC_Start();
	//
	// 2. 写入从机地址 b0111 1000 0x78
	IIC_Send_Byte(0x78);
	// 3. ACK
	IIC_ACK();
	// 4. cotrol byte: (0)(0)000000 写入命令 (0)(1)000000写入数据
	IIC_Send_Byte(0x40);
	// 5. ACK
	IIC_ACK();
	///6. 写入指令/数据
	IIC_Send_Byte(dataData);
	//7. ACK
	IIC_ACK();
	//8. STOP
	IIC_Stop();
}
void Oled_Init(void){
	Oled_Write_Cmd(0xAE);//--display off
	Oled_Write_Cmd(0x00);//---set low column address
	Oled_Write_Cmd(0x10);//---set high column address
	Oled_Write_Cmd(0x40);//--set start line address
	Oled_Write_Cmd(0xB0);//--set page address
	Oled_Write_Cmd(0x81); // contract control
	Oled_Write_Cmd(0xFF);//--128
	Oled_Write_Cmd(0xA1);//set segment remap
	Oled_Write_Cmd(0xA6);//--normal / reverse
	Oled_Write_Cmd(0xA8);//--set multiplex ratio(1 to 64)
	Oled_Write_Cmd(0x3F);//--1/32 duty
	Oled_Write_Cmd(0xC8);//Com scan direction
	Oled_Write_Cmd(0xD3);//-set display offset
	Oled_Write_Cmd(0x00);//
	Oled_Write_Cmd(0xD5);//set osc division
	Oled_Write_Cmd(0x80);//
	Oled_Write_Cmd(0xD8);//set area color mode off
	Oled_Write_Cmd(0x05);//
	Oled_Write_Cmd(0xD9);//Set Pre-Charge Period
	Oled_Write_Cmd(0xF1);//
	Oled_Write_Cmd(0xDA);//set com pin configuartion
	Oled_Write_Cmd(0x12);//
	Oled_Write_Cmd(0xDB);//set Vcomh
	Oled_Write_Cmd(0x30);//
	Oled_Write_Cmd(0x8D);//set charge pump enable
	Oled_Write_Cmd(0x14);//
	Oled_Write_Cmd(0xAF);//--turn on oled panel
}
void Oled_Clear()
{
	unsigned char i,j; //-128 --- 127
	for(i=0;i<8;i++){
		Oled_Write_Cmd(0xB0 + i);//page0--page7
		//每个page从0列
		Oled_Write_Cmd(0x00);
		Oled_Write_Cmd(0x10);
		//0到127列,依次写入0,每写入数据,列地址自动偏移
		for(j = 0;j<128;j++){
			Oled_Write_Data(0);
		}
	}
}
/*--  文字:  老  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
code l1[]={0x20,0x20,0x24,0x24,0x24,0x24,0xBF,0x64,0x24,0x34,0x28,0x24,0x22,0x20,0x20,0x00};
code l2[]={0x10,0x08,0x04,0x02,0x3F,0x45,0x44,0x44,0x42,0x42,0x42,0x41,0x78,0x00,0x00,0x00};

/*--  文字:  婆  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
code p1[]={0x44,0x58,0xC1,0x26,0x10,0xC0,0x3E,0x12,0x32,0x52,0x9F,0x92,0x52,0x32,0x06,0x00};
code p2[]={0x04,0x84,0x85,0x94,0x5D,0x56,0x24,0x25,0x25,0x55,0x4C,0x44,0x85,0x05,0x05,0x00};

/*--  文字:  我  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
code w1[]={0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,0x20,0xFF,0x20,0x22,0x2C,0xA0,0x20,0x00};
code w2[]={0x00,0x08,0x48,0x84,0x7F,0x02,0x41,0x40,0x20,0x13,0x0C,0x14,0x22,0x41,0xF8,0x00};

/*--  文字:  爱  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
code a1[]={0x80,0x64,0x2C,0x34,0x24,0x24,0xEC,0x32,0x22,0x22,0x32,0x2E,0x23,0xA2,0x60,0x00};
code a2[]={0x00,0x41,0x21,0x91,0x89,0x87,0x4D,0x55,0x25,0x25,0x55,0x4D,0x81,0x80,0x80,0x00};

/*--  文字:  你  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
code n1[]={0x00,0x80,0x60,0xF8,0x07,0x40,0x20,0x18,0x0F,0x08,0xC8,0x08,0x08,0x28,0x18,0x00};
code n2[]={0x01,0x00,0x00,0xFF,0x00,0x10,0x0C,0x03,0x40,0x80,0x7F,0x00,0x01,0x06,0x18,0x00};

void main()
{
	int i;
	//1. OLED初始化
	Oled_Init();
	//2. 选择一个位置
	//2.1 确认页寻址模式
	Oled_Write_Cmd(0x20);
	Oled_Write_Cmd(0x02);
	Oled_Clear();
	//2.2 选择PAGE0 1011 0000
	// 0xB0
		
	Oled_Write_Cmd(0xB0);
	Oled_Write_Cmd(0x00);
	Oled_Write_Cmd(0x10);
	for(i=0;i<16;i++){
		Oled_Write_Data(l1[i]);
	}
	for(i=0;i<16;i++){
		Oled_Write_Data(p1[i]);
	}
	for(i=0;i<16;i++){
		Oled_Write_Data(w1[i]);
	}
	for(i=0;i<16;i++){
		Oled_Write_Data(a1[i]);
	}
	for(i=0;i<16;i++){
		Oled_Write_Data(n1[i]);
	}
	Oled_Write_Cmd(0xB1);
	Oled_Write_Cmd(0x00);
	Oled_Write_Cmd(0x10);
	for(i=0;i<16;i++){
		Oled_Write_Data(l2[i]);
	}
	for(i=0;i<16;i++){
		Oled_Write_Data(p2[i]);
	}
	for(i=0;i<16;i++){
		Oled_Write_Data(w2[i]);
	}
	for(i=0;i<16;i++){
		Oled_Write_Data(a2[i]);
	}
	for(i=0;i<16;i++){
		Oled_Write_Data(n2[i]);
	}
	
    while(1);
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 0.96寸I2C IIC通信128*64 OLED液晶屏模块的原理图是一张用电子元器件和连接线路等表示的图表,用于显示该液晶屏模块的电路连接和工作原理。 在原理图中,可以看到模块的主要组成部分。首先是液晶屏,它是整个模块的显示部分,具有128列和64行的像素点阵,通过I2C IIC通信方式与主控芯片连接。 主控芯片位于模块的核心位置,它负责控制液晶屏的工作,并与外部设备进行通信。主控芯片通过I2C IIC通信总线与其他硬件连接,如外部存储器、传感器等。在原理图中,可以看到主控芯片周围的连接电阻、电容、晶振等元件,这些元件在整个电路中起到支持、稳定等作用。 另外,模块中还包含了电源管理部分,用于提供电压和电流给液晶屏和主控芯片。这部分包括电源开关、稳压电路、滤波电容等。 此外,原理图还显示了模块的连接方式,如I2C IIC通信接口、电源接口、外设连接接口等。这些接口可以连接到外部设备,如单片机、传感器等,实现与其他电子设备的互联。 总体来说,0.96寸I2C IIC通信128*64 OLED液晶屏模块原理图展示了该模块的电路连接和工作原理,帮助开发人员理解模块的组成和功能,为进一步的开发和应用提供参考。 ### 回答2: 0.96寸i2c iic通信128*64 OLED液晶屏模块原理图,通常包含以下主要组成部分:控制芯片、显示面板、I2C接口以及电源电路。 首先,液晶屏模块通常集成了一个控制芯片,这个芯片负责处理从主控制器接收到的显示数据,并将其转化为适合显示的信号。控制芯片通常是通过I2C或IIC通信接口与主控制器进行连接。通过这个接口,主控制器可以向液晶屏发送指令和数据,控制显示内容和格式。 其次,液晶屏模块中的显示面板是显示信息的最重要组成部分。这个面板通常由128行和64列的液晶像素点阵组成,每个像素点可以显示不同的颜色和亮度。显示面板是被控制芯片驱动的,根据控制芯片的指令和数据,液晶屏会相应地点亮或熄灭每一个像素点,从而实现显示功能。 此外,I2C接口是液晶屏模块与主控制器之间的通信接口。I2C接口是一种串行通信协议,用于在不同设备之间传送数据。通过I2C接口,主控制器可以向液晶屏模块发送指令、数据和其他控制信号,从而控制液晶屏的显示内容和操作。 最后,液晶屏模块还包含一个电源电路,用于提供液晶屏驱动所需的电源。这个电路通常由电源管理芯片、电容、电阻等组成,确保液晶屏能够正常运行并保持稳定的工作电压和电流。 综上所述,0.96寸i2c iic通信128*64 OLED液晶屏模块原理图主要包含控制芯片、显示面板、I2C接口以及电源电路等组成部分,通过这些部件的协同工作,液晶屏模块能够接收主控制器发送的指令和数据,并在显示面板上显示相应的内容。 ### 回答3: 0.96寸I2C IIC通信128*64 OLED液晶屏模块的原理图是用来描述该模块内部电路连接关系和工作原理的图纸。液晶屏模块主要由屏幕控制芯片、驱动芯片和显示屏组成。 在原理图中,屏幕控制芯片是连接OLED显示屏的主要接口,通过I2C或IIC通信协议与外部主控芯片进行通信。该芯片负责接收来自主控芯片的命令和数据,并将其转化为对显示屏的控制信号和图像信号。 驱动芯片是连接显示屏的关键组件,负责将屏幕控制芯片发出的信号转化为驱动显示屏所需的电流和电压信号。驱动芯片还可以控制液晶屏模块的亮度、对比度、颜色等参数,以及完成像素点的颜色变化。 显示屏是液晶屏模块的重要设备,由128行和64列的像素点构成,每个像素点可以显示不同的颜色和亮度。在原理图中,显示屏的每个像素点与驱动芯片通过细丝连接,通过控制电路可以控制每个像素点的亮灭和颜色。 除了以上核心组件,原理图中还可能包含其他辅助电路,例如电源电路、电容电路、电阻电路等。这些辅助电路可以提供所需的电压和电流,确保液晶屏模块正常工作。 总之,0.96寸I2C IIC通信128*64 OLED液晶屏模块的原理图是解释了该模块内部各个电路之间的连接关系和工作原理,为开发人员提供了设计和调试参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值