目录
一、IIC协议概述
二、IIC协议起始和终止信号
三、应答信号
四、数据发送的时序
五、OLED写入指令和数据
六、OLED显示一个点的思路
七、OLED显示一个点的代码
八、OLED列地址
九、OLED显示图片
一、IIC协议概述
1、IIC概述
IIC(集成电路总线)是由飞利浦公司发明的通讯总线,用于连接微控制器及其外围设备,IIC属于半双工同步通信方式
IIC的数据线只有一根,就是SDA,同一时间不管发送还是接收,只能有一个方向进行操作
2、特点
(1)简单性和有效性
IIC的最大传输速率是10kbps(面试考点)
串口的最大传输速率是20kbps
(2)多主控
其中任何能够进行发送和接收的设备都可以成为主总线,一个主控能够控制信号的传输和时钟频率,当然,在任何时间点上只能有一个主控
3、构成
IIC串行总线一般有两根信号线,一根是双向的数据SDA,另一根是时钟线SCL,其中时钟信号是由主控器件产生,所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上,对于并联在一条总线上的每个IC都有唯一的地址
二、IIC协议起始和终止信号
1、IIC屏幕
2、IIC屏幕与C51单片机的连接方式
IIC 单片机
GND GND
VCC 5V
SCL 能正常收发数据的引脚(如P0^1)
SDA 能正常收发数据的引脚(如P0^3)
3、IIC总线在传输数据的过程中一共有三种类型信号,分别为:开始信号、结束信号和应答信号
(1)起始信号、终止信号
起始、终止信号时序逻辑分析
起始信号:SDA信号从高电平下降到低电平
终止信号:SDA信号从低电平上升到高电平
起始信号时序逻辑分析 终止信号时序逻辑分析
SCL = 1; SCL = 1;
SDA = 1; SDA = 0;
延时4.7μs 延时4μs
SDA = 0; SDA = 1;
延时4μs 延时4.7μs
三、应答信号
发送器每发送一个字节(8个bit),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号
应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节
应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功
应答信号时序逻辑分析及函数封装
char IIC_ACK(){
char flag;
sda = 1; //释放数据线
_nop_();
scl = 1; //高电平的状态
_nop_();
flag = sda; //读取应答信号,若读取的信号为低电平时,说明是有效应答信号
_nop_();
scl = 0; //低电平的状态
_nop_();
return flag;
}
四、数据发送的时序
当SCL = 1(高电平)时,进行数据传送,并且这时数据不允许翻转
当SCL = 0(低电平)时,数据允许翻转
发送字节的函数封装
void IIC_Send_Byte(char dataSend){ //发送字节的函数
int i;
for(i=0;i<8;i++){ //发送的一个字节等于8个bit,所以要循环8次
scl = 0; //scl拉低,让sda做好数据准备
sda = dataSend & 0x80; //0x80 = 1000 0000 获得dataSend的最高位,给sda
_nop_(); //发送数据建立时间
scl = 1; //scl拉高进行数据传输
_nop_(); //数据发送的时间
scl = 0; //数据发送完毕,scl拉低
_nop_();
dataSend = dataSend << 1; //每发送完一个数据,dataSend的数据就向左移动一位
}
}
五、OLED写入指令和数据
写命令/数据的代码
1、start()
2、写入 b0111 1000 0x78
3、ACK
4、Control byte:(0)(0) 000000写入命令 (0)(1) 000000写入数据
5、ACK
6、写入指令/数据
7、ACK
8、stop
六、OLED显示一个点的思路
1、如何显示一个点
有三种方式:分别为页地址模式、水平地址模式和垂直地址模式,可以通过下表格进行配置
下面重点说一下页地址模式:
页地址模式也是默认配置的地址模式
选择页地址模式的配置命令:
1、发送cmd:0x20;
2、发送cmd:0x02;
2、详细的思路如下:
1、初始化
2、显示位置
Oled_Write_Cmd(0x20); //选择一个位置,确认页寻址地址
Oled_Write_Cmd(0x02); //选择一个位置,确认页寻址地址
Oled_Write_Cmd(0xB0); //选择PAGE03、显示内容
Oled_Write_Data(0x08); //显示一个点
3、编写初始化OLED函数
void Oled_Init(void){ //初始化OLED函数
Oled_Write_Cmd(0xAE);
Oled_Write_Cmd(0x00);
Oled_Write_Cmd(0x10);
Oled_Write_Cmd(0x40);
Oled_Write_Cmd(0xB0);
Oled_Write_Cmd(0x81);
Oled_Write_Cmd(0xFF);
Oled_Write_Cmd(0xA1);
Oled_Write_Cmd(0xA6);
Oled_Write_Cmd(0xA8);
Oled_Write_Cmd(0x3F);
Oled_Write_Cmd(0xC8);
Oled_Write_Cmd(0xD3);
Oled_Write_Cmd(0x00);
Oled_Write_Cmd(0xD5);
Oled_Write_Cmd(0x80);
Oled_Write_Cmd(0xD8);
Oled_Write_Cmd(0x05);
Oled_Write_Cmd(0xD9);
Oled_Write_Cmd(0xF1);
Oled_Write_Cmd(0xDA);
Oled_Write_Cmd(0x12);
Oled_Write_Cmd(0xDB);
Oled_Write_Cmd(0x30);
Oled_Write_Cmd(0x8D);
Oled_Write_Cmd(0x14);
Oled_Write_Cmd(0xAF);
}
七、OLED显示一个点的代码
1、清屏函数代码
void Oled_Clear() //清屏函数
{
int i, j;
for(i=0;i<8;i++)
{
Oled_Write_Cmd(0xB0+i);//page0--page7
//每个page从0列
Oled_Write_Cmd(0x00);
Oled_Write_Cmd(0x10);
//一共有128列,0~127
for(j=0;j<128;j++)
{
Oled_Write_Data(0);
}
}
}
2、 OLED显示一个点的代码
#include "reg52.h"
#include "intrins.h"
sbit scl = P0^1;
sbit sda = P0^3;
void IIC_Start(){ //起始信号函数
scl = 0; //防止雪花
scl = 1;
sda = 1;
_nop_(); //延时5μs
sda = 0;
_nop_();
}
void IIC_Stop(){ //终止信号函数
scl = 0; //防止雪花
scl = 1;
sda = 0;
_nop_();
sda = 1;
_nop_();
}
char IIC_ACK(){ //应答信号函数
char flag;
sda = 1; //释放数据线
_nop_();
scl = 1; //高电平的状态
_nop_();
flag = sda; //读取应答信号,若读取的信号为低电平时,说明是有效应答信号
_nop_();
scl = 0; //低电平的状态
_nop_();
return flag;
}
void IIC_Send_Byte(char dataSend){ //发送字节的函数
int i;
for(i=0;i<8;i++){ //发送的一个字节等于8个bit,所以要循环8次
scl = 0; //scl拉低,让sda做好数据准备
sda = dataSend & 0x80; //0x80 = 1000 0000 获得dataSend的最高位,给sda
_nop_(); //发送数据建立时间
scl = 1; //scl拉高进行数据传输
_nop_(); //数据发送的时间
scl = 0; //数据发送完毕,scl拉低
_nop_();
dataSend = dataSend << 1; //每发送完一个数据,dataSend的数据就向左移动一位
}
}
void Oled_Write_Cmd(char dataCmd){ //OLED写入指令函数
IIC_Start(); //开始信号函数
IIC_Send_Byte(0x78); //写入从机地址
IIC_ACK(); //应答信号函数
IIC_Send_Byte(0x00); //发送一个写命令的信号
IIC_ACK(); //应答信号函数
IIC_Send_Byte(dataCmd); //开始写入指令
IIC_ACK();
IIC_Stop(); //终止信号函数
}
void Oled_Write_Data(char dataData){ //OLED写入数据函数
IIC_Start(); //开始信号函数
IIC_Send_Byte(0x78); //写入从机地址
IIC_ACK(); //应答信号函数
IIC_Send_Byte(0x40); //发送一个写数据的信号
IIC_ACK(); //应答信号函数
IIC_Send_Byte(dataData); //开始写入数据
IIC_ACK();
IIC_Stop(); //终止信号函数
}
void Oled_Init(void){ //初始化OLED函数
Oled_Write_Cmd(0xAE);
Oled_Write_Cmd(0x00);
Oled_Write_Cmd(0x10);
Oled_Write_Cmd(0x40);
Oled_Write_Cmd(0xB0);
Oled_Write_Cmd(0x81);
Oled_Write_Cmd(0xFF);
Oled_Write_Cmd(0xA1);
Oled_Write_Cmd(0xA6);
Oled_Write_Cmd(0xA8);
Oled_Write_Cmd(0x3F);
Oled_Write_Cmd(0xC8);
Oled_Write_Cmd(0xD3);
Oled_Write_Cmd(0x00);
Oled_Write_Cmd(0xD5);
Oled_Write_Cmd(0x80);
Oled_Write_Cmd(0xD8);
Oled_Write_Cmd(0x05);
Oled_Write_Cmd(0xD9);
Oled_Write_Cmd(0xF1);
Oled_Write_Cmd(0xDA);
Oled_Write_Cmd(0x12);
Oled_Write_Cmd(0xDB);
Oled_Write_Cmd(0x30);
Oled_Write_Cmd(0x8D);
Oled_Write_Cmd(0x14);
Oled_Write_Cmd(0xAF);
}
void Oled_Clear() //清屏代码
{
int i, j;
for(i=0;i<8;i++)
{
Oled_Write_Cmd(0xB0+i);//page0--page7
//每个page从0列
Oled_Write_Cmd(0x00);
Oled_Write_Cmd(0x10);
//一共有128列,0~127
for(j=0;j<128;j++)
{
Oled_Write_Data(0);
}
}
}
void main()
{
Oled_Clear();
Oled_Init(); //初始化OLED
Oled_Write_Cmd(0x20); //选择一个位置,确认页寻址地址
Oled_Write_Cmd(0x02);
Oled_Write_Cmd(0xB0); //选择PAGE0,可以配置8次,分别是B0-B7
Oled_Write_Data(0x08); //显示一个点
while(1); //防止程序退出
}
执行结果:
八、OLED列地址
1、指定列的初始地址
Oled_Write_Cmd(0x00);
Oled_Write_Cmd(0x10);
2、编写代码——实现多行的点都从头开始显示
#include "reg52.h"
#include "intrins.h"
sbit scl = P0^1;
sbit sda = P0^3;
void IIC_Start(){ //起始信号函数
scl = 0; //防止雪花
scl = 1;
sda = 1;
_nop_(); //延时5μs
sda = 0;
_nop_();
}
void IIC_Stop(){ //终止信号函数
scl = 0; //防止雪花
scl = 1;
sda = 0;
_nop_();
sda = 1;
_nop_();
}
char IIC_ACK(){ //应答信号函数
char flag;
sda = 1; //释放数据线
_nop_();
scl = 1; //高电平的状态
_nop_();
flag = sda; //读取应答信号,若读取的信号为低电平时,说明是有效应答信号
_nop_();
scl = 0; //低电平的状态
_nop_();
return flag;
}
void IIC_Send_Byte(char dataSend){ //发送字节的函数
int i;
for(i=0;i<8;i++){ //发送的一个字节等于8个bit,所以要循环8次
scl = 0; //scl拉低,让sda做好数据准备
sda = dataSend & 0x80; //0x80 = 1000 0000 获得dataSend的最高位,给sda
_nop_(); //发送数据建立时间
scl = 1; //scl拉高进行数据传输
_nop_(); //数据发送的时间
scl = 0; //数据发送完毕,scl拉低
_nop_();
dataSend = dataSend << 1; //每发送完一个数据,dataSend的数据就向左移动一位
}
}
void Oled_Write_Cmd(char dataCmd){ //OLED写入指令函数
IIC_Start(); //开始信号函数
IIC_Send_Byte(0x78); //写入从机地址
IIC_ACK(); //应答信号函数
IIC_Send_Byte(0x00); //发送一个写命令的信号
IIC_ACK(); //应答信号函数
IIC_Send_Byte(dataCmd); //开始写入指令
IIC_ACK();
IIC_Stop(); //终止信号函数
}
void Oled_Write_Data(char dataData){ //OLED写入数据函数
IIC_Start(); //开始信号函数
IIC_Send_Byte(0x78); //写入从机地址
IIC_ACK(); //应答信号函数
IIC_Send_Byte(0x40); //发送一个写数据的信号
IIC_ACK(); //应答信号函数
IIC_Send_Byte(dataData); //开始写入数据
IIC_ACK();
IIC_Stop(); //终止信号函数
}
void Oled_Init(void){ //初始化OLED函数
Oled_Write_Cmd(0xAE);
Oled_Write_Cmd(0x00);
Oled_Write_Cmd(0x10);
Oled_Write_Cmd(0x40);
Oled_Write_Cmd(0xB0);
Oled_Write_Cmd(0x81);
Oled_Write_Cmd(0xFF);
Oled_Write_Cmd(0xA1);
Oled_Write_Cmd(0xA6);
Oled_Write_Cmd(0xA8);
Oled_Write_Cmd(0x3F);
Oled_Write_Cmd(0xC8);
Oled_Write_Cmd(0xD3);
Oled_Write_Cmd(0x00);
Oled_Write_Cmd(0xD5);
Oled_Write_Cmd(0x80);
Oled_Write_Cmd(0xD8);
Oled_Write_Cmd(0x05);
Oled_Write_Cmd(0xD9);
Oled_Write_Cmd(0xF1);
Oled_Write_Cmd(0xDA);
Oled_Write_Cmd(0x12);
Oled_Write_Cmd(0xDB);
Oled_Write_Cmd(0x30);
Oled_Write_Cmd(0x8D);
Oled_Write_Cmd(0x14);
Oled_Write_Cmd(0xAF);
}
void Oled_Clear() //清屏函数
{
int i, j;
for(i=0;i<8;i++)
{
Oled_Write_Cmd(0xB0+i);//page0--page7
//每个page从0列
Oled_Write_Cmd(0x00);
Oled_Write_Cmd(0x10);
//一共有128列,0~127
for(j=0;j<128;j++)
{
Oled_Write_Data(0);
}
}
}
void main()
{
Oled_Clear(); //调用清屏函数
Oled_Init(); //初始化OLED
Oled_Write_Cmd(0x20); //选择一个位置,确认页寻址地址
Oled_Write_Cmd(0x02);
Oled_Write_Cmd(0xB0); //选择PAGE0,可以配置8次,分别是B0-B7
Oled_Write_Data(0x08); //显示一个点
Oled_Write_Data(0x08);
Oled_Write_Data(0x08);
Oled_Write_Data(0x08);
Oled_Write_Data(0x08);
Oled_Write_Cmd(0xB5);
Oled_Write_Cmd(0x00); //指定列的初始地址
Oled_Write_Cmd(0x10);
Oled_Write_Data(0x08);
Oled_Write_Data(0x08);
Oled_Write_Data(0x08);
Oled_Write_Data(0x08);
Oled_Write_Data(0x08);
Oled_Write_Data(0x08);
Oled_Write_Data(0x08);
Oled_Write_Data(0x08);
Oled_Write_Cmd(0xB6);
Oled_Write_Cmd(0x00); //指定列的初始值
Oled_Write_Cmd(0x10);
Oled_Write_Data(0x08);
Oled_Write_Data(0x08);
Oled_Write_Data(0x08);
Oled_Write_Data(0x08);
Oled_Write_Data(0x08);
Oled_Write_Cmd(0x0f);
Oled_Write_Cmd(0x17);
Oled_Write_Data(0x08);
while(1); //防止程序退出
}
3、执行结果:
九、OLED显示图片
1、先用画图板画一张图片,图片要求如下:
图片的像素要求:128x64
保存的图片格式为:单色位图(bmp)格式
2、打开字模软件——点阵液晶取模.EXE
3、进行字体设置:点击参数设置,然后点击文字输入区字体选择
4、设置其他选项:勾选纵向取模、字节倒序、保留、任何时候都加0
5、回到基本操作界面,点击打开图像图标,把画图板画的那张图片打开放进去
6、获取图像的参数数据:在取模方式中,选择C51格式,查看下方生成了此图片的点阵图
7、把上述的图片点阵图数据复制到代码中,用一个函数封装起来,总体代码如下:
#include "reg52.h"
#include "intrins.h"
sbit scl = P0^1;
sbit sda = P0^3;
void IIC_Start(){ //起始信号函数
scl = 0; //防止雪花
scl = 1;
sda = 1;
_nop_(); //延时5μs
sda = 0;
_nop_();
}
void IIC_Stop(){ //终止信号函数
scl = 0; //防止雪花
scl = 1;
sda = 0;
_nop_();
sda = 1;
_nop_();
}
char IIC_ACK(){ //应答信号函数
char flag;
sda = 1; //释放数据线
_nop_();
scl = 1; //高电平的状态
_nop_();
flag = sda; //读取应答信号,若读取的信号为低电平时,说明是有效应答信号
_nop_();
scl = 0; //低电平的状态
_nop_();
return flag;
}
void IIC_Send_Byte(char dataSend){ //发送字节的函数
int i;
for(i=0;i<8;i++){ //发送的一个字节等于8个bit,所以要循环8次
scl = 0; //scl拉低,让sda做好数据准备
sda = dataSend & 0x80; //0x80 = 1000 0000 获得dataSend的最高位,给sda
_nop_(); //发送数据建立时间
scl = 1; //scl拉高进行数据传输
_nop_(); //数据发送的时间
scl = 0; //数据发送完毕,scl拉低
_nop_();
dataSend = dataSend << 1; //每发送完一个数据,dataSend的数据就向左移动一位
}
}
void Oled_Write_Cmd(char dataCmd){ //OLED写入指令函数
IIC_Start(); //开始信号函数
IIC_Send_Byte(0x78); //写入从机地址
IIC_ACK(); //应答信号函数
IIC_Send_Byte(0x00); //发送一个写命令的信号
IIC_ACK(); //应答信号函数
IIC_Send_Byte(dataCmd); //开始写入指令
IIC_ACK();
IIC_Stop(); //终止信号函数
}
void Oled_Write_Data(char dataData){ //OLED写入数据函数
IIC_Start(); //开始信号函数
IIC_Send_Byte(0x78); //写入从机地址
IIC_ACK(); //应答信号函数
IIC_Send_Byte(0x40); //发送一个写数据的信号
IIC_ACK(); //应答信号函数
IIC_Send_Byte(dataData); //开始写入数据
IIC_ACK();
IIC_Stop(); //终止信号函数
}
void Oled_Init(void){ //初始化OLED函数
Oled_Write_Cmd(0xAE);
Oled_Write_Cmd(0x00);
Oled_Write_Cmd(0x10);
Oled_Write_Cmd(0x40);
Oled_Write_Cmd(0xB0);
Oled_Write_Cmd(0x81);
Oled_Write_Cmd(0xFF);
Oled_Write_Cmd(0xA1);
Oled_Write_Cmd(0xA6);
Oled_Write_Cmd(0xA8);
Oled_Write_Cmd(0x3F);
Oled_Write_Cmd(0xC8);
Oled_Write_Cmd(0xD3);
Oled_Write_Cmd(0x00);
Oled_Write_Cmd(0xD5);
Oled_Write_Cmd(0x80);
Oled_Write_Cmd(0xD8);
Oled_Write_Cmd(0x05);
Oled_Write_Cmd(0xD9);
Oled_Write_Cmd(0xF1);
Oled_Write_Cmd(0xDA);
Oled_Write_Cmd(0x12);
Oled_Write_Cmd(0xDB);
Oled_Write_Cmd(0x30);
Oled_Write_Cmd(0x8D);
Oled_Write_Cmd(0x14);
Oled_Write_Cmd(0xAF);
}
void Oled_Clear() //清屏函数
{
int i, j;
for(i=0;i<8;i++)
{
Oled_Write_Cmd(0xB0+i);//page0--page7
//每个page从0列
Oled_Write_Cmd(0x00);
Oled_Write_Cmd(0x10);
//一共有128列,0~127
for(j=0;j<128;j++)
{
Oled_Write_Data(0);
}
}
}
/*-- 宽度x高度=128x64 --*/
code unsigned char bmpImager[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0xFC,0xFC,0xF8,0x00,0x80,0x80,0x80,0x80,0x80,
0x00,0x00,0x00,0xF0,0xF0,0xF8,0x78,0x7C,0x3C,0x3C,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,0x00,0x00,0x00,0x00,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,0xF0,0xF8,0xF8,0x7C,
0x3C,0x3C,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x1E,0x1E,0x1E,0x0E,0x0F,0xBF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0x7B,0x03,
0x00,0x00,0xFF,0xFF,0xFF,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0x00,0x00,0x00,0x80,
0xF0,0xF8,0xFC,0x3E,0x1E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x1E,0x1C,0x3C,0x78,0x70,
0xF0,0xE0,0xC0,0x80,0x00,0x80,0xE0,0xF0,0xF8,0x78,0x3C,0x3E,0x1E,0x0F,0x0F,0x07,
0x07,0x0F,0x1E,0x3C,0xF8,0xF0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x38,0x7C,0x3C,0x3E,0x1F,0x1F,0x0F,0x07,0x07,0x0F,0x0F,0x0F,0x0E,0x0E,0x0E,
0x0E,0x0E,0x0E,0x0E,0x8E,0x8E,0x8E,0xFE,0xFE,0xFE,0xFE,0x8E,0x8E,0x8E,0x0E,0x0E,
0x0E,0x0E,0x0E,0x0E,0x0E,0x0F,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0x9C,0xDC,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0x3F,
0xE7,0xE0,0xFF,0xFF,0xFF,0x01,0x01,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,
0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0x07,0x0F,0x1F,0x1F,0x0F,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xE1,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x07,0xFF,0xFF,0xFF,0x1F,0x07,0xFF,0xFF,0xFF,0x03,0x03,0x03,0x03,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x07,0x07,0x07,0x07,0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFC,
0x00,0x73,0x7F,0x7F,0x7F,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x07,
0x7F,0xFF,0xFC,0xC0,0x80,0x00,0x00,0x00,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,0xE0,0xF8,0xFF,0x7F,0x1F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x0E,0x0E,0x0F,0x0F,0x0F,0x07,0x07,0x07,
0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xFF,0xFF,0xFF,0x07,0x07,0x07,0x07,0x07,0x07,
0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0xE0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC7,0xC7,0x87,0x80,0x80,0x80,0x00,0x00,0x00,
0x00,0x00,0x01,0x07,0x1F,0x7F,0x7C,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0x7C,0x3E,0x3F,
0x0F,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xF8,0xF8,0xFC,0x3C,0x3E,0x1F,0x1F,0x0F,0xE0,0xE0,0xE0,0x00,0x00,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,0xF0,0xF0,0xF0,0x70,0xFF,0xFF,0xFF,0xE0,0xE0,0xE0,0x80,
0x80,0x1C,0xBE,0xFE,0xFE,0xFF,0xFF,0x9F,0xE7,0xFF,0xFF,0xFF,0xBF,0x80,0x80,0x80,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x0F,0x1F,0x7E,0xFE,0xF0,0xE0,
0xC0,0xC0,0xE0,0xF0,0xF0,0xF8,0x7C,0x3E,0x1F,0x0F,0x07,0x01,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x77,0x7F,0x7F,0x7F,0x70,0x70,0x70,0x70,0xFF,0xFF,0xFF,0x70,0x70,0x70,0x70,
0xF0,0xF0,0xF0,0xE0,0x40,0x00,0x00,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,0x3F,0x3F,0x3F,0x00,0xFF,0xFF,0xFF,0x03,0x03,0x07,0x87,
0xE7,0xFE,0xFF,0xFF,0x1F,0x0F,0x07,0x0F,0x1F,0x3F,0xFF,0xFF,0xFB,0xE3,0xE3,0x83,
0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x80,0x80,0xC0,0xC0,0xC0,0xE0,
0xF0,0xF8,0xF8,0x78,0x38,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x38,0x79,0xF8,0xF8,0xF0,0xE0,0xE0,0xC0,0xC0,0x80,0x80,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x00,0x00,0x00,0x03,
0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x07,0x07,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,0x03,0x03,0x03,0x03,0x03,0x01,
0x01,0x01,0x00,0x00,0x0E,0x1E,0x1E,0x3E,0xFC,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x03,0x03,0x03,0x07,0x07,0x07,0x0F,0x0F,0x0F,
0x0E,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++)
{
Oled_Write_Cmd(0xB0+i);//page0--page7
//每个page从0列
Oled_Write_Cmd(0x00);
Oled_Write_Cmd(0x10);
//一共有128列,0~127
for(j=128 * i;j<(128*(i+1));j++)
{
Oled_Write_Data(image[j]);
}
}
}
void main()
{
Oled_Clear(); //调用清屏函数
Oled_Init(); //初始化OLED
Oled_Write_Cmd(0x20); //选择一个位置,确认页寻址地址
Oled_Write_Cmd(0x02);
//Oled_Write_Cmd(0xB0); //选择PAGE0,可以配置8次,分别是B0-B7
Oled_Show_Image(bmpImager);
while(1); //防止程序退出
}
执行结果: