13:OLED屏幕的使用

1、I2C总线

  IIC同步、半双工,带数据应答的总线,IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,其时钟信号是由主控器件产生。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。对于并联在一条总线上的每个IC都有唯一的地址
在这里插入图片描述
如上图:
所有I2C设备的SCL连在一起,SDA连在一起
设备的SCL和SDA均要配置成开漏输出模式
SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右
开漏输出和上拉电阻的共同作用实现了“线与”的功能,此设计主要是为了解决多机通信互相干扰的问题

2、传输信号

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

  • 起始信号
    在这里插入图片描述

主控设备将时钟线SCL置为高电平后,将SDA由高电平变为低电平,代表向被控设备发送起始信号。

  • 终止信号
    在这里插入图片描述

主控设备将时钟线SCL置为高电平后,将SDA由低电平变为高电平,代表向被控设备发送起始信号。

  • 应答信号
    在这里插入图片描述

主控设备将时钟线SCL置为高电平后,检测SDA的电平。应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。

3、主控设备和被控设备通信的过程

3.1、向被控设备发送数据

  1. 发送起始信号
  2. 发送一个字节的数据,里面包含了目标设备的地址7位+读/写控制位,共8位
  3. 检测应答信号(被控设备发出的)
  4. 发送需要发送的数据(一个字节)
  5. 检测应答信号(被控设备发出的)
  6. 发送停止信号
    在这里插入图片描述

3.2、向被控设备接收数据

  1. 发送起始信号
  2. 发送一个字节的数据,里面包含了目标设备的地址7位+读/写控制位,共8位
  3. 检测应答信号(主控设备发出的)
  4. 发送需要发送的数据(一个字节)
  5. 检测应答信号(主控设备发出的)
  6. 发送停止信号

在这里插入图片描述

3.3、向被控设备发送数据的时序图

在这里插入图片描述
【注意】

  • SCL的高低电平都是由主机控制的
  • 每传输一个字节的数据才
  • 应答信号的0/1是从机给SDA上写入的

3.4、代码程序

I2C.c文件

#include <REGX52.H>
#include "intrins.h"

sbit SCL = P0^1;//定义单片机的P0.1口位时钟线
sbit SDA = P0^2;//定义单片机的P0.2口位数据线

/*
	* 时钟线SCL高电平时:单片机给数据线写入由高电平变为低电平
	* 代表发送起始信号。
*/
void I2C_Start()//单片机给从机发送起始信号,ok
{
	SCL = 0;
	SCL = 1;
	SDA = 1;
	_nop_();//5us
	SDA = 0;
	_nop_();//5us
	SCL = 0;
}

/*
	* 时钟线SCL高电平时:单片机给数据线写入由低电平变为高电平
	* 代表发送起始信号。
*/
void I2C_Stop()//单片机给从机发送停止信号,ok
{
	SCL = 0;
	SCL = 1;
	SDA = 0;
	_nop_();//5us
	SDA = 1;
	_nop_();//5us
	SDA = 0;
}

/*
	* 单片机给从机发送一个数据,从机都会给单片机一个
	* 应答信号ACK,如果这个是低电平0表示数据传输成功
	* 如果是高电平1表示数据传输失败。(注意:应答信号是从机发出的)
*/
unsigned char ACK(void)
{
	unsigned char flag;
	SCL = 1;
	_nop_();
	flag = SDA;
	_nop_();
	SCL = 0;
	return flag;//查看flag的值是多少,
}

/*
	* 单片机给从机发送数据,SCL低电平时:单片机给数据线(SDA)上写入数据
	* SCL高电平时:单片机不能给数据线(SDA)写入数据(原因:在SCL=1时,单片
	* 机给数据线SDA写入数据,代表起始信号或者停止信号)。只能给从机读取数据线
	* 上面的数据。
*/

/*
	* 每次发送都是发送1位,依次发送8次,即发送一个字节。
	* 每发送一个字节,主机都要查看从机是否返回应答
*/

void I2C_SendByte(char Byte)  //er
{
	unsigned char i;
	for(i = 0; i<8; i++)
	{
		SCL = 0;//给时钟线拉低,准备在数据线上写入数据
		SDA = Byte & 0x80;//写入数据,每次写入只能写入1位数据,从最高位开始写
		_nop_();
		SCL = 1;//拉高,让从机开始读取数据。
		_nop_();
		SCL =0;//拉低,位下一次写数据做准备
		Byte = Byte << 1;//左移移位,让次高位移动到高位
	}
}

4、OLED模块的使用

4.1、传输数据的步骤

  OLED模块数据传输就是通过I2C总线进行传输的,所以此模块一共有4个引脚,而数据传输也要遵循I2C通信协议。而在使用此模块时,和LCD1602显示屏一样,需要对它发送一些指令进行配置,以便于显示。
在这里插入图片描述如上图所示:

  1. 单片机先发送一个起始信号S

  2. 发送一个字节的数据,里面包含了目标设备的地址7位+读/写控制位(R/W),共8位
    如图:地址的7位前6位为固定的0111 10,后1位为我们自己设置(0/1),所以一共能连接2个OLED模块。而最后一位为R/W,1为读取数据,0为向模块写入数据。

  3. 然后检测一个应答信号

  4. 然后传输一个配置字节
    如图:CO被设置为0时表示将开始传输信息了。D/C表示数据/指令控制位,为1是写入数据,为0是写入指令。而后面6位是固定的00 0000

  5. 然后一个应答信号

  6. 然后开始传输一个字节的数据/指令

  7. 然后传输一个配置字节

  8. 然后开始传输一个字节的数据/指令

  9. 传输完毕后,发送一个停止信号P

【注意】
每次发送一个字节的数据之前都要发送一个配置字节

4.2、显示的原理

  OLED模块的屏幕像素是64x128。1行为128的LED点阵,1列为64的LED点阵。我们将1列的每8个点阵分为1组,所以一共有8组。分别为Page0~Page7。
在这里插入图片描述
我们以Page2为例,高电平1点亮,低电平0熄灭。且高位在下,低位在上。
在这里插入图片描述

4.3、显示配置

  在显示前,需要指定的显示位置,而下图被框的是选址模式的配置和选择显示列的配置,
如图:先发送0x20设置内存然后在发送0x20选择页寻址模式。发送0x03,在发送0x16;选择在100列显示。

在这里插入图片描述

  • 水平寻址模式
    在这里插入图片描述
    自动向左水平填充,
  • 垂直寻址模式
    在这里插入图片描述
  • 页寻址模式
    在这里插入图片描述
    【注】
    寻址模式不配置,默认是页寻址模式。

配置完寻址模式后,然后选择Page显示。如下图:选择Page的8为二进制数前5位为固定的1011 0(0xB),,后3位为我们自己配置,后3位为000,选择Page0。为001,选择Page1。依次类推

在这里插入图片描述

4.4、代码程序

4.4.1、显示字符A

OLED.c文件

#include <REGX52.H>
#include "intrins.h"
#include "I2C.h"

/*
	* 使用Oled显示模块时,需要给他一些指令进行配置
	* 例如:显示在什么地方。然后在给模块发送数据进行显示
*/

void Oled_Write_Cmd(unsigned char command)//给Oled写命令 ok
{
	I2C_Start();//发送起始信号
	I2C_SendByte(0x78);//011110 00寻址(OLED模块的地址,每个I2C设备都有地址)
	ACK();
	I2C_SendByte(0x00);//xx000000,控制命令。01写入数据,00写入指令
	ACK();
	I2C_SendByte(command);
	ACK();
	I2C_Stop();
}

void Oled_Write_Data(unsigned char datas)
{
	I2C_Start();//发送起始信号
	I2C_SendByte(0x78);//011110 00寻址(OLED模块的地址,每个I2C设备都有地址)
	ACK();
	I2C_SendByte(0x40);//xx00 0000,控制命令。01写入数据,00写入指令
	ACK();
	I2C_SendByte(datas);
	ACK();
	I2C_Stop();
}

void Oled_Init()//Oled的初始化
{
	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()//清零,每个都写入0
{
	unsigned char i,j;
	for(i = 0; i<8; i++)
	{
		Oled_Write_Cmd(0x20);
	  Oled_Write_Cmd(0x02); 
		Oled_Write_Cmd(0xB0+i);//选择Page
		
		Oled_Write_Cmd(0x00);
		Oled_Write_Cmd(0x10); //每一页都从第1列开始写入
		for(j = 0; j<128; j++)
		{
				Oled_Write_Data(0x00);
		}
	}
}

主函数mian.c文件

/*****在OLED显示一个字符A****/
#include <REGX52.H>
#include "Oled.h"

void main(void)
{
/*
	显示'A'	宽x高=8x16  ,高16,需要2个Page才能显示。所以要Page0和Page1
	0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00
	0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20
*/
	char A1[8] = {0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00};
	char A2[8] = {0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20};
	
	unsigned char i;
	Oled_Init();
	Oled_Clear();
	
	Oled_Write_Cmd(0x20);//设置内存
	Oled_Write_Cmd(0x02);//选择页选址模式
	
    Oled_Write_Cmd(0xB0);//选择要显示的(Page0~7)1011 0xxx  选择Page0,第一行开始显示
	Oled_Write_Cmd(0x00);//0000 xxxx(1111)低位              列
	Oled_Write_Cmd(0x10);//0001 xxxx(0111)高位 
											//代表位000 0000 ,为1列
	for(i = 0; i<8; i++)
	{
			Oled_Write_Data(A1[i]);
	}
	
	Oled_Write_Cmd(0xB1);//选择要显示的(Page0~7)1011 0xxx 选择Page1,第一行开始显示
	Oled_Write_Cmd(0x00);//0000 xxxx(1111)低位
	Oled_Write_Cmd(0x10);//0001 xxxx(0111)高位
	for(i = 0; i<8; i++)
	{
			Oled_Write_Data(A2[i]);
	}
	while(1);
}

在这里插入图片描述

4.4.2、显示一段话

我们通过取模软件,将“我是你爸爸”这段话的数据取出来。
在这里插入图片描述

主函数main.c文件

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

/*--  文字:  是  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
//0x00,0x00,0x00,0x7F,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x7F,0x00,0x00,0x00,0x00,
//0x81,0x41,0x21,0x1D,0x21,0x41,0x81,0xFF,0x89,0x89,0x89,0x89,0x89,0x81,0x81,0x00,

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

/*--  文字:  爸  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
//0x80,0x80,0x48,0x44,0x26,0x29,0x10,0x10,0x28,0x25,0x42,0x44,0x88,0x80,0x80,0x00,
//0x00,0x00,0x00,0x7F,0x89,0x89,0x89,0x8F,0x89,0x89,0x89,0x9F,0x80,0xE0,0x00,0x00,

/*--  文字:  爸  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
//0x80,0x80,0x48,0x44,0x26,0x29,0x10,0x10,0x28,0x25,0x42,0x44,0x88,0x80,0x80,0x00,
//0x00,0x00,0x00,0x7F,0x89,0x89,0x89,0x8F,0x89,0x89,0x89,0x9F,0x80,0xE0,0x00,0x00,

//一个字的高度x宽度 = 16X16,一共有5个字,所以一共的高度x宽度 = 16x80。所以一共有2x80个数据。所以需要2个Page用来显示上半部份,和下半部分
#include <REGX52.H>
#include "Oled.h"

void main(void)
{
//上半部分		
		char wsnbb1[] = { 0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,
		/*我*/			  0x20,0xFF,0x20,0x22,0x2C,0xA0,0x20,0x00,
			     		  0x00,0x00,0x00,0x7F,0x49,0x49,0x49,0x49,
		/*是*/		 	  0x49,0x49,0x49,0x7F,0x00,0x00,0x00,0x00,
						  0x00,0x80,0x60,0xF8,0x07,0x40,0x20,0x18,
		/*你*/ 			  0x0F,0x08,0xC8,0x08,0x08,0x28,0x18,0x00,
					      0x80,0x80,0x48,0x44,0x26,0x29,0x10,0x10,
		/*爸*/			  0x28,0x25,0x42,0x44,0x88,0x80,0x80,0x00,
						  0x80,0x80,0x48,0x44,0x26,0x29,0x10,0x10,
		/*爸*/			  0x28,0x25,0x42,0x44,0x88,0x80,0x80,0x00};
		
//下半部分									 
    code char wsnbb2[] = {  0x00,0x08,0x48,0x84,0x7F,0x02,0x41,0x40,
 	                        0x20,0x13,0x0C,0x14,0x22,0x41,0xF8,0x00,
						    0x81,0x41,0x21,0x1D,0x21,0x41,0x81,0xFF,
				    		0x89,0x89,0x89,0x89,0x89,0x81,0x81,0x00,
							0x01,0x00,0x00,0xFF,0x00,0x10,0x0C,0x03,
						    0x40,0x80,0x7F,0x00,0x01,0x06,0x18,0x00,
							0x00,0x00,0x00,0x7F,0x89,0x89,0x89,0x8F,
						    0x89,0x89,0x89,0x9F,0x80,0xE0,0x00,0x00,
		                    0x00,0x00,0x00,0x7F,0x89,0x89,0x89,0x8F,
				    	    0x89,0x89,0x89,0x9F,0x80,0xE0,0x00,0x00,};
	unsigned char i;
	Oled_Init();
	Oled_Clear();
	
	Oled_Write_Cmd(0x20);//设置内存
	Oled_Write_Cmd(0x02);//选择页选址模式
/*显示上半部分*/
		Oled_Write_Cmd(0xB0);//选择要显示的(Page0~7)1011 0xxx  行
		Oled_Write_Cmd(0x00);//0000 xxxx(1111)低位              列
		Oled_Write_Cmd(0x10);//0001 xxxx(0111)高位 
		for(i = 0; i<sizeof(wsnbb1); i++)
		{
			Oled_Write_Data(wsnbb1[i]);
		}
/*显示下半部分*/		
		Oled_Write_Cmd(0xB1);//选择要显示的(Page0~7)1011 0xxx  行
		Oled_Write_Cmd(0x00);//0000 xxxx(1111)低位              列
		Oled_Write_Cmd(0x10);//0001 xxxx(0111)高位
		for(i = 0; i<sizeof(wsnbb2); i++)
		{
			Oled_Write_Data(wsnbb2[i]);
		}
	while(1);

在这里插入图片描述

4.4.3、显示图片

显示图片
在这里插入图片描述通过取模软件将数据取出
在这里插入图片描述

主函数main.c文件

/*--  调入了一幅图像:C:\Users\fxb\Desktop\大.bmp  --*/
/*--  宽度x高度=128x64  --*/
/*
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,0xC0,0x60,0x20,0x20,0x20,
0xE0,0xE0,0xA0,0x20,0x20,0x60,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,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,0xFA,0x0F,0x04,0x0C,0x08,0x08,
0x18,0x10,0x10,0x10,0x10,0x10,0x19,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,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,0xE0,0x3F,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF0,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x07,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,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x40,0x40,0x40,0x40,0x40,
0xC0,0xFC,0xC0,0xFC,0xC0,0x0C,0xF8,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x3C,0xF0,0x1C,0xF0,0x98,0xC0,0x40,
0x40,0x40,0x40,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x40,0x40,0x40,0x40,0x40,0xF8,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0xF8,0x08,
0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x20,0xF8,0x20,0xF8,0x88,0x88,0xF8,0x88,0xF8,
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,0x3F,0x61,0xC0,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x01,0x00,0x03,0x01,0x03,0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0F,0x0C,0x07,0x02,0x03,0x01,0x00,0x00,
0x00,0x00,0x00,0x00,0x01,0x87,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x10,0x08,0x04,0x02,0x01,0x02,0x04,0x08,0x10,0x10,0x00,0x10,0x0C,0x07,0x00,
0x00,0x00,0x1F,0x10,0x10,0x0C,0x00,0x12,0x1F,0x01,0x1F,0x10,0x10,0x10,0x10,0x11,
0x0C,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,0x01,0x03,0x06,0x0C,0x18,
0x70,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0xC0,0x40,0x60,0x20,0x30,
0x10,0x18,0x08,0x0C,0x06,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,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,0x01,0x01,0x01,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
0x02,0x02,0x02,0x03,0x01,0x01,0x01,0x01,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,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,
*/
//高x宽 = 64x128,一共有8x128个数据。所以需要8个Page和所有的列
#include <REGX52.H>
#include "Oled.h"

void main(void)
{					
	unsigned char i;
	unsigned int j;
/*--  宽度x高度=128x64  ,一共由128*8个数--*/
	code char DJB[] = {
	                            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,0xC0,0x60,0x20,0x20,0x20,
								0xE0,0xE0,0xA0,0x20,0x20,0x60,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,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,0xFA,0x0F,0x04,0x0C,0x08,0x08,
								0x18,0x10,0x10,0x10,0x10,0x10,0x19,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,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,0xE0,0x3F,0x00,0x00,0x00,0x00,0x00,
								0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF0,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
								0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,
								0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x07,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,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x40,0x40,0x40,0x40,0x40,
								0xC0,0xFC,0xC0,0xFC,0xC0,0x0C,0xF8,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
								0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x3C,0xF0,0x1C,0xF0,0x98,0xC0,0x40,
								0x40,0x40,0x40,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
								0x40,0x40,0x40,0x40,0x40,0xF8,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0xF8,0x08,
								0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x20,0xF8,0x20,0xF8,0x88,0x88,0xF8,0x88,0xF8,
								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,0x3F,0x61,0xC0,0x80,0x00,0x00,0x00,0x00,
								0x00,0x00,0x01,0x00,0x03,0x01,0x03,0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
								0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0F,0x0C,0x07,0x02,0x03,0x01,0x00,0x00,
								0x00,0x00,0x00,0x00,0x01,0x87,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
								0x10,0x10,0x08,0x04,0x02,0x01,0x02,0x04,0x08,0x10,0x10,0x00,0x10,0x0C,0x07,0x00,
								0x00,0x00,0x1F,0x10,0x10,0x0C,0x00,0x12,0x1F,0x01,0x1F,0x10,0x10,0x10,0x10,0x11,
								0x0C,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,0x01,0x03,0x06,0x0C,0x18,
								0x70,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
								0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0xC0,0x40,0x60,0x20,0x30,
								0x10,0x18,0x08,0x0C,0x06,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,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,0x01,0x01,0x01,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
								0x02,0x02,0x02,0x03,0x01,0x01,0x01,0x01,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,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
								};
	Oled_Init();
	Oled_Clear();
	
	Oled_Write_Cmd(0x20);//设置内存
	Oled_Write_Cmd(0x02);//选择页选址模式
	for(i = 0; i<8; i++)
	{
		Oled_Write_Cmd(0xB0+i);
		Oled_Write_Cmd(0x00);
	    Oled_Write_Cmd(0x10);
	    for(j = (128*i); j<(128*(i+1)); j++)//第一Page显示完后,第二个Page的第一列显示数组的第129个数据。
		{
			Oled_Write_Data(DJB[j]);
		}
	}
	while(1);		
}

在这里插入图片描述

  • 12
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
0.96'OLED是一款高性能的显示设备。我们提供的资料里详细介绍YFROBOT 0.96’OLE(带字库)的使用方法,并提供详细的例程详解。该模块特点: 三色可选,模块有两种单色和黄蓝双色两种颜色可选,单色为纯白色和纯蓝色,双色为黄蓝双色; 超小尺寸,显示尺寸为0.96 寸,模块尺寸为27mm(长)*26mm(宽)*4mm(高); 高分辨率,分辨率为128*64; 两种接口模式,4 线串行SPI 接口模式,IIC 接口模式; 带字库芯片,可显示标准的国标简体(GB2312)汉字、8*16 点ASCII 粗体字库、7*8点ASCII 字库、5*7 点ASCII 字库; 兼容3.3V~5V 电压。 0.96’OLED 模块通过外部排针和单片机通讯,各引脚详细描述如下: 序号名称 说明 1 GND 地 2 VCC 电源,3.3V~5V 3 CLK 4线ISP接口模式:时钟线IIC接口模式:时钟线GT20L16S1Y的时钟线 4 DIN 4线ISP接口模式:串行数据线IIC接口模式:数据线GT20L16S1Y的串行数据输入端口 5 D/C 4线ISP接口模式:命令/数据标志位IIC接口模式:接GND 6 CS1 4线ISP接口模式:OLED片选IIC接口模式:接GND 7 SO GT20L16S1Y的串行数据输出端口 8 CS2 GT20L16S1Y的片选端口 附件包含以下资料: Aarduino OLED显示(实验1:HelloWord;实验2:贪吃蛇) STM32 OLED显示 资料手册 ASCII码表.pdf; GB2312简体中文编码表.pdf; GT20L16S1Y用户手册V35.pdf; SAS1-9046-B UG-2864HSWEG01-Univision.pdf; SSD1306-Revision 1.1 (Charge Pump).pdf 0.96'OLED(带字库)使用手册V1.0.pdf 字符图片取模软件
显示距离值的程序 以下是使用C语言编写的超声波测距程序,使用C52单片机OLED屏幕显示距离值: ```c #include <reg52.h> #include <intrins.h> #define FREQ 11059200UL sbit TRIG = P1^0; sbit ECHO = P1^1; unsigned char code font_6x8[95][6]; unsigned int distance = 0; void delay_us(unsigned int us) { while(us--) { _nop_(); _nop_(); _nop_(); _nop_(); } } void delay_ms(unsigned int ms) { while(ms--) { delay_us(1000); } } void init() { TMOD = 0x01; TH0 = 0; TL0 = 0; EA = 1; ET0 = 1; TRIG = 0; } void display(unsigned char x, unsigned char y, unsigned char ch) { unsigned char i, j; ch -= 32; for(i = 0; i < 6; i++) { j = font_6x8[ch][i]; OLED_SetPos(x, y + i); OLED_WrDat(j); } } void OLED_Init() { OLED_WR_Byte(0xAE,OLED_CMD);//--display off OLED_WR_Byte(0x00,OLED_CMD);//---set low column address OLED_WR_Byte(0x10,OLED_CMD);//---set high column address OLED_WR_Byte(0x40,OLED_CMD);//--set start line address OLED_WR_Byte(0xB0,OLED_CMD);//--set page address OLED_WR_Byte(0x81,OLED_CMD); // contract control OLED_WR_Byte(0xFF,OLED_CMD);//--128 OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64) OLED_WR_Byte(0x3F,OLED_CMD);//--1/64 duty OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction OLED_WR_Byte(0xD3,OLED_CMD);//set display offset OLED_WR_Byte(0x00,OLED_CMD);// OLED_WR_Byte(0xD5,OLED_CMD);//set osc division OLED_WR_Byte(0x80,OLED_CMD);// OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off OLED_WR_Byte(0x05,OLED_CMD);// OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period OLED_WR_Byte(0xF1,OLED_CMD);// OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion OLED_WR_Byte(0x12,OLED_CMD);// OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh OLED_WR_Byte(0x30,OLED_CMD);// OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable OLED_WR_Byte(0x14,OLED_CMD);// OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel } void OLED_SetPos(unsigned char x, unsigned char y) { OLED_WR_Byte(0xb0 + y, OLED_CMD); OLED_WR_Byte(((x & 0xf0) >> 4) | 0x10, OLED_CMD); OLED_WR_Byte((x & 0x0f), OLED_CMD); } void OLED_WR_Byte(unsigned dat,unsigned cmd) { unsigned char i; if(cmd) { OLED_DC = 1; } else { OLED_DC = 0; } OLED_CS = 0; for(i = 0; i < 8; i++) { OLED_SCLK = 0; if(dat & 0x80) { OLED_SDIN = 1; } else { OLED_SDIN = 0; } OLED_SCLK = 1; dat <<= 1; } OLED_CS = 1; } void OLED_Clear() { unsigned char i, j; for(i = 0; i < 8; i++) { OLED_SetPos(0,i); for(j = 0; j < 128; j++) { OLED_WrDat(0); } } } void OLED_WrDat(unsigned char dat) { OLED_WR_Byte(dat, OLED_DATA); } void Timer0_ISR() interrupt 1 { static unsigned int counter = 0; if(counter > 50) { TRIG = 1; delay_us(10); TRIG = 0; while(ECHO == 0); TH0 = 0; TL0 = 0; while(ECHO == 1); distance = (unsigned int)(TH0 << 8 | TL0) / 58; counter = 0; } counter++; } void main() { init(); OLED_Init(); OLED_Clear(); while(1) { display(0, 0, 'D'); display(6, 0, 'i'); display(12, 0, 's'); display(18, 0, 't'); display(24, 0, 'a'); display(30, 0, 'n'); display(36, 0, 'c'); display(42, 0, 'e'); display(48, 0, ':'); display(54, 0, ' '); display(72, 0, distance / 100 + '0'); display(78, 0, distance % 100 / 10 + '0'); display(84, 0, distance % 10 + '0'); delay_ms(100); OLED_Clear(); } } ``` 该程序通过超声波测距模块测量距离,并在OLED屏幕上显示距离值。程序中使用了定时器0来计数,每50个计数就触发一次超声波测距,并计算距离值。距离值通过数字的方式在OLED屏幕上显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值