单片机C51--笔记8-STC89C51RC/RD-IIC协议

news2024/12/30 2:47:27

一、概述

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

特点

简单性和有效性。

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

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

        构成 IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,其时钟信号是由主控 器件产生。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线 的SCL上。对于并联在一条总线上的每个IC都有唯一的地址。

 二、IIC协议三种信号

IIC总线在传输数据的过程中一共有三种类型信号,分别为:开始信号、结束信号和应答信号。

我们关注虚线部位

  • 起始信号S:

scl = 1;

sda = 1;

延时大于4.7微妙    //这里用一个_nop_();函数就够了,一个_nop_();函数就相当于5微妙

sda = 0;

延时大于4微妙

  •  终止信号P:

scl = 1;

sda = 0;

延时大于4微妙

sda = 1;

延时大于4.7微妙

  • 应答信号“0”/”1“

        发送器每发送一个字节(8个bit),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。

        应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字 节;

         应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。

char flag;//在应答函数中定义一个临时变量flag,用于接收sda的值,返回flag。后面判断flag的值是1/0就知道应答信号有没有接收成功(板子不同说明不同,具体看说明书)

sda = 1;//在时钟脉冲9期间释放数据线

_nop_();

scl = 1;

_nop_();

flag = sda;//判断这时候的sda的值是1还是0,是0就代表有效应答位,是1就代表非应答位

_nop_();

scl = 0;

_nop_();

return flag;

  • 数据发送的时序图

SDA只在SCL是低电平期间发生翻转  在SCL高电平期间SDA发生数据的翻转是在发送起始和终止信号,和传输数据的过程

 现在假设传进来的数据是dataSend = 0100 1100

scl = 0;//在这个期间发生数据的翻转

sda = dataSend & 0x80;  //与上1000 0000获得dataSend的最高位,给sda

_nop_();  //延时一段时间  //发送数据建立的时间

scl = 1;  //在这个期间开始发送数据

延时一段时间  //数据发送的时间

scl = 0;  //发送完毕 手动拉低

延时一段时间

dataSend  = dataSend << 1;//向左移一位  //接着向下传递

让下一位变成第一位,也就是让其&上1000 0000就好

 三、OLED写命令

注意:

Co-Continuation bit(Co - 持续字节)

D/C# – Data / Command Selection bit (数据/命令选择位)

ACK – Acknowledgement (确认)

SA0 – Slave address bit (从设备地址字节)

R/W# – Read / Write Selection bit (读/写选择位)

S – Start Condition / P – Stop Condition (S-开始状态,P-结束状态)

1. start()

2. 写入 b0111 1000 0x78

3. ACK

4. cotrol byte: (0)(0)000000 写入命令   (0)(1)000000写入数据

5. ACK

6. 写入指令/数据

7. ACK

8. STOP

// 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();

 四、OLED的寻址模式

  • 三种寻址模式方式

1、页地址寻址模式

        在这种模式下,屏幕被分为8个页面,每个页面包含8行像素。通过设置页面地址和行地址,可以定位到具体的页面和行,然后写入数据。页寻址模式的优点是操作简单,适合大多数应用场景。

寻址流程:

在此模式下,GDDRAM(图形显示数据RAM)的访问是按页进行的。

每次写入数据后,列地址指针会自动增加1。若到达该页的终止列地址,列地址指针会复位到该页的起始列,而页地址指针不改变。

要访问下一页的内容,需手动设置新的页地址和列地址。

通常用于小区域数据的修改‌

假设从PAGE0的COL0开始寻址,一直寻址到COL127,到COL127后,如果没有手动更改页,那么就会依旧从PAGE0页的COL0开始寻址,改页需要手动更改,再第二页的COL0开始寻址,一页一页的寻址。

2、水平地址寻址模式

        水平寻址模式通过设置页面地址和列地址来定位屏幕上的具体位置。在这种模式下,屏幕被分为多个水平列,通过设置列地址来定位具体的列,然后写入数据。水平寻址模式适用于需要精细控制屏幕特定区域的应用场景。、

在此模式下,每次数据访问后,列地址指针会自动增加1。

若列地址指针到达列终止地址,列地址指针会复位到列起始地址,并且页地址指针也会自动增加1。

此模式适用于连续更新整个屏幕或按行更新数据‌

寻址流程:假设从PAGE0的COL0开始寻址,一直寻址到COL127,到COL127之后,会自动变成从PAGE1的COL0开始寻址,这是连续的

3、垂直地址寻址模式(使用少)

        垂直寻址模式通过设置行地址和列地址来定位屏幕上的具体位置。在这种模式下,屏幕被分为多个垂直列,通过设置行地址来定位具体的行,然后写入数据。垂直寻址模式适用于需要精细控制屏幕特定区域的应用场景,但相对于水平寻址模式,其使用较少。

在此模式下,每次数据访问后,页地址指针会自动增加1。

若页地址指针到达页终止地址,页地址指针会复位到页起始地址,并且列地址指针也会自动增加1。

此模式在需要按列更新数据时使用‌

一个字节负责一个PAGE的一列显示

假设,PAGE0的0x10就是下面图的样子。会再屏幕中只显示一个点

 

 确认寻址方式

例如选择页寻址方式

发送一个 Cmd  0X20;

发送一个 Cmd  0X02;

  •  页地址的改变

五、OLED 的使用

  • OLED的初始化函数
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 
}
  • 显示一个点

在主函数中,使用OLED显示一个点的流程如下

1、OLED初始化

2、选择一个位置

        2.1、确认页寻址模式

        2.2、选择PAGE0

3、显示一个点

主函数的代码如下:

        //1. OLED初始化
		Oled_Init();
		//2. 选择一个位置
		//2.1 确认页寻址模式
		Oled_Write_Cmd(0x20);
		Oled_Write_Cmd(0x02);
		//2.2 选择PAGE0   1011 0000
		//					0xB0
		Oled_Write_Cmd(0xB0);
	  //3. 显示一个点
		Oled_Write_Data(0x08);
  • 显示一行点

	//1.初始化oled
	Oled_Init();
	//2.选择一个位置
	//2.1 确认是页寻址模式
	Oled_Write_Data(0x20);
	Oled_Write_Data(0x02);
	Oled_Clear();
	//2.2 选择PAGE0 1011 0000
	Oled_Write_Cmd(0xB0);
	//3显示一个点
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
  • 显示一个字母A

先使用点阵液晶取模

设置参数为

将生成的点阵赋值

可以看到A的点阵宽8*高16,宽8<128 可以使用

高16 >8 所以一个PAGE不够,要用到两个

代码如下:

/*--  文字:  A  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/

char A1[8] = {0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00};
char A2[8] = {0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20};

void main()
{
	int i; 
	//1.初始化oled
	Oled_Init();
	//2.选择一个位置
	//2.1 确认是页寻址模式
	Oled_Write_Data(0x20);
	Oled_Write_Data(0x02);
	Oled_Clear();
	//2.2 选择PAGE0 1011 0000
	Oled_Write_Cmd(0xB0);
	Oled_Write_Cmd(0x00);
	Oled_Write_Cmd(0x10);
	for(i=0;i<8;i++){//显示一个A
		Oled_Write_Data(A1[i]);
	}
	Oled_Write_Cmd(0xB1);
	Oled_Write_Cmd(0x00);
	Oled_Write_Cmd(0x10);
	for(i=0;i<8;i++){//显示一个A
		Oled_Write_Data(A2[i]);
	}
	while(1);
 } 
  • 显示一行字

 代码如下:

/*--  文字:  一  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
code char Y1[16] = {0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00};
code char Y2[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

/*--  文字:  行  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
code char X1[16] = {0x00,0x10,0x88,0xC4,0x33,0x00,0x40,0x42,0x42,0x42,0xC2,0x42,0x42,0x42,0x40,0x00};
code char X2[16] = {0x02,0x01,0x00,0xFF,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00};

/*--  文字:  字  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
code char Z1[16] = {0x10,0x0C,0x04,0x24,0x24,0x24,0x25,0x26,0xA4,0x64,0x24,0x04,0x04,0x14,0x0C,0x00}
code char Z2[16] = {0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00}
void main()
{
	int i; 
	//1.初始化oled
	Oled_Init();
	//2.选择一个位置
	//2.1 确认是页寻址模式
	Oled_Write_Data(0x20);
	Oled_Write_Data(0x02);
	Oled_Clear();
	//2.2 选择PAGE0 1011 0000
	Oled_Write_Cmd(0xB0);
	Oled_Write_Cmd(0x00);
	Oled_Write_Cmd(0x10);
	for(i=0;i<16;i++){
		Oled_Write_Data(Y1[i]);
	}
    for(i=0;i<16;i++){
		Oled_Write_Data(H1[i]);
	}
    for(i=0;i<16;i++){
		Oled_Write_Data(Z1[i]);
	}
	Oled_Write_Cmd(0xB1);
	Oled_Write_Cmd(0x00);
	Oled_Write_Cmd(0x10);
	for(i=0;i<16;i++){
		Oled_Write_Data(Y2[i]);
	}
    for(i=0;i<16;i++){
		Oled_Write_Data(H2[i]);
	}
    for(i=0;i<16;i++){
		Oled_Write_Data(Z2[i]);
	}
	while(1);
 } 

  • 显示一张图片

 代码如下:

code unsigned char bmgImager[] = {
	/*--  调入了一幅图像:D:\yingyong\qian_ru_shi\Keil\code\17-IIC协议\图片.bmp  --*/
/*--  宽度x高度=128x64  128*8(PAGE 有八个字节)*8(PAGE)=--*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFE,0x80,0x80,0x80,
0x80,0xFF,0xFF,0xFF,0x00,0x00,0x08,0x1C,0x1C,0x1C,0x1C,0xFC,0xFC,0xFC,0x1C,0x1C,
0x18,0x00,0x00,0x04,0x1E,0xFE,0xFC,0xF0,0x80,0xE0,0xF0,0xFC,0x7E,0x1C,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,
0xE0,0xE0,0xF0,0xF0,0x70,0x78,0x78,0x38,0x38,0x38,0x38,0x38,0x38,0x78,0xF0,0xE0,
0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0x78,0x38,0x1C,0x1C,0x1C,0x1C,0x1C,
0x1C,0x3C,0x38,0x78,0x70,0xF0,0xE0,0xC0,0x00,0x00,0xFF,0xFF,0xFF,0x07,0x07,0x07,
0x07,0xFF,0xFF,0xFF,0x00,0xF0,0xF8,0xF0,0xE0,0xE0,0xE0,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x01,0x03,0xFF,0xFF,0xFF,0x03,0x01,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,
0x01,0x01,0x00,0x00,0xF0,0xF8,0xF8,0x38,0x38,0x78,0xF8,0xF0,0xC0,0x00,0x01,0x07,
0xFF,0xFF,0xFC,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,
0xE0,0xE0,0xF0,0xFE,0xFF,0x3F,0x07,0x01,0x00,0x00,0xE0,0xF8,0x7C,0x3E,0x1E,0xFE,
0xFC,0xF8,0x80,0x00,0x00,0xE1,0xFF,0xFF,0x7F,0x00,0x00,0x01,0x01,0x00,0x00,0x00,
0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0xE0,0xE0,0xE0,0xF0,0x73,0x7F,0x1F,
0x00,0x00,0x00,0x00,0x07,0x0F,0x0F,0x00,0x00,0x00,0x03,0x07,0x07,0x00,0x00,0x00,
0x01,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x00,0x00,0x00,0x00,
0x03,0x07,0x07,0x00,0x00,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0F,0x0E,0x3E,
0xF8,0xF0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xC0,0xF0,0xFC,0x7E,0x3F,0x0F,0x07,0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFC,0xFE,0xBF,0x8F,0xC7,0xC7,
0x8F,0x9E,0xBC,0xF8,0xF0,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x80,0xE0,0xF0,0xF8,0x3C,0x3C,0x1C,0x3C,0xF8,0xF8,0xE0,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0x1F,0x7F,0xFE,0xF0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,
0xFF,0xFF,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x7F,0x7F,0x7F,0x7F,0xFF,0xFF,
0xFF,0xFF,0x7F,0x3F,0x1F,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x1F,0x1F,0x3F,0x7E,0xFF,0xFF,0xFE,0xFE,0xFF,0x3F,0x03,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xE0,0xE0,0xE0,0xC0,0xC0,0x80,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFE,
0xFE,0x2E,0x1E,0x1C,0x3C,0x78,0x78,0x7C,0x7E,0x3E,0x1E,0x0F,0x8F,0xFE,0xFC,0xF8,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,
0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x06,0x0F,0x0F,0x07,0x13,0x3B,0x3D,0x3C,0xDF,
0xEF,0xF0,0x78,0x7C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x20,0xF0,0xF0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC0,0xE0,0xF0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC8,0xDC,0xDC,0xDD,0xBD,0xBB,0x33,
0x00,0x00,0xC0,0xFC,0xFF,0x7F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,
0x07,0x0F,0x0E,0x1E,0x1C,0x3C,0x38,0x38,0x38,0x1C,0x1C,0x1E,0x0F,0x0F,0x07,0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x03,0x07,0x07,0x0F,0x1E,0x1C,0x3C,0x38,0x78,0x70,0x70,0x70,0xF0,0xE0,0xE0,
0xE1,0xE0,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x03,0x07,0x0E,0x0C,0x0C,0x1C,0x1C,0x1C,0x1C,0x1E,0x1E,0x0F,
0x07,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x81,0xC3,0xC3,0xC7,0xE7,
0xFE,0x7E,0x3F,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};

void Oled_Show_Image(unsigned char *image)
{
	unsigned char i;
	unsigned int j;
	
	for(i=0;i<8;i++){//8行
		Oled_Write_Cmd(0xB0+i);//page0-page7
		//每个page从0列到127列,依次写入0,每写入数据,列地址自动偏移
		Oled_Write_Cmd(0x00); 
		Oled_Write_Cmd(0x10);
		for(j=128*i;j<(128*(i+1));j++){//j是从八行中每一行的起始位置开始计算的,j<每一行的最后一位
			Oled_Write_Data(image[j]);
		}	
	}
}


void main()
{
	//1.初始化oled
	Oled_Init();
	//2.选择一个位置
	//2.1 确认是页寻址模式
	Oled_Write_Data(0x20);
	Oled_Write_Data(0x02);
	Oled_Clear();
	Oled_Show_Image(bmgImager);
	while(1);
	
 } 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2257431.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小程序-基于java+SpringBoot+Vue的智慧校园管理系统设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

Linux下的编程

实验7 Linux下的编程 一、实验目的 熟练掌握Linux下Python编程的方法、函数调用方法以及shell编程中的控制结构。 二、实验环境 硬件&#xff1a;PC电脑一台&#xff0c;网络正常。 配置&#xff1a;win10系统&#xff0c;内存大于8G &#xff0c;硬盘500G及以上。 软件&a…

flink的安装配置(详细版本)

Standalone集群模式安装部署 conda deactivate 退出 base环境 Flink支持多种安装模式。 local&#xff08;本地&#xff09;——本地模式 standalone——独立模式&#xff0c;Flink自带集群&#xff0c;开发测试环境使用 standaloneHA—独立集群高可用模式&#xff0c;Fli…

【大语言模型】LangChain ModelsIO与Models I/O Promopts详解

【大语言模型】LangChain ModelsIO与Prompts详解 一、LangChain ModelsIO1、简介2、Models I/O 的应用场景3、Models I/O 主要模块3.1、Prompts3.2、Modelsa、MESSAGES 类型 3.3、Output Parsers 二、LangChain ModelsIO Prompts1、简介2、Prompts 的优点3、实战示例3.1、Promp…

Prometheus加入BasicAuth认证,通过配置 Prometheus 的 Web 身份验证来限制访问/debug/pprof/

Prometheus 作为监控工具&#xff0c;暴露了大量的系统监控数据和配置信息&#xff0c;这些数据可能包含敏感信息。Prometheus 默认没有身份验证&#xff0c;任何能够访问 Prometheus Web 界面的人都可以查看和查询这些数据。 此外Prometheus Web 界面的/debug/pprof/接口存在…

再谈多重签名与 MPC

目录 什么是 MPC 钱包以及它们是如何出现的 多重签名和智能合约钱包已经成熟 超越 MPC 钱包 关于小队 多重签名已经成为加密货币领域的一部分&#xff0c;但近年来&#xff0c;随着 MPC&#xff08;多方计算&#xff09;钱包的出现&#xff0c;多重签名似乎被掩盖了。MPC 钱包之…

QT 中基于 TCP 的网络通信

基础 基于 TCP 的套接字通信需要用到两个类&#xff1a; 1&#xff09;QTcpServer&#xff1a;服务器类&#xff0c;用于监听客户端连接以及和客户端建立连接。 2&#xff09;QTcpSocket&#xff1a;通信的套接字类&#xff0c;客户端、服务器端都需要使用。 这两个套接字通信类…

数值分析—数值积分

研究背景 积分的数学解法为牛顿莱布尼兹公式&#xff0c;数学表示为 ∫ a b f ( x ) d x F ( b ) − F ( a ) \int_{a}^{b} f(x)dxF(b)-F(a) ∫ab​f(x)dxF(b)−F(a)&#xff0c;但应用该方法有如下困难&#xff1a; 1&#xff0c; f ( x ) f(x) f(x)的原函数有时不能用初等函…

如何配置Github并在本地提交代码

前提: 可以流畅访问github, 需要一些上网技巧, 这就自行处理了 申请一个github账号 Github官网地址 首先就是邮箱注册啦, github没有对邮箱的限制, 只要是能收邮件的就ok, qq邮箱, 163等都可以使用. 然后和普通注册账号一样, 一路填写需要的信息, 验证邮箱即可. 如何新增代…

Unity控制物体材质球的改变

Unity控制物体材质球的改变 1.前言2.示例单个材质球的获取和更改多个材质球的获取和更改 1.前言 材质球其实就是一个数组&#xff0c;有的只有一个&#xff0c;有的却有多个 2.示例 单个材质球的获取和更改 private Material m_material;m_material GetComponent<Render…

一些硬件知识【2024/12/6】

MP6924A: 正点原子加热台拆解&#xff1a; PMOS 相比 NMOS 的缺点&#xff1a; 缺点描述迁移率低PMOS 中的空穴迁移率约为电子迁移率的 1/3 到 1/2&#xff0c;导致导通电流较低。开关速度慢由于迁移率较低&#xff0c;PMOS 的开关速度比 NMOS 慢&#xff0c;不适合高速数字电…

数据结构排序算法详解

数据结构排序算法详解 1、冒泡排序&#xff08;Bubble Sort&#xff09;2、选择排序&#xff08;Selection Sort&#xff09;2、插入排序&#xff08;Insertion Sort&#xff09;4、快速排序&#xff08;Quick Sort&#xff09; 1、冒泡排序&#xff08;Bubble Sort&#xff09…

【CKS最新模拟真题】获取多个集群的上下文名称并保存到指定文件中

文章目录 前言一、TASK二、解题过程1、问题一解题2、问题二解题 前言 月底考CKS,这是最新版的CKS模拟题 环境k8s版本ubuntu1.31 考试期间允许访问的资源地址&#xff0c;支持将英文翻译为中文文档 文档地址kubernetes文档https://kubernetes.io/docs https://kubernetes.io…

Linux上的C语言编程实践

说明&#xff1a; 这是个人对该在Linux平台上的C语言学习网站笨办法学C上的每一个练习章节附加题的解析和回答 ex1: 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后运行它看看发生了什么。 vim ex1.c打开 ex1.c 文件。假如我们删除 return 0…

Fastadmin地图插件在表单中的使用

表单中实现地图选择获取经纬度 1.Fastadmin后台安装地图选择插件地图位置(经纬度)选择插件 - 支持百度地图、高德地图、腾讯地图 – 基于ThinkPHP和Bootstrap的极速后台开发框架 2.腾讯地图开放平台后台创建应用创建KEY&#xff0c;配置逆地址解析额度。插件配置中配置腾讯地图…

Java项目实战II基于微信小程序的电子竞技信息交流平台的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着互联网技术的飞速发展…

计算机网络期末常见问答题总结

1、试说明为什么在运输建立时使用三报文握手&#xff0c;如果不采用三报文握手会出现什么情况&#xff1f; TCP三次握手的目的是确保客户端和服务器都能够接收对方的连接请求,并建立起可靠的连接。如果只进行两次握手,可能会导致以下情况的发生: - 如果客户端发送的SYN包在网…

kubesphere搭建 postgres15

创建configMap POSTGRES_PASSWORD数据库密码 PGDATA数据目录 创建【有状态副本集】工作负载 1.创建基本信息 2.容器组设置 配置环境变量 3.存储设置 完成之后点击下一步 配置服务 创建服务 配置基本信息 配置服务信息 外部访问选择nodePort&#xff0c;然后点击…

【55 Pandas+Pyecharts | 实习僧网Python岗位招聘数据分析可视化】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 去除重复数据2.4 调整部分城市名称 &#x1f3f3;️‍&#x1f308; 3. Pyecharts数据可视化3.1 招聘数量前20岗位3.2 各城市招聘数量3…

/usr/local/go/bin/go: cannot execute binary file: Exec format error

现象&#xff1a;ubuntu中安装go软件环境&#xff0c;报上述错误 原因&#xff1a;系统与软件不适配 解决&#xff1a;查看本系统的版本 找到x86-64对应的go版本即可