0.96寸_OLED_屏幕_SSD1306_IIC通信_入门教程_指令详解_驱动介绍_笔记分享_初学者易懂

目录

 一、简介

        1:总结

        2:屏幕介绍

二、基本使用流程

        1_介绍:

        2_流程:(省略了应答)

三、指令集

        1、基础指令

                1:设置对比度(亮度)(81H + A[7:0])

                2:设置全屏全亮(A4H、A5H)

                3:设置正常/反转显示(A6H、A7H)

                4:开启/关闭显示屏(AFH、AEH)

        2、地址指令

                1:设置寻址模式(0x20 + A[1:0])

                2:设置起始、终止列地址(21H + A[6:0] + B[6:0])

                3:设置起始、终止页地址(22H + A[2:0] + B[2:0])

                4:设置页地址(B0H ~ B7H)

                5:设置列地址低位(00H ~ 0FH)

                6:设置列地址高位(10H ~ 1FH)

        3、滚动命令

                1:启动滚动(2FH)

                2:禁止滚动(2EH)

                3:连续水平滚动设置()

                4:水平与垂直共同滚动设置()

        4、硬件指令

四、参考示例代码

                         0、教程+示例

        1、IIC底层通信代码

        2、屏幕初始化代码

        3、字库

        4、延时函数

        5、OLED屏幕驱动库函数


 一、简介

        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);
	}

}

  • 20
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值