IIC协议

IIC协议

IIC协议概述

IIC (I2C,Inter-Integrated Circuit)即集成电路总线,是一种两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。多用于主机和从机在数据量不大传输距离短的场合下的主从通信。I2C总线由数据线SDA时钟线SCL构成通信线路,既可用于发送数据,也可接收数据,是一种半双工通信协议。总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据传输。

SDA 是串行数据线,由于 I2C器件一般采用开漏结构与总线相连,所以SCL 和 SDA 均需接上拉电阻。也正因此,当总线空闲时,这两条线路都处于高电平状态,当连到总线上的任一器件输出低电平,都将使总线拉低,即各器件的 SDA 及 SCL 都是“线与”关系。 I2C总线支持多主和主从两种工作方式,通常工作在主从工作方式,开发板就采用主从工作方式。在主从工作方式中,系统中只有一个主机,其它器件都是具有 I2C 总线的外围从机。在主从工作方式中,主机启动数据的发送(发出启动信号)并产生时钟信号,数据发送完成后,发出停止信号。

特点

  • 多主控

      总线上的每一个设备都可以作为主设备或者从设备,且每一个设备都会对应一个唯一的地址,主从设备通过这个地址来识别确定与哪个设备进行通信。同一时间,只能有一个主控设备。
    
  • 传输快

IIC有三种传输模式:

标准模式:100K bit/s
快速模式:400K bit/s
高速模式:3.4M bit/s


IIC协议的时序

  1. 空闲状态

​ 在I2 C器件开始通信(传输数据)之前,串行时钟线 SCL 和串行数据线 SDA 线由于接到上拉电阻的原因处于高电平状态,此时 I2 C总线处于空闲状态。

  1. 起始信号

​ 在SCL保持高电平期间,SDA的电平被拉低,称为I2 C总线总线的起始信号,标志着一次数据传输开始。起始信号由主机主动建立的,在建立该信号之前I2 C总线必须处于空闲状态。

  1. 停止信号

​ 在SCL保持高电平期间,SDA被释放,返回高电平,称为I2 C总线的停止信号,标志着一次数据传输的终止。停止信号由主机主动建立的,建立该信号之后,I2 C总线将返回空闲状态。

  1. 数据传输

​ 在I2 C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在 SDA上逐位地串行传送每一位数据。进行数据传送时,在 SCL 的高电平期间,SDA上的电平必须保持稳定,只有在SCL为低电平期间,才允许 SDA上的电平改变状态。即数据在SCL的上升沿到来之前就必须准备好,并在在下降沿到来之前必须保持稳定。在经过8个时钟周期后,传输了8bit数据,即一个字节。

  1. 应答信号

第8个时钟周期末,主机释放 SDA 以使从机应答,在第 9 个时钟周期,从机将 SDA 拉低以应答;如果第 9 个时钟周期,SCL 为高电平时,SDA 未被检测到为低电平,视为非应答,表明此次数据传输失败。第 9 个时钟周期末,从机释放 SDA 以使主机继续传输数据,如果主机发送停止信号,此次传输结束。需要注意的是数据以 8bit 即一个字节为单位串行发出,其最先发送的是字节的最高位。

需要注意的是:在数据传输的过程中,只有当SCL为低电平时,才允许SDA线上的电平发生翻转!如果在SCL高电平时SDA线发生翻转,设备会认为是发生了起始或停止信号,就会对传输数据造成影响!


IIC写操作

  1. 主机发送开始信号,标志着一次传输的开始
  2. 发送从机地址。从机地址的倒数第二位为从机地址的额外扩展位,最后一位为从机地址的读写选择位。当R/W = 0表示主机往从机写数据(W),当R/W = 1表示主机从从机读数据(R)。因此写数据发送命令(0x78),读数据发送命令(0x79)。
  3. 应答信号。(每当完成一次数据的写入传输时,从机都会给主机发信号做出应答)
  4. 发送控制字节。控制字节的第一位Co,如果Co = 0,则接下来的信息传输将只包含数据;控制字节的第二位D/C,如果D/C = 0,接下来发送的数据字节将会被从机定义成指令;如果D/C = 1,接下来发送的数据字节会被从机定义成数据。因此写指令/地址(0x00);写数据(0x40)。
  5. 应答信号。(每当完成一次数据的写入传输时,从机都会给主机发信号做出应答)
  6. 地址字节(数据字节)
  7. 应答信号。(每当完成一次数据的写入传输时,从机都会给主机发信号做出应答)
  8. 主机发送停止信号,标志着一次传输结束。

oled屏幕

oled屏幕的初始化

  1. 对比度控制

根据描述可知:用两个字节来控制oled屏幕的对比度,从256个对比度中选一个(范围:0x00~0xFF 全灭到全亮)对比度将会随着值的增加而增加,复位值(0x7F)。

Oled_Write_Cmd(0x81);		//进入设置对比度控制
Oled_Write_Cmd(0xFF);		//此时写命令亮度256,全亮
  1. 设置正/逆显示

根据描述可知:

当命令为0xA6时,是正显示。即输入0的时候在屏幕上显示为灭,输入1的时候在屏幕上显示为亮;

当命令为0xA7时,是逆显示。即输入0的时候在屏幕上显示为亮,输入1的时候在屏幕上显示为灭。

Oled_Write_Cmd(0xA6);			//采用正显示
  1. 设置显示开/关

根据描述可知:

当命令是0xAE时,是关显示,此时处于睡眠模式;

当命令是0xAF时,是开显示,此时处于正常工作模式。

Oled_Write_Cmd(0xAF);			//开显示设置
  1. 设置寻址模式

现有三种寻址模式:页寻址模式、水平寻址模式、垂直寻址模式。

页寻址模式:

在页面寻址模式下,读写显示RAM后,列地址指针自动增加1。如果列地址指针到达列结束地址,则将列地址指针重置为列起始地址,而不对页地址指针进行更改。用户必须设置新的页面和列地址,才能访问下一页的RAM内容。(默认页寻址模式)

Oled_Write_Cmd(0x20);				//设置内存寻址模式
Oled_Write_Cmd(0x02);				//设置寻址模式为页寻址模式(默认)

水平寻址模式:

在水平寻址模式下,读写显示RAM后,列地址指针自动增加1。如果列地址指针到达列结束地址,页地址自动增加1。当列地址与页地址都到达尾部时,列地址和页地址都会自动重置。

Oled_Write_Cmd(0x20);				//设置内存寻址模式
Oled_Write_Cmd(0x00);				//设置寻址模式为水平寻址模式

垂直寻址模式:

在垂直寻址模式下,读写显示RAM后,页地址会自动增加1,如果页地址指针到达页结束地址,列地址会自动增加1。当页地址与列地址都到达尾部时,页地址和列地址都会自动重置。

Oled_Write_Cmd(0x20);				//设置内存寻址模式
Oled_Write_Cmd(0x01);				//设置寻址模式为垂直寻址模式
  1. 设置页起始地址

由图可见,oled屏幕可以显示128*64个像素点,垂直方向上将GDDRAM分为Page0-Page7,水平方向上分为SEG0-SEG127

根据描述可知:此命令是用来设置GDDRAM的页面起始地址,且仅适用于页寻址模式,用两个位来表示它的起始地址。

Oled_Write_Cmd(0xB0);				//设置Page0为页起始地址
  1. 设置列起始地址

根据描述可知:此命令是用来设置GDDRAM的低列起始地址,且仅适用于页寻址模式,用三个位来表示它的起始地址。

Oled_Write_Cmd(0x00);				//设置低列起始地址

根据描述可知:此命令是用来设置GDDRAM的高列起始地址,且仅适用于页寻址模式,用三个位来表示它的起始地址。

Oled_Write_Cmd(0x10);				//设置高列起始地址
  1. 设置行起始地址

根据描述可知:此命令是用来设置GDDRAM的行起始地址,使用五个位来显示0~63表示它的起始地址。

Oled_Write_Cmd(0x40);				//设置行起始地址
  1. 设置列定义

根据描述可知:此命令是用来定义SEG0是第0列还是第127列

当命令是0xA0时,第0列将被定义成SEG0;

当命令时0xA1时,第127列被定义成SEG0。

Oled_Write_Cmd(0xA1);			//定义SEG0为第127列
  1. 设置多路传输比率

Oled_Write_Cmd(0xA8);			//设置多路传输比率
  1. 设置行输出扫描方向

根据描述可知:此命令是用来设置行输出扫描方向

当命令是0xC0时,扫描方向时COM0-COM63

当命令时0xC8时,扫描方向时COM63-COM0

Oled_Write_Cmd(0xC8);			//设置扫描方向时COM63-COM0
  1. 设置显示偏移量

根据描述可知:此命令是用来设置显示偏移量,通过设置COM设置垂直位移,从0-63。

Oled_Write_Cmd(0xD3);			//设置显示偏移量
Oled_Write_Cmd(0x00);			//偏移量为0,不偏移
  1. 设置COM引脚配置

Oled_Write_Cmd(0xDA);			//设置列引脚硬件配置
Oled_Write_Cmd(0x12);			//顺序COM引脚配置,启用COM左/右重新映射
  1. 设置显示时钟分频因子/振荡器频率

Oled_Write_Cmd(0xD5);			//设置显示时钟分频因子/振荡器频率 	
Oled_Write_Cmd(0x80);			//设置分割比率,设置时钟为100帧/秒
  1. 设置预充电时间

Oled_Write_Cmd(0xD9);			//设置预充电时间
Oled_Write_Cmd(0xF1);			//设置预充电时间为15个时钟,放电为1个时钟
  1. 调整VCOMH调节器的输出

Oled_Write_Cmd(0xDB);			//调整VCOMH调节器的输出
Oled_Write_Cmd(0x30);			//0.83*Vcc
  1. 电荷泵设置

Oled_Write_Cmd(0x8D);			//电荷泵设置
Oled_Write_Cmd(0x14);			//在显示时使能电荷泵	

oled接线说明

我这里有7pin的oled屏幕和4pin的oled屏幕,oled本来是支持IIC协议、4-wire SPI、3-wire SPI,但4pin的只有4个引脚,所以不支持SPI协议。7pin的oled屏幕默认是4-wire SPI,需要将背面的电阻改到IIC,具体屏幕具体分析。

7pin:VCC-5V/3.3V GND-GND SCL-P1.0 SDA-P1.1 RES-P1.2 DC-GND CS-GND

4pin:VCC-5V/3.3V GND-GND SCL-P1.0 SDA-P1.1

7pin和4pin的oled屏幕不同之处是背面电阻、对RES复位引脚的处理


代码实现

oled显示字符

/*
	在Page0和Page5显示一条线,在Page2显示"We are family!"
	屏幕:7pin屏幕
*/
/*******main.c*******/

#include "oled.h"


void main()
{
	oled_RES_Init();					//7pin的oled屏幕要对RES引脚做处理
	Oled_Init();

	Oled_Write_Cmd(0x20);
	Oled_Write_Cmd(0x02);			//选择页寻址模式
	Oled_Clean();							//清屏
	
	Oled_Display_Line1();
	Oled_Show_String(2,7,"We are family!");
	Oled_Display_Line2();
	
	while(1);
}
/*****IIC.c*****/

#include "pin.h"
#include "intrins.h"


/*
		起始信号就是SCL处于高电平期间,SDA由高到低的过程,标志着一次数据传输的开始
*/
void IIC_Start()
{
	SCL = 0;
	SDA = 1;
	SCL = 1;
	_nop_();
	SDA = 0;
	_nop_();
}

/*
		结束信号就是SCL处于高电平期间,SDA由低到高的过程,标志着一次数据传输的结束
*/
void IIC_Stop()
{
	SCL = 0;
	SDA = 0;
	SCL = 1;
	_nop_();
	SDA = 1;
	_nop_();
}
/*
	应答信号是一个字节的数据传输完成后,也就是在第8个脉冲末第9个脉冲期间,从机对主机的响应信号,详情见博文
*/
char IIC_ACK()
{
	char flag;
	
	SDA = 1;
	_nop_();
	SCL = 1;
	_nop_();
	flag = SDA;
	_nop_();
	SCL = 0;
	_nop_();
	
	return flag;
}

void IIC_SendByte(char SendData)
{
	char i;
	
	for(i=0;i<8;i++)
	{
		SCL = 0;
		SDA = SendData & 0x80;
		_nop_();
		SCL = 1;
		_nop_();
		SCL = 0;
		_nop_();
		SendData = SendData << 1;
	}
}

/*
	这里的IIC_SendByte可以和IIC_ACK写到一起,也更方便理解,见下文
*/
/*bit IIC_SendByte(unsigned char SendData)
{
	bit flag;				//定义一个数来存放SDA的值,以判断从机是否对主机作出应答
	char i;
	
	for(i=0;i<8;i++)			//发送一组数据,8bit
	{
		SCL = 0;						//在传输数据之前,确保SCL处于低电平
		if(SendData & 0x80)		//每次发送数据的最高位
		{
			SDA = 1;
		}
		else
		{
			SDA = 0;			//发送的数据有0有1
		}
		_nop_();
		SCL = 1;
		_nop_();				//SCL拉高,传输数据,禁止SDA线上的电平发生翻转
		SCL = 0;
		_nop_();
		SendData = SendData << 1;			//每写入一个数据,左移一位,直道全部写入
	}
	SDA = 1;					
	_nop_();
	SCL = 1;
	_nop_();
	flag = SDA;
	SCL = 0;
	_nop_();			//在第8个周期末,第9个周期开始,主机将SDA释放,然后由从机通过拉低SDA线给主机一个						//应答信号,判断数据是否传输成功								
	return flag;
}*/
/*****oled.c*****/

#include "IIC.h"
#include "pin.h"
#include "intrins.h"
#include "oledFun.h"

unsigned char Init[] = {
	0xAE,0x00,0x10,0x40,0xB0,0x81,0xFF,0xA1,0xA6,0xA8,0x3F,0xC8,0xD3,
	0x00,0xD5,0x80,0xD8,0x05,0xD9,0xF1,0xDA,0x12,0xDB,0x30,0x8D,0x14,
	0xAF
};


void Oled_Write_Cmd(char cmd)
{
	IIC_Start();								//开始指令,标志着一次传输开始
	IIC_SendByte(0x78);							//发送从机地址
	IIC_ACK();									//从机给主机的应答信号
	IIC_SendByte(0x00);							//发送指令0x00
	IIC_ACK();									
	IIC_SendByte(cmd);							//发送指令
	IIC_ACK();
	IIC_Stop();									//结束指令,标志着一次传输结束
}

void Oled_Write_Data(char Data)
{
	IIC_Start();								//开始指令,标志着一次传输开始
	IIC_SendByte(0x78);							//发送从机地址
	IIC_ACK();									//从机给主机的应答信号
	IIC_SendByte(0x40);							//发送数据0x40
	IIC_ACK();									
	IIC_SendByte(Data);							//发送指令
	IIC_ACK();
	IIC_Stop();									//结束指令,标志着一次传输结束
}

void Oled_Init()				
{
	char i;
	
	for(i=0;i<28;i++)
	{
		Oled_Write_Cmd(Init[i]);
	}
}

void Oled_Clean()
{
	unsigned char i,j;
	
	for(i=0;i<8;i++)
	{
		Oled_Write_Cmd(0xB0 + i);				//从Page0开始写入
		Oled_Write_Cmd(0x00);
		Oled_Write_Cmd(0x10);					//因为列地址写入后自动偏移,所以让每一列从头写入
		for(j=0;j<128;j++)
		{
				Oled_Write_Data(0);				//给每一列,每一行都写入0
		}
	}
}

void Oled_Display_Line1()
{
	unsigned int i;
	
	Oled_Write_Cmd(0xB0);			//在Page0写入
	for(i=0;i<128;i++)
	{
		Oled_Write_Data(0x80);		//0x80相当于在Page0的第一列点亮了一个LED,也就是写入了一个点
									//当将Page0其余的127列都点亮一个点,也就形成了一条线
	}
}

void Oled_Display_Line2()
{
	unsigned int i;
	
	Oled_Write_Cmd(0xB5);			//在Page5写入
	for(i=0;i<128;i++)
	{
		Oled_Write_Data(0x80);		//0x80相当于在Page0的第一列点亮了一个LED,也就是写入了一个点
									//当将Page5其余的127列都点亮一个点,也就形成了一条线
	}
}

void Oled_Show_Byte(char rows,char columns,char oledByte)
{ 
	unsigned int i;
 
	//显示字符的上半部分
	Oled_Write_Cmd(0xb0+(rows*2-2));  //选择行
	//选择列                        
	Oled_Write_Cmd(0x00+(columns&0x0f));                          
	Oled_Write_Cmd(0x10+(columns>>4));      
	//显示数据                       
	for(i=((oledByte-32)*16);i<((oledByte-32)*16+8);i++){
		Oled_Write_Data(F8X16[i]);                            
	}
 
 	//显示字符的下半部分
	Oled_Write_Cmd(0xb0+(rows*2-1));  //选择行  
	//选择列                    
	Oled_Write_Cmd(0x00+(columns&0x0f));                          
	Oled_Write_Cmd(0x10+(columns>>4)); 
	//显示数据                           
	for(i=((oledByte-32)*16+8);i<((oledByte-32)*16+8+8);i++){
		Oled_Write_Data(F8X16[i]);                            
	}       
}
 
//OLED显示一个字符串
void Oled_Show_String(char rows,char columns,char *str)
{
	while(*str != '\0'){
		Oled_Show_Byte(rows,columns,*str);
		str++;
		columns += 8;   
	}       
}

void Delay200ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 2;
	j = 103;
	k = 147;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void oled_RES_Init()			//RES复位引脚
{
	RES = 0;
	Delay200ms();
	RES = 1;
}
/*****pin.h*****/

#include "reg52.h"

sbit SCL = P1^0;			//定义SCL时钟线为P0.1口
sbit SDA = P1^1;			//定义SDA数据线为P0.3口
sbit RES = P1^2;			//定义oled复位引脚为P0.2口

//DS/CS to GND
/******oledFun.h*****/

//OLED的字符构造点阵
const unsigned char code F8X16[]=
{
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0
  0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1
  0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2
  0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3
  0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4
  0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5
  0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 6
  0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 7
  0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8
  0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9
  0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 10
  0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 11
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14
  0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 15
  0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 16
  0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 17
  0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 18
  0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 19
  0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20
  0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21
  0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22
  0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23
  0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24
  0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25
  0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26
  0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27
  0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 28
  0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 29
  0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 30
  0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31
  0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 32
  0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33
  0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34
  0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35
  0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36
  0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37
  0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38
  0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39
  0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40
  0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41
  0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42
  0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43
  0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44
  0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45
  0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46
  0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47
  0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48
  0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49
  0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50
  0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51
  0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52
  0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53
  0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54
  0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55
  0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56
  0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57
  0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58
  0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59
  0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60
  0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61
  0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 63
  0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 64
  0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65
  0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66
  0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67
  0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68
  0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69
  0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70
  0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71
  0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72
  0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73
  0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74
  0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75
  0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76
  0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77
  0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78
  0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79
  0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80
  0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81
  0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82
  0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83
  0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84
  0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85
  0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86
  0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87
  0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88
  0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89
  0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90
  0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91
  0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92
  0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93
  0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94
  0x10,0x60,0x02,0x8C,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,
  0x04,0x04,0x7E,0x01,0x44,0x48,0x50,0x7F,0x40,0x40,0x7F,0x50,0x48,0x44,0x40,0x00,
  0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,
  0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00,
};

显示效果

oled


oled屏幕显示汉字

/*****main.c*****/

#include "oled.h"


void main()
{
	oled_RES_Init();					//7pin的oled屏幕要对RES引脚做处理
	Oled_Init();

	Oled_Write_Cmd(0x20);
	Oled_Write_Cmd(0x02);			//选择页寻址模式
	Oled_Clean();							//清屏
	
	Oled_Display_1();
	Oled_Display_2();
	
	while(1);
}
/*****oled.c*****/

#include "IIC.h"
#include "pin.h"
#include "intrins.h"

unsigned char Init[] = {
	0xAE,0x00,0x10,0x40,0xB0,0x81,0xFF,0xA1,0xA6,0xA8,0x3F,0xC8,0xD3,
	0x00,0xD5,0x80,0xD8,0x05,0xD9,0xF1,0xDA,0x12,0xDB,0x30,0x8D,0x14,
	0xAF
};

unsigned int code C1[] = {				//显示汉字上半部分
	0x00,0x00,0x80,0x60,0x18,0x00,0x00,0xFF,0x00,0x00,0x08,0x90,0x20,0xC0,0x00,0x00,
	0x40,0x40,0x42,0xCC,0x00,0x00,0xF1,0x16,0x10,0x10,0x18,0x14,0xF3,0x00,0x00,0x00,
	0x40,0x40,0x42,0xCC,0x00,0x00,0x20,0x24,0x24,0x24,0xFE,0x22,0x23,0x22,0x20,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x10,0x10,0x98,0xA4,0x47,0x44,0xA4,0x54,0x0C,0x04,0x00,0x00,0x00,0x00,
	0x80,0x60,0xF8,0x07,0x88,0x88,0xFF,0x88,0x88,0x20,0xD8,0x17,0x10,0xF0,0x10,0x00,
	0x04,0x04,0x74,0x54,0x54,0x54,0x54,0xFF,0x54,0x54,0x54,0x54,0x74,0x04,0x04,0x00,
	0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

unsigned int code C2[] = {				//显示汉字下半部分
	0x00,0x81,0x80,0x80,0x40,0x40,0x20,0x13,0x08,0x04,0x02,0x01,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x3F,0x90,0x48,0x21,0x19,0x07,0x01,0x3F,0x41,0x41,0x40,0x70,0x00,
	0x00,0x00,0x00,0x7F,0x20,0x10,0x00,0xFE,0x42,0x42,0x43,0x42,0x42,0xFE,0x00,0x00,
	0x00,0x00,0x58,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x81,0x89,0x89,0x44,0x44,0x4A,0x31,0x21,0x11,0x09,0x05,0x03,0x00,0x00,0x00,
	0x00,0x00,0xFF,0x00,0x3F,0x10,0x10,0x10,0x9F,0x40,0x37,0x08,0x36,0x41,0x80,0x00,
	0x04,0x04,0x15,0x15,0x15,0x55,0x95,0x7F,0x15,0x15,0x15,0x15,0x1F,0x04,0x04,0x00,
	0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

void Oled_Write_Cmd(char cmd)
{
	IIC_Start();								//开始指令,标志着一次传输开始
	IIC_SendByte(0x78);							//发送从机地址
	IIC_ACK();									//从机给主机的应答信号
	IIC_SendByte(0x00);							//发送指令0x00
	IIC_ACK();									
	IIC_SendByte(cmd);							//发送指令
	IIC_ACK();
	IIC_Stop();									//结束指令,标志着一次传输结束
}

void Oled_Write_Data(char Data)
{
	IIC_Start();								//开始指令,标志着一次传输开始
	IIC_SendByte(0x78);							//发送从机地址
	IIC_ACK();									//从机给主机的应答信号
	IIC_SendByte(0x40);							//发送数据0x40
	IIC_ACK();									
	IIC_SendByte(Data);							//发送指令
	IIC_ACK();
	IIC_Stop();									//结束指令,标志着一次传输结束
}

void Oled_Init()				
{
	char i;
	
	for(i=0;i<28;i++)
	{
		Oled_Write_Cmd(Init[i]);
	}
}

void Oled_Clean()
{
	unsigned char i,j;
	
	for(i=0;i<8;i++)
	{
		Oled_Write_Cmd(0xB0 + i);				//从Page0开始写入
		Oled_Write_Cmd(0x00);
		Oled_Write_Cmd(0x10);					//因为列地址写入后自动偏移,所以让每一列从头写入
		for(j=0;j<128;j++)
		{
				Oled_Write_Data(0);				//给每一列,每一行都写入0
		}
	}
}

void Oled_Display_1()
{
	unsigned char i;				//如果用char,它的空间就不够用,可能会导致乱码
	
	Oled_Write_Cmd(0xB1);			//在Page1写入数据
	Oled_Write_Cmd(0x00);
	Oled_Write_Cmd(0x10);			//让数据从第一列开始显示
	
	for(i=0;i<128;i++)
	{
		Oled_Write_Data(C1[i]);
	}
}

void Oled_Display_2()
{
	unsigned char i;
	
	Oled_Write_Cmd(0xB2);
	Oled_Write_Cmd(0x00);
	Oled_Write_Cmd(0x10);
	
	for(i=0;i<128;i++)
	{
		Oled_Write_Data(C2[i]);
	}
}

void Delay200ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 2;
	j = 103;
	k = 147;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void oled_RES_Init()
{
	RES = 0;
	Delay200ms();
	RES = 1;
}

显示效果:

oled_c


oled屏幕显示图片

/*****main.c*****/


#include "oled.h"
#include "display.h"
#include "BMP.h"


void main()
{
	RES_Init();
	Oled_Init();
	
	Oled_Write_Cmd(0x20);
	Oled_Write_Cmd(0x02);
	
	Oled_Clean();
	
	Diaplay_BMP(BMP);
	
	while(1);
}
/*****display.c*****/

#include "oled.h"


void Diaplay_BMP(unsigned char *BMP)
{
	unsigned char i;
	unsigned int j;			//此处定义注意越界
	
	for(i=0;i<8;i++)
	{
		Oled_Write_Cmd(0xB0 + i);			//从Page0开始写入
		Oled_Write_Cmd(0x00);
		Oled_Write_Cmd(0x10);
		for(j=128*i;j<128*(i+1);j++)		//i=0时,从0开始写;当i=1时,从第128开始写,依此类推
		{
			Oled_Write_Data(BMP[j]);
		}
	}
}
/*****BMP.h*****/

unsigned char code BMP[]=
{
0x00,0x06,0x0A,0xFE,0x0A,0xC6,0x00,0xE0,0x00,0xF0,0x00,0xF8,0x00,0x00,0x00,0x00,
0x00,0x00,0xFE,0x7D,0xBB,0xC7,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xC7,0xBB,0x7D,
0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
0x0C,0xFE,0xFE,0x0C,0x08,0x20,0x60,0xFE,0xFE,0x60,0x20,0x00,0x00,0x00,0x78,0x48,
0xFE,0x82,0xBA,0xBA,0x82,0xBA,0xBA,0x82,0xBA,0xBA,0x82,0xBA,0xBA,0x82,0xFE,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,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,
0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0xFF,0xFF,0x00,0x00,0xFE,0xFF,0x03,
0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0xFF,0xFE,0x00,0x00,0x00,0x00,0xC0,0xC0,
0xC0,0x00,0x00,0x00,0x00,0xFE,0xFF,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,
0xFF,0xFE,0x00,0x00,0xFE,0xFF,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0xFF,
0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,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,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x0C,
0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0xFF,0xFF,0x00,0x00,0x00,0x00,0xE1,0xE1,
0xE1,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,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,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x1F,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0x0F,0x00,0x00,0x0F,0x1F,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x0F,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x1F,0x0F,0x00,0x00,0x0F,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,
0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xE2,0x92,0x8A,0x86,0x00,0x00,0x7C,0x82,0x82,0x82,0x7C,
0x00,0xFE,0x00,0x82,0x92,0xAA,0xC6,0x00,0x00,0xC0,0xC0,0x00,0x7C,0x82,0x82,0x82,
0x7C,0x00,0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0xC0,0xC0,0x00,0x7C,0x82,0x82,0x82,
0x7C,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x24,0xA4,0x2E,0x24,0xE4,0x24,0x2E,0xA4,0x24,0x00,0x00,0x00,0xF8,0x4A,0x4C,
0x48,0xF8,0x48,0x4C,0x4A,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,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,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,0x20,0x10,0x10,
0x10,0x10,0x20,0xC0,0x00,0x00,0xC0,0x20,0x10,0x10,0x10,0x10,0x20,0xC0,0x00,0x00,
0x00,0x12,0x0A,0x07,0x02,0x7F,0x02,0x07,0x0A,0x12,0x00,0x00,0x00,0x0B,0x0A,0x0A,
0x0A,0x7F,0x0A,0x0A,0x0A,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x40,0x40,
0x40,0x50,0x20,0x5F,0x80,0x00,0x1F,0x20,0x40,0x40,0x40,0x50,0x20,0x5F,0x80,0x00,
};

显示效果:

oled_b


oled显示温湿度

/*****main.c*****/

#include "DHT11.h"
#include "delay.h"
#include "uart.h"
#include "LCD1602.h"
#include "oled.h"

extern char Humi[9];			//定义湿度数组用来存放湿度的整数位和小数位
extern char Temp[9];			//定义温度数组用来存放温度的整数位和小数位

void main()
{
	UART_Init();
	LCD1602_Init();
	oled_RES_Init();
	Oled_Init();
	Oled_Clean();
	Delay1000ms();
	
	while(1)
	{
		Read_Data();
		Delay1000ms();
		
		Build_Data();		//构造发送到LCD1602的数据
		
		SendString(Humi);		//将湿度数据发送LCD1602上
		SendString("\r\n");
		SendString(Temp);		//将温度数据发送LCD1602上
		SendString("\r\n");
		
		LCD1602_ShowLine(1,4,Humi);		
		LCD1602_ShowLine(2,4,Temp);

		Oled_Show_String(1,1,Humi);
		Oled_Show_String(2,1,Temp);
	}
}
/*****oled.c*****/

#include "IIC.h"
#include "oledFun.h"
#include "pin.h"
#include "intrins.h"

void Oled_Write_Cmd(char cmd)
{
	IIC_Start();						//起始信号
	IIC_SendByte(0x78);			//发送从机地址
	IIC_ACK();							//应答信号
	IIC_SendByte(0x00);			//写命令0x00
	IIC_ACK();							//应答信号
	IIC_SendByte(cmd);			//发送命令
	IIC_ACK();							//应答信号
	IIC_Stop();							//停止信号
}

void Oled_Write_Data(char Data)
{
	IIC_Start();						//起始信号
	IIC_SendByte(0x78);			//发送从机地址
	IIC_ACK();							//应答信号
	IIC_SendByte(0x40);			//写数据0x40
	IIC_ACK();							//应答信号
	IIC_SendByte(Data);			//发送命令
	IIC_ACK();							//应答信号
	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 Delay200ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 2;
	j = 103;
	k = 147;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void Oled_Clean()
{
	unsigned char i,j;		//用char会造成越界-128 - 127
	
	for(i=0;i<8;i++)
	{
		Oled_Write_Cmd(0xB0 + i);		//Page 0 
		Oled_Write_Cmd(0x00);
		Oled_Write_Cmd(0x10);		//第0列到第127列,写入数据后,列地址会自动偏移
		for(j=0;j<128;j++)
		{
			Oled_Write_Data(0);		//Page 0 -Page 7,第0列到第127列都写入0清屏
		}
	}
}

void Oled_Show_Byte(char rows,char columns,char oledByte)
{ 
	unsigned int i;
 
	//显示字符的上半部分
	Oled_Write_Cmd(0xb0+(rows*2-2));  //选择行
	//选择列                        
	Oled_Write_Cmd(0x00+(columns&0x0f));                          
	Oled_Write_Cmd(0x10+(columns>>4));      
	//显示数据                       
	for(i=((oledByte-32)*16);i<((oledByte-32)*16+8);i++){
		Oled_Write_Data(F8X16[i]);                            
	}
 
 	//显示字符的下半部分
	Oled_Write_Cmd(0xb0+(rows*2-1));  //选择行  
	//选择列                    
	Oled_Write_Cmd(0x00+(columns&0x0f));                          
	Oled_Write_Cmd(0x10+(columns>>4)); 
	//显示数据                           
	for(i=((oledByte-32)*16+8);i<((oledByte-32)*16+8+8);i++){
		Oled_Write_Data(F8X16[i]);                            
	}       
}
 
//OLED显示一个字符串
void Oled_Show_String(char rows,char columns,char *str)
{
	while(*str != '\0'){
		Oled_Show_Byte(rows,columns,*str);
		str++;
		columns += 8;   
	}       
}

void oled_RES_Init()
{
	RES = 0;
	Delay200ms();
	RES = 1;
}
/*****pin.h*****/

#include "reg52.h"

sfr AUXR = 0x8E;

sbit SCL = P1^0;
sbit SDA = P1^1;				//oled模块引脚

sbit RES = P1^2;
sbit DHT = P1^3;

显示效果:

oled_t


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日落星野

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值