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协议的时序
- 空闲状态
在I2 C器件开始通信(传输数据)之前,串行时钟线 SCL 和串行数据线 SDA 线由于接到上拉电阻的原因处于高电平状态,此时 I2 C总线处于空闲状态。
- 起始信号
在SCL保持高电平期间,SDA的电平被拉低,称为I2 C总线总线的起始信号,标志着一次数据传输开始。起始信号由主机主动建立的,在建立该信号之前I2 C总线必须处于空闲状态。
- 停止信号
在SCL保持高电平期间,SDA被释放,返回高电平,称为I2 C总线的停止信号,标志着一次数据传输的终止。停止信号由主机主动建立的,建立该信号之后,I2 C总线将返回空闲状态。
- 数据传输
在I2 C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在 SDA上逐位地串行传送每一位数据。进行数据传送时,在 SCL 的高电平期间,SDA上的电平必须保持稳定,只有在SCL为低电平期间,才允许 SDA上的电平改变状态。即数据在SCL的上升沿到来之前就必须准备好,并在在下降沿到来之前必须保持稳定。在经过8个时钟周期后,传输了8bit数据,即一个字节。
- 应答信号
第8个时钟周期末,主机释放 SDA 以使从机应答,在第 9 个时钟周期,从机将 SDA 拉低以应答;如果第 9 个时钟周期,SCL 为高电平时,SDA 未被检测到为低电平,视为非应答,表明此次数据传输失败。第 9 个时钟周期末,从机释放 SDA 以使主机继续传输数据,如果主机发送停止信号,此次传输结束。需要注意的是数据以 8bit 即一个字节为单位串行发出,其最先发送的是字节的最高位。
需要注意的是:在数据传输的过程中,只有当SCL为低电平时,才允许SDA线上的电平发生翻转!如果在SCL高电平时SDA线发生翻转,设备会认为是发生了起始或停止信号,就会对传输数据造成影响!
IIC写操作
- 主机发送开始信号,标志着一次传输的开始
- 发送从机地址。从机地址的倒数第二位为从机地址的额外扩展位,最后一位为从机地址的读写选择位。当R/W = 0表示主机往从机写数据(W),当R/W = 1表示主机从从机读数据(R)。因此写数据发送命令(0x78),读数据发送命令(0x79)。
- 应答信号。(每当完成一次数据的写入传输时,从机都会给主机发信号做出应答)
- 发送控制字节。控制字节的第一位Co,如果Co = 0,则接下来的信息传输将只包含数据;控制字节的第二位D/C,如果D/C = 0,接下来发送的数据字节将会被从机定义成指令;如果D/C = 1,接下来发送的数据字节会被从机定义成数据。因此写指令/地址(0x00);写数据(0x40)。
- 应答信号。(每当完成一次数据的写入传输时,从机都会给主机发信号做出应答)
- 地址字节(数据字节)
- 应答信号。(每当完成一次数据的写入传输时,从机都会给主机发信号做出应答)
- 主机发送停止信号,标志着一次传输结束。
oled屏幕
oled屏幕的初始化
- 对比度控制
根据描述可知:用两个字节来控制oled屏幕的对比度,从256个对比度中选一个(范围:0x00~0xFF 全灭到全亮)对比度将会随着值的增加而增加,复位值(0x7F)。
Oled_Write_Cmd(0x81); //进入设置对比度控制
Oled_Write_Cmd(0xFF); //此时写命令亮度256,全亮
- 设置正/逆显示
根据描述可知:
当命令为0xA6时,是正显示。即输入0的时候在屏幕上显示为灭,输入1的时候在屏幕上显示为亮;
当命令为0xA7时,是逆显示。即输入0的时候在屏幕上显示为亮,输入1的时候在屏幕上显示为灭。
Oled_Write_Cmd(0xA6); //采用正显示
- 设置显示开/关
根据描述可知:
当命令是0xAE时,是关显示,此时处于睡眠模式;
当命令是0xAF时,是开显示,此时处于正常工作模式。
Oled_Write_Cmd(0xAF); //开显示设置
- 设置寻址模式
现有三种寻址模式:页寻址模式、水平寻址模式、垂直寻址模式。
页寻址模式:
在页面寻址模式下,读写显示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); //设置寻址模式为垂直寻址模式
- 设置页起始地址
由图可见,oled屏幕可以显示128*64个像素点,垂直方向上将GDDRAM分为Page0-Page7,水平方向上分为SEG0-SEG127
根据描述可知:此命令是用来设置GDDRAM的页面起始地址,且仅适用于页寻址模式,用两个位来表示它的起始地址。
Oled_Write_Cmd(0xB0); //设置Page0为页起始地址
- 设置列起始地址
根据描述可知:此命令是用来设置GDDRAM的低列起始地址,且仅适用于页寻址模式,用三个位来表示它的起始地址。
Oled_Write_Cmd(0x00); //设置低列起始地址
根据描述可知:此命令是用来设置GDDRAM的高列起始地址,且仅适用于页寻址模式,用三个位来表示它的起始地址。
Oled_Write_Cmd(0x10); //设置高列起始地址
- 设置行起始地址
根据描述可知:此命令是用来设置GDDRAM的行起始地址,使用五个位来显示0~63表示它的起始地址。
Oled_Write_Cmd(0x40); //设置行起始地址
- 设置列定义
根据描述可知:此命令是用来定义SEG0是第0列还是第127列
当命令是0xA0时,第0列将被定义成SEG0;
当命令时0xA1时,第127列被定义成SEG0。
Oled_Write_Cmd(0xA1); //定义SEG0为第127列
- 设置多路传输比率
Oled_Write_Cmd(0xA8); //设置多路传输比率
- 设置行输出扫描方向
根据描述可知:此命令是用来设置行输出扫描方向
当命令是0xC0时,扫描方向时COM0-COM63
当命令时0xC8时,扫描方向时COM63-COM0
Oled_Write_Cmd(0xC8); //设置扫描方向时COM63-COM0
- 设置显示偏移量
根据描述可知:此命令是用来设置显示偏移量,通过设置COM设置垂直位移,从0-63。
Oled_Write_Cmd(0xD3); //设置显示偏移量
Oled_Write_Cmd(0x00); //偏移量为0,不偏移
- 设置COM引脚配置
Oled_Write_Cmd(0xDA); //设置列引脚硬件配置
Oled_Write_Cmd(0x12); //顺序COM引脚配置,启用COM左/右重新映射
- 设置显示时钟分频因子/振荡器频率
Oled_Write_Cmd(0xD5); //设置显示时钟分频因子/振荡器频率
Oled_Write_Cmd(0x80); //设置分割比率,设置时钟为100帧/秒
- 设置预充电时间
Oled_Write_Cmd(0xD9); //设置预充电时间
Oled_Write_Cmd(0xF1); //设置预充电时间为15个时钟,放电为1个时钟
- 调整VCOMH调节器的输出
Oled_Write_Cmd(0xDB); //调整VCOMH调节器的输出
Oled_Write_Cmd(0x30); //0.83*Vcc
- 电荷泵设置
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