目录
2:设置起始、终止列地址(21H + A[6:0] + B[6:0])
3:设置起始、终止页地址(22H + A[2:0] + B[2:0])
一、简介
1:总结
屏幕学一个,其他的都基本就懂了,都差不多就那样操作,我的理解就是:上电先初始化(设置屏幕初始设置,比如亮度什么的),初始化后,就算是可以正式使用了。需要显示内容,那就设置显示范围,(颜色),然后传入显示内容 然后就差不多可以显示了。
所以学会一个,其他的什么原理就懂个差不多,接下来就好学了。建议新手自己写一个屏幕的简单驱动,理解一下底层原理,虽然有点费时间,可收益巨大。
我也是刚学不久,鉴于刚学时候的迷茫(各种资料残缺不全,学一个屏幕就花费3,4周),这里我将分享下我的学习笔记。我都是用笔记的(个人觉得笔记挺重要的,我分享出来,也是为了以后忘记了,我可以随时随地打开再看),这里我就再打字吧(如果可以附带Word文档,那就可以让你们直接下载内容一样的文档了,留作你自己的学习资料)。
2:屏幕介绍
屏幕在横向分为8页{每页有8行},共8x8=64行,横向都是按照页来划分的;
纵向就没那么多要求了,一共分为128列;
此屏幕有3种寻址模式(寻址模式就是设置它显示图像区域的3种不同的方式)
1、页寻址模式:每次显示指定的一行,显示完毕后如果不手动发送换页指令,会从这一页开头继续显示;搭配指令:1,设置页地址。2,设置列地址低位。3,设置列地址高位。
2、水平寻址模式:从设置的起始地址出发,到达设置的终止地址后会重新回到设置的起始地址;搭配指令:1,设置为水平寻址模式。2,设置起始、终止页地址。3,设置起始、终止列地址
3、列寻址模式:从设置的起始地址出发,到达设置的终止地址后会自动重新回到设置的起始地址;1,设置为列寻址模式。2,设置起始、终止页地址。3,设置起始、终止列地址
向屏幕传送完数据后,如果不再发送数据,它会保持最后一次显示的内容,直到断电。
二、基本使用流程
1_介绍:
以IIC通信原理(后面我会分享笔记的) 做底层,在其基础上搭建、拼接各种指令函数,实现各种功能。
2_流程:(省略了应答)
注:0x:表示16进制
(1)[固定不变] 发送IIC协议的起始信号(Start);
(2)[固定不变] 由IIC通信时序知道:需要发送从机地址(在此为屏幕的地址,大多为:0x78,有的地址不同,可以看自己买的屏幕后面的丝印或店家介绍);
(3)[固定不变] 这一步发送的指令要表明后面再发送,究竟是发送的指令还是发送的数据,有两个选择:
{1}:比如,后面我要发送指令代码,那我就在这一步发送(0x00)
{2}:如果我接下来需要发送数据那就在这一步发送(0x40);
(4)[可变] 根据上一步的选择这里也能分成两步
{1}:如果是指令:那就在这里发送需要设置的指令(下面我会附上各种指令表),注意:指令是可以多次发送的,不需要停止IIC通信再开启IIC通信重复上面步骤,也就是说直接多次执行这一步,从而发送多个字节指令,这样有助于提高通信速率,不过停止IIC再执行一遍上述流程再发送第二个字节也可以。
{2}:如果是数据:那就在这里发送需要发送的数据,注意:数据也是可以多次重复发送的,和上面指令一样,直接多次重复这一步,发送需要发送的各种数据即可。
(5)各种指令或者数据在上一步重复发送完成后,就可以:
[固定不变] 发送IIC通信协议的停止信号。
Start_IIC(); //起始信号
Write_IIC_Byte(0x78); //从机地址
if(Command==1)
Write_IIC_Byte(0x00); //判断如果是命令
else
Write_IIC_Byte(0x40); //判断如果是数据
Write_IIC_Byte(Byte); //发送命令字节/ 数据字节
/* (。。。); 可连续发送多个命令或数据*/
Stop_IIC(); //停止信号
以上就是这个屏幕的大致操作时序,那么接下来就可以介绍各种指令,以及其对应的时序要求了;
三、指令集
注:单字节、双字节...是代表,一个完整的指令需要几个字节去设置;
1、基础指令
1:设置对比度(亮度)(81H + A[7:0])
---我第一次见括号里这个也看不懂,最后慢慢才理解:(H:代表16进制数,A[7:0]:代表8位数据的哪几位是有效位,A、B、C...仅仅为了区别不同的字节,比如这里就是从最高位:第7位到最低位:第0位都是有效位)
这是双字节指令,放在上面流程中的(4)[可变]步
(1):发送0x81
(2):发送0x00~0xFF,一共256级亮度调节
2:设置全屏全亮(A4H、A5H)
这是单字节指令,放在上面流程中的(4)[可变]步
0xA4:正常显示
0xA5:全屏全亮,也就是说:无论之前、之后发送的什么数据,一直保持着全屏全灭
3:设置正常/反转显示(A6H、A7H)
这是单字节指令,放在上面流程中的(4)[可变]步
0xA6:正常显示
0xA7:反转显示(意思是原本不亮的地方亮,原本亮的地方不亮,如果不设置为正常显示,将一直保持如此)
4:开启/关闭显示屏(AFH、AEH)
这是单字节指令,放在上面流程中的(4)[可变]步
0xAE:关闭屏幕显示
0xAF:开启屏幕显示
2、地址指令
1:设置寻址模式(0x20 + A[1:0])
这是双字节指令,放在上面流程中的(4)[可变]步
0x20:(第一个字节)代表我要设置地址模式
0x00:(第二个字节)代表我要设置位水平寻址模式
0x01:(第二个字节)垂直寻址模式
0x10:(第二个字节)页寻址模式
0x11:(第二个字节)无效指令
2:设置起始、终止列地址(21H + A[6:0] + B[6:0])
这是三字节指令,放在上面流程中的(4)[可变]步
0x21:(第一个字节)代表我要设置起始、终止列地址
0x00~0x7F:(第二个字节)代表我要设置起始列地址(共2^7=128个列地址)
0x00~0x7f:(第三个字节)代表我要设置终止列地址(与起始地址大小顺序不能弄错)
注:这个指令仅仅对水平、垂直寻址模式有效
3:设置起始、终止页地址(22H + A[2:0] + B[2:0])
这是三字节指令,放在上面流程中的(4)[可变]步
0x22:(第一个字节)代表我要设置起始、终止页地址
0x00~0x07:(第二个字节)代表我要设置起始页地址0~7
0x00~0x07::(第三个字节)代表我要设置终止页地址0~7
注:这个指令仅仅对水平、垂直寻址模式有效
4:设置页地址(B0H ~ B7H)
这是单字节指令,放在上面流程中的(4)[可变]步
0xB0~0xB7:设置页地址0~7页
注:这个指令仅仅对页寻址模式有效
5:设置列地址低位(00H ~ 0FH)
这是单字节指令,放在上面流程中的(4)[可变]步
0x00~0x0F:我没用过,我觉得也不常用,就不介绍了
注:这个指令仅仅对页寻址模式有效
6:设置列地址高位(10H ~ 1FH)
这是单字节指令,放在上面流程中的(4)[可变]步
0x10~0x1F:我没用过,我觉得也不常用,就不介绍了
注:这个指令仅仅对页寻址模式有效
3、滚动命令
这是滚动指令,会使得屏幕上已显示的内容进行水平、垂直滚动
1:启动滚动(2FH)
单字节指令
0x2F;
2:禁止滚动(2EH)
单字节指令
0x2E;
3:连续水平滚动设置()
九字节指令
(1):停止滚动:0x2E;
(2):设置滚动方向:0x29(右)0x2A(左)
(3):空比特,假设为0x00;
(4):设置滚动起始页地址:0x00~0x07;
(5):设置滚动速度:0x00~0x07(按顺序滚动速度依次为,5,64,128,3,4,25,2;数值越小速度越快)
(6):设置滚动结束页地址:0x00~0x07(注意要比起始页地址大)
(7):空比特,假设为0x00;
(8):空比特,假设为0x00;
(9):开启滚动:0x2F;
4:水平与垂直共同滚动设置()
八字节指令
(1):停止滚动:0x2E;
(2):设置滚动方向:0x29(右)0x2A(左)
(3):空比特,假设为0x00;
(4):设置滚动起始页地址:0x00~0x07;
(5):设置滚动速度:0x00~0x07(按顺序滚动速度依次为,5,64,128,3,4,25,2;数值越小速度越快)
(6):设置滚动结束页地址:0x00~0x07(注意要比起始页地址大)
(7):设置垂直偏移量:0x00~0x3F(0~63行)
(8):开启滚动:0x2F;
4、硬件指令
一般不需要设置,并且牵扯到很多专业名词,在这里就不进行排列了。
四、参考示例代码
0、教程+示例
如果你需要直接用我写的代码,你只需要复制:
(1):IIC底层通信代码 (注意要引用自己单片机的头文件)
(2):延时函数
(3):字库
(4):OLED屏幕驱动库函数
接下来在主函数里调用对应的函数代码就可以了:如图
实际显示效果由于51单片机速度限制会看起来很卡,同样的时钟频率,换用其他的高性能51单片机就可能会很流畅。
void main ()
{
Init_OLED();
Show_Char(4,10,5);
Show_Num(0,10,5);
while(1)
{
// Change_OLED_Open();
// Change_OLED_Stop();
}
}
1、IIC底层通信代码
单片机晶振频率在12M与12M之内时可用,引脚需要自己切换为对应的引脚
//#include //别忘记引用头文件,不然下面的引脚定义不能用
sbit SCL=P2^1; //定义引脚
sbit DAT=P2^0; //引脚定义
void Start_IIC()
{
SCL=0;
DAT=1;
SCL=1;
DAT=0;
SCL=0;
}
void Stop_IIC()
{
SCL=0;
DAT=0;
SCL=1;
DAT=1;
}
void Write_IIC_Byte(unsigned char Byte)
{
unsigned char x;
for(x = 0; x < 8; x++)
{
DAT = Byte & 0x80;
SCL = 1;
SCL = 0;
Byte <<= 1;
}
DAT=1;
SCL=1;
SCL=0;
}
2、屏幕初始化代码
此处建议直接使用别人的即可,因为牵扯好多硬件设置,本人觉得对于小白来说完全没必要自己理解
void Init_OLED()
{
Write_OLED_IIC_C1oD0(0xAE,1);
Write_OLED_IIC_C1oD0(0x20,1);
Write_OLED_IIC_C1oD0(0x10,1);
Write_OLED_IIC_C1oD0(0xB0,1);
Write_OLED_IIC_C1oD0(0xC8,1);
Write_OLED_IIC_C1oD0(0x00,1);
Write_OLED_IIC_C1oD0(0x10,1);
Write_OLED_IIC_C1oD0(0x40,1);
Write_OLED_IIC_C1oD0(0x81,1);
Write_OLED_IIC_C1oD0(0x7F,1);
Write_OLED_IIC_C1oD0(0xA1,1);
Write_OLED_IIC_C1oD0(0xA6,1);
Write_OLED_IIC_C1oD0(0xA8,1);
Write_OLED_IIC_C1oD0(0x3F,1);
Write_OLED_IIC_C1oD0(0xA4,1);
Write_OLED_IIC_C1oD0(0xD3,1);
Write_OLED_IIC_C1oD0(0x00,1);
Write_OLED_IIC_C1oD0(0xD5,1);
Write_OLED_IIC_C1oD0(0xF0,1);
Write_OLED_IIC_C1oD0(0xD9,1);
Write_OLED_IIC_C1oD0(0x22,1);
Write_OLED_IIC_C1oD0(0xDA,1);
Write_OLED_IIC_C1oD0(0x12,1);
Write_OLED_IIC_C1oD0(0xDB,1);
Write_OLED_IIC_C1oD0(0x20,1);
Write_OLED_IIC_C1oD0(0x8D,1);
Write_OLED_IIC_C1oD0(0x14,1);
Write_OLED_IIC_C1oD0(0xAF,1);
Clear_OLED(0,7,0,127,0X00); //全屏清屏
}
3、字库
unsigned char code Num[]= //定义8x16规格的数字0~9
{
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",0*/
0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,
0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,/*"1",1*/
/* (8 X 16 , 宋体 )*/
0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*"2",2*/
/* (8 X 16 , 宋体 )*/
0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,
0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00,/*"3",3*/
/* (8 X 16 , 宋体 )*/
0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,
0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24,/*"4",4*/
/* (8 X 16 , 宋体 )*/
0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,
0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00,/*"5",5*/
/* (8 X 16 , 宋体 )*/
0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,
0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,/*"6",6*/
/* (8 X 16 , 宋体 )*/
0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,
0x00,0x00,0x00,0x3E,0x01,0x00,0x00,0x00,/*"7",7*/
/* (8 X 16 , 宋体 )*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*"8",8*/
/* (8 X 16 , 宋体 )*/
0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,
0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00,/*"9",9*/
/* (8 X 16 , 宋体 )*/
};
//定义的小号英文字符
unsigned char code Char[] =
{
/* a(0) b(1) c(2) d(3) e(4) f(5) g(6) h(7)
i(8) j(9) k(10) l(11) m(12) n(13) o(14) p(15)
q(16) r(17) s(18) t(19) u(20) v(21) w(22) x(23)
y(24) z(25)
*/
0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,
0x00,0x19,0x24,0x24,0x12,0x3F,0x20,0x00,/*"a",0*/
/* (8 X 16 , 宋体 )*/
0x10,0xF0,0x00,0x80,0x80,0x00,0x00,0x00,
0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,/*"b",1*/
/* (8 X 16 , 宋体 )*/
0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,
0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,/*"c",2*/
/* (8 X 16 , 宋体 )*/
0x00,0x00,0x80,0x80,0x80,0x90,0xF0,0x00,
0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,/*"d",3*/
/* (8 X 16 , 宋体 )*/
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
0x00,0x1F,0x24,0x24,0x24,0x24,0x17,0x00,/*"e",4*/
/* (8 X 16 , 宋体 )*/
0x00,0x80,0x80,0xE0,0x90,0x90,0x20,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"f",5*/
/* (8 X 16 , 宋体 )*/
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,
0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,/*"g",6*/
/* (8 X 16 , 宋体 )*/
0x10,0xF0,0x00,0x80,0x80,0x80,0x00,0x00,
0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,/*"h",7*/
/* (8 X 16 , 宋体 )*/
0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"i",8*/
/* (8 X 16 , 宋体 )*/
0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,
0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,/*"j",9*/
/* (8 X 16 , 宋体 )*/
0x10,0xF0,0x00,0x00,0x80,0x80,0x80,0x00,
0x20,0x3F,0x24,0x06,0x29,0x30,0x20,0x00,/*"k",10*/
/* (8 X 16 , 宋体 )*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"l",11*/
/* (8 X 16 , 宋体 )*/
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,/*"m",12*/
/* (8 X 16 , 宋体 )*/
0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,
0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,/*"n",13*/
/* (8 X 16 , 宋体 )*/
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,/*"o",14*/
/* (8 X 16 , 宋体 )*/
0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,
0x80,0xFF,0x91,0x20,0x20,0x11,0x0E,0x00,/*"p",15*/
/* (8 X 16 , 宋体 )*/
0x00,0x00,0x00,0x80,0x80,0x00,0x80,0x00,
0x00,0x0E,0x11,0x20,0x20,0x91,0xFF,0x80,/*"q",16*/
/* (8 X 16 , 宋体 )*/
0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,
0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,/*"r",17*/
/* (8 X 16 , 宋体 )*/
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,
0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,/*"s",18*/
/* (8 X 16 , 宋体 )*/
0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,
0x00,0x00,0x00,0x1F,0x20,0x20,0x10,0x00,/*"t",19*/
/* (8 X 16 , 宋体 )*/
0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,
0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,/*"u",20*/
/* (8 X 16 , 宋体 )*/
0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,
0x00,0x03,0x0C,0x30,0x0C,0x03,0x00,0x00,/*"v",21*/
/* (8 X 16 , 宋体 )*/
0x80,0x80,0x00,0x80,0x80,0x00,0x80,0x80,
0x01,0x0E,0x30,0x0C,0x07,0x38,0x06,0x01,/*"w",22*/
/* (8 X 16 , 宋体 )*/
0x00,0x80,0x80,0x80,0x00,0x80,0x80,0x00,
0x00,0x20,0x31,0x0E,0x2E,0x31,0x20,0x00,/*"x",23*/
/* (8 X 16 , 宋体 )*/
0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,
0x00,0x81,0x86,0x78,0x18,0x06,0x01,0x00,/*"y",24*/
/* (8 X 16 , 宋体 )*/
0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00/*"z",25*/
/* (8 X 16 , 宋体 )*/
};
//=====================================================================
/*
*:定义的大号数字
*/
unsigned char code Big_Num[] =
{
//0(0) 1(1) 2(2) 3(3) 4(4) 5(5) 6(6) 7(7)
//8(8) 9(9)
0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x40,
0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xF0,0xFE,0x0F,0x01,0x00,0x00,
0x00,0x00,0x01,0x07,0xFE,0xF0,0x00,0x00,
0x00,0x00,0x3F,0xFF,0xC0,0x00,0x00,0x00,
0x00,0x00,0x00,0x80,0xFF,0x3F,0x00,0x00,
0x00,0x00,0x00,0x01,0x03,0x06,0x0C,0x08,
0x08,0x08,0x06,0x03,0x01,0x00,0x00,0x00,/*"0",0*/
/* (16 X 32 , 宋体 )*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0x01,0x01,0x01,0xFF,
0xFF,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,0x00,0x08,0x08,0x08,0x0C,0x0F,
0x0F,0x0C,0x08,0x08,0x08,0x00,0x00,0x00,/*"1",1*/
/* (16 X 32 , 宋体 )*/
0x00,0x00,0x00,0x00,0x80,0x40,0x40,0x40,
0x40,0x40,0xC0,0x80,0x80,0x00,0x00,0x00,
0x00,0x00,0x1E,0x19,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xC1,0xFF,0x3E,0x00,0x00,
0x00,0x00,0x00,0x00,0x80,0x40,0x30,0x18,
0x0C,0x06,0x03,0x01,0x00,0xC0,0x00,0x00,
0x00,0x00,0x0E,0x0D,0x0C,0x0C,0x0C,0x0C,
0x0C,0x0C,0x0C,0x0C,0x0E,0x03,0x00,0x00,/*"2",2*/
/* (16 X 32 , 宋体 )*/
0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x40,
0x40,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,
0x00,0x80,0xC1,0x7F,0x3E,0x00,0x00,0x00,
0x00,0x00,0xC0,0xC0,0x00,0x00,0x01,0x01,
0x01,0x03,0x02,0x06,0xFC,0xF0,0x00,0x00,
0x00,0x00,0x03,0x07,0x04,0x08,0x08,0x08,
0x08,0x08,0x04,0x06,0x03,0x00,0x00,0x00,/*"3",3*/
/* (16 X 32 , 宋体 )*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x80,0x60,0x10,0x0C,
0x03,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,
0x00,0x30,0x2C,0x26,0x21,0x20,0x20,0x20,
0x20,0xFF,0xFF,0x20,0x20,0x20,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,
0x08,0x0F,0x0F,0x08,0x08,0x08,0x00,0x00,/*"4",4*/
/* (16 X 32 , 宋体 )*/
0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,
0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,
0x00,0x00,0x00,0xFF,0x00,0x80,0x40,0x40,
0x40,0x40,0xC0,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0xC0,0xC3,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0xFF,0xFC,0x00,0x00,
0x00,0x00,0x03,0x04,0x04,0x08,0x08,0x08,
0x08,0x08,0x04,0x07,0x03,0x00,0x00,0x00,/*"5",5*/
/* (16 X 32 , 宋体 )*/
0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x40,
0x40,0x40,0x40,0x80,0x80,0x00,0x00,0x00,
0x00,0x00,0xE0,0xFC,0x07,0x81,0xC0,0x40,
0x40,0x40,0xC0,0x83,0x03,0x00,0x00,0x00,
0x00,0x00,0x7F,0xFF,0x83,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0xFF,0xFC,0x00,0x00,
0x00,0x00,0x00,0x01,0x07,0x06,0x0C,0x08,
0x08,0x08,0x0C,0x06,0x03,0x00,0x00,0x00,/*"6",6*/
/* (16 X 32 , 宋体 )*/
0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,
0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,
0x00,0x00,0x0E,0x03,0x00,0x00,0x00,0x00,
0x00,0xE0,0x18,0x06,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFC,
0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"7",7*/
/* (16 X 32 , 宋体 )*/
0x00,0x00,0x00,0x00,0x80,0xC0,0x40,0x40,
0x40,0x40,0xC0,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x3E,0x7F,0xF1,0xC0,0xC0,0x80,
0x00,0x00,0x80,0x41,0x7F,0x1E,0x00,0x00,
0x00,0xF0,0xFC,0x0E,0x02,0x01,0x01,0x01,
0x03,0x07,0x0E,0x1E,0xFC,0xF0,0x00,0x00,
0x00,0x01,0x03,0x06,0x04,0x08,0x08,0x08,
0x08,0x08,0x04,0x06,0x03,0x01,0x00,0x00,/*"8",8*/
/* (16 X 32 , 宋体 )*/
0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x40,
0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,
0x00,0xFC,0xFF,0x03,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x03,0xFE,0xF8,0x00,0x00,
0x00,0x01,0x03,0x07,0x0C,0x08,0x08,0x08,
0x08,0x04,0x06,0xE1,0x7F,0x1F,0x00,0x00,
0x00,0x00,0x07,0x07,0x08,0x08,0x08,0x08,
0x0C,0x06,0x03,0x01,0x00,0x00,0x00,0x00,/*"9",9*/
/* (16 X 32 , 宋体 )*/
};
4、延时函数
void Delay_ms(xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 16;
j = 147;
do
{
while (--j);
} while (--i);
xms--;
}
}
void Delay_us(xum) //@12.000MHz
{
unsigned char i;
while(xum)
{
i = 2;
while (--i);
xum--;
}
}
//=====================================================================
//void Delay_ms(xms) //@11.0592MHz
//{
// unsigned char i, j;
// while(xms)
// {
// i = 15;
// j = 90;
// do
// {
// while (--j);
// } while (--i);
// xms--;
// }
//}
//void Delay_us(xum) //@11.0592MHz
//{
// unsigned char i;
// while(xum)
// {
// i = 1;
// while (--i);
// xum--;
// }
//}
5、OLED屏幕驱动库函数
//=====================================================================
void Write_OLED_IIC_C1oD0(unsigned char Byte, Command);
void Init_OLED();
void Show_Num(unsigned char x,y,num);
void Clear_OLED(unsigned char x,y,i,j,Byte);
void OLED_Roll_R(unsigned char x,y,HZ);
void Show_Char(unsigned char x,y,Char);
void Write_OLED_Line(unsigned char x,y1,y2,Byte);
void Change_OLED_Open();
void Change_OLED_Stop();
//=====================================================================
/*
*:向屏幕写命令/数据
*:参数有2个,Byte:是需要写入的字节;Command:是表明写入的是数据还是命令1是命令,0是数据
*:无返回值
*/
void Write_OLED_IIC_C1oD0(unsigned char Byte, Command)
{
Start_IIC();
Write_IIC_Byte(0x78);
if(Command==1)
Write_IIC_Byte(0x00);
else
Write_IIC_Byte(0x40);
Write_IIC_Byte(Byte);
Stop_IIC();
}
//=====================================================================
/*
*:清屏函数,指定某一个地方填入指定的数据,实现清屏的效果
*:5个传入参数,x:指定起始行0~7,y:指定结束行0~7,i:指定起始列0~127,j:指定结束列0~127,Byte:指定传入数据
*:无
*/
void Clear_OLED(unsigned char x,y,i,j,Byte)
{
unsigned char a,b,c,d;
Write_OLED_IIC_C1oD0(0x20,1); //设置寻址模式
Write_OLED_IIC_C1oD0(0x00,1); //水平寻址
Write_OLED_IIC_C1oD0(0x22,1); //设置起始终止页地址
Write_OLED_IIC_C1oD0(0x00+x,1);
Write_OLED_IIC_C1oD0(0x00+y,1);
Write_OLED_IIC_C1oD0(0x21,1); //设置起始终止列地址
Write_OLED_IIC_C1oD0(0x00+i,1);
Write_OLED_IIC_C1oD0(0x00+j,1);
c=y-x+1;
d=j-i+1;
Start_IIC(); //连续发字节
Write_IIC_Byte(0x78);
Write_IIC_Byte(0x40);
for(b=0;b<c;b++)
for(a=0;a<d;a++)
Write_IIC_Byte(Byte);
Stop_IIC();
}
//=====================================================================
/*
*:初始化屏幕,包括全屏清屏
*:无传入参数
*:无返回值
*/
void Init_OLED()
{
Write_OLED_IIC_C1oD0(0xAE,1);
Write_OLED_IIC_C1oD0(0x20,1);
Write_OLED_IIC_C1oD0(0x10,1);
Write_OLED_IIC_C1oD0(0xB0,1);
Write_OLED_IIC_C1oD0(0xC8,1);
Write_OLED_IIC_C1oD0(0x00,1);
Write_OLED_IIC_C1oD0(0x10,1);
Write_OLED_IIC_C1oD0(0x40,1);
Write_OLED_IIC_C1oD0(0x81,1);
Write_OLED_IIC_C1oD0(0x7F,1);
Write_OLED_IIC_C1oD0(0xA1,1);
Write_OLED_IIC_C1oD0(0xA6,1);
Write_OLED_IIC_C1oD0(0xA8,1);
Write_OLED_IIC_C1oD0(0x3F,1);
Write_OLED_IIC_C1oD0(0xA4,1);
Write_OLED_IIC_C1oD0(0xD3,1);
Write_OLED_IIC_C1oD0(0x00,1);
Write_OLED_IIC_C1oD0(0xD5,1);
Write_OLED_IIC_C1oD0(0xF0,1);
Write_OLED_IIC_C1oD0(0xD9,1);
Write_OLED_IIC_C1oD0(0x22,1);
Write_OLED_IIC_C1oD0(0xDA,1);
Write_OLED_IIC_C1oD0(0x12,1);
Write_OLED_IIC_C1oD0(0xDB,1);
Write_OLED_IIC_C1oD0(0x20,1);
Write_OLED_IIC_C1oD0(0x8D,1);
Write_OLED_IIC_C1oD0(0x14,1);
Write_OLED_IIC_C1oD0(0xAF,1);
Clear_OLED(0,7,0,127,0X00); //全屏清屏
}
//=====================================================================
/*
*:向屏幕上打印数字0~9,每次占用2页8列,数字字模在code中
*:3个传入参数,x:是设置显示的页0~7>,y:是设置显示的列<0~128>,num:是设置需要显示的数字<0~9示1个数字
*:无返回值
*/
void Show_Num(unsigned char x,y,num)
{
unsigned char i,j;
num *= 16;
Write_OLED_IIC_C1oD0(0x20,1); //设置寻址模式
Write_OLED_IIC_C1oD0(0x00,1); //水平寻址
Write_OLED_IIC_C1oD0(0x22,1); //设置起始终止页地址
Write_OLED_IIC_C1oD0(0x00+x,1);
Write_OLED_IIC_C1oD0(0x01+x,1);
Write_OLED_IIC_C1oD0(0x21,1); //设置起始终止列地址
Write_OLED_IIC_C1oD0(0x00+y,1);
Write_OLED_IIC_C1oD0(0x08+y,1);
Start_IIC(); //连续发字节
Write_IIC_Byte(0x78);
Write_IIC_Byte(0x40);
for(i=0;i<2;i++)
for(j=0;j<8;j++)
Write_IIC_Byte(Num[num++]);
Stop_IIC();
}
//=====================================================================
/*
*:向屏幕上打印数字0~9,每次占用4页16列,数字字模在code中
*:3个传入参数,x:是设置显示的页0~7>,y:是设置显示的列<0~128>,num:是设置需要显示的数字<0~9示1个数字
*:无返回值
*/
void Show_Big_Num(unsigned char x,y,num)
{
unsigned char i,j;
num *= 64;
Write_OLED_IIC_C1oD0(0x20,1); //设置寻址模式
Write_OLED_IIC_C1oD0(0x00,1); //水平寻址
Write_OLED_IIC_C1oD0(0x22,1); //设置起始终止页地址
Write_OLED_IIC_C1oD0(0x00+x,1);
Write_OLED_IIC_C1oD0(0x03+x,1);
Write_OLED_IIC_C1oD0(0x21,1); //设置起始终止列地址
Write_OLED_IIC_C1oD0(0x00+y,1);
Write_OLED_IIC_C1oD0(0x10+y,1);
Start_IIC(); //连续发字节
Write_IIC_Byte(0x78);
Write_IIC_Byte(0x40);
for(i=0;i<4;i++)
for(j=0;j<16;j++)
Write_IIC_Byte(Big_Num[num++]);
Stop_IIC();
}
//=====================================================================
/*
*:这是滚动命令
*:3个传入参数,x:设置滚动开始页地址,y:设置结束页地址,HZ:设置滚动速率1~8级
*:无返回值
*/
void OLED_Roll_R(unsigned char x,y,HZ)
{
unsigned char hz;
switch (HZ)
{
case 1:hz=3;
case 2:hz=2;
case 3:hz=1;
case 4:hz=6;
case 5:hz=0;
case 6:hz=5;
case 7:hz=4;
case 8:hz=7;
}
Write_OLED_IIC_C1oD0(0x2e,1); //关闭滚动
Write_OLED_IIC_C1oD0(0x26,1); //水平向右滚动
Write_OLED_IIC_C1oD0(0x00,1); //空比特
Write_OLED_IIC_C1oD0(0x00+x,1); //设置滚动起始页地址
Write_OLED_IIC_C1oD0(0x00+HZ,1);//设置滚动速率
Write_OLED_IIC_C1oD0(0x00+y,1); //设置滚动结束页地址
Write_OLED_IIC_C1oD0(0x00,1); //空比特
Write_OLED_IIC_C1oD0(0xff,1); //空比特
Write_OLED_IIC_C1oD0(0x2f,1); //启动滚动
}
//=====================================================================
/*
*:用于展示一张图片
*:x:起始页地址;y:终止页地址;i:起始列地址;j:终止列地址;Picture:需要显示的图片编号,code里面有编号
*:无
*/
//void Write_OLED_Picture(unsigned char x,y,i,j,Picture)
//{
// unsigned char a,b,c,d;
// Write_OLED_IIC_C1oD0(0x22,1); //设置页地址
// Write_OLED_IIC_C1oD0(0x00+x,1); //起始页
// Write_OLED_IIC_C1oD0(0x00+y,1); //终止页
//
// Write_OLED_IIC_C1oD0(0x21,1); //设置列地址
// Write_OLED_IIC_C1oD0(0x00+i,1); //起始列
// Write_OLED_IIC_C1oD0(0x00+j,1); //终止列
// c=y-x+1;
// d=j-i+1;
//
// Start_IIC(); //连续发字节
// Write_IIC_Byte(0x78);
// Write_IIC_Byte(0x40);
// for(a=0;a<c;a++)
// for(b=0;b<d;b++)
// Write_IIC_Byte(pictue[Picture++]);
// Stop_IIC();
//}
//=====================================================================
/*
*:向屏幕展示英文字符
*:x:设置起始页地址;y:设置起始列地址;char_:数字代表英文字母
*:无
*/
void Show_Char(unsigned char x,y,char_)
{
unsigned char i,j;
char_ *= 16;
Write_OLED_IIC_C1oD0(0x20,1); //设置寻址模式
Write_OLED_IIC_C1oD0(0x00,1); //水平寻址
Write_OLED_IIC_C1oD0(0x22,1); //设置起始终止页地址
Write_OLED_IIC_C1oD0(0x00+x,1);
Write_OLED_IIC_C1oD0(0x01+x,1);
Write_OLED_IIC_C1oD0(0x21,1); //设置起始终止列地址
Write_OLED_IIC_C1oD0(0x00+y,1);
Write_OLED_IIC_C1oD0(0x08+y,1);
for(i=0;i<2;i++)
{
for(j=0;j<8;j++)
{
Write_OLED_IIC_C1oD0(Char[char_++],0);
}
}
}
//=====================================================================
/*
*:这是向OLED中单独行中的多个列,写入指定数据的函数
*:x是指定行,y1是起始列,y2是终止列,Byte是指定字节
*:无返回值
*/
void Write_OLED_Line(unsigned char x,y1,y2,Byte)
{ //高位在下,低位在上
unsigned char i,n;
Write_OLED_IIC_C1oD0(0x20,1); //设置寻址模式
Write_OLED_IIC_C1oD0(0x00,1); //水平寻址
Write_OLED_IIC_C1oD0(0x22,1); //设置起始终止页地址
Write_OLED_IIC_C1oD0(0x00+x,1);
Write_OLED_IIC_C1oD0(0x00+x,1);
Write_OLED_IIC_C1oD0(0x21,1); //设置起始终止列地址
Write_OLED_IIC_C1oD0(0x00+y1,1);
Write_OLED_IIC_C1oD0(0x00+y2,1);
n=y2-y1+1;
Start_IIC(); //连续发字节
Write_IIC_Byte(0x78);
Write_IIC_Byte(0x40);
for(i=0;i<n;i++)
{
Write_IIC_Byte(Byte);
}
Stop_IIC();
}
//=====================================================================
/*
*:这是OLED开屏动画,由两条横线组成
*:无传入参数
*:无返回值
*/
void Change_OLED_Open()
{
unsigned char i,j,x;
for(i=0;i<=63;i++) //从中间向左右两边
{
Write_OLED_Line(3,63-i,64+i,0x80); //靠上
Write_OLED_Line(4,63-i,63+i,0x01); //靠下
// Delay_ms(2);
}
for(x=0;x<=3;x++) //从中间向上下两边
{
for(j=1;j<=8;j++)
{
Write_OLED_Line(3-x,0,127,0x80>>j); //靠上
Write_OLED_Line(4+x,0,127,0x01<<j); //靠下
// Delay_ms(8);
}
}
}
//=====================================================================
/*
*:这是OLED锁屏动画,由两条横线组成,可与开屏动画组合在一起
*:无
*:无
*/
void Change_OLED_Stop()
{
unsigned char i,j,x;
for(x=0;x<=3;x++) //从中间向上下两边
{
for(j=1;j<=8;j++)
{
Write_OLED_Line(x,0,127,0x01<<j); //靠上
Write_OLED_Line(7-x,0,127,0x80>>j); //靠下
// Delay_ms(2);
}
}
for(i=0;i<=63;i++) //从中间向左右两边
{
Clear_OLED(3,3,0,127,0X00);
Clear_OLED(4,4,0,127,0X00);
Write_OLED_Line(3,i,127-i,0x80); //靠上
Write_OLED_Line(4,i,127-i,0x01); //靠下
// Delay_ms(8);
}
}
/*
*:这是反显的函数
*:Command:1为开启显示,0为关闭显示
*:无
*/
void OLED_Reversal(unsigned char Command)
{
if(Command==1)
{
Write_OLED_IIC_C1oD0(0xA7,1);
}
else if(Command==0)
{
Write_OLED_IIC_C1oD0(0xA6,1);
}
}