admin管理员组

文章数量:1536442


2024年6月3日发(作者:)

1

/10

OLED屏的驱动与使用

OLED屏的驱动与使用

文/杜洋

【OLED时代来了】

一提到OLED,我想无人不知。智能手机的迅猛发展,使得屏幕显示技术不断推陈出新。虽然最新报出三星将产量更新

颖的QLED屏幕,但在没有上市之前智能手机屏幕从显示原理上仍只有LCD和OLED两种。在三星和LG两家公司的高

端手机上都采用了OLED屏幕,其他手机生产商还是采用传统的LCD屏幕。其两者最大的区别就是:LCD屏幕是由灯

管或LED做背光照明,再通过LCD屏通过或阻断光线达到显示目的。OLED是有机发光二极管,它和我们常用的LED

是近亲。OLED不需要背光灯,其上面每一个像素点都能独立发光。综合来看OLED显示技术功耗更低、效果更有优势。

我曾用过一款手机,采用的是SUPER OLED屏幕,无论从色彩还是可视角度都非常出众。不过现在仅有几家大公司才

能生产OLED屏幕,产量不足,价格昂贵。

OLED屏供应手机市场都不足够,作为一名电子爱好者更不敢奢求有一天能亲手把玩它了。记得3年前,我在北京工作

的时候,就曾在电子市场看到久闻未见的OLED屏幕。之所以让我一眼就识别出来,是因那柜台里每一块屏幕都只是一

片薄薄的玻璃,发着光的文字和图案在上面不停切换,周围没有背光灯,没有电路板,只有一片玻璃。旁人也许并无

感想,但对我这个电子发烧友来说,这种震撼不亚于第一次看到没有“大包”的液晶电视。站在柜台前看了半天,老

板见势走过来。我指着那片1元硬币大小的屏幕问多少钱,老板一本正经地说:“这款小的便宜,你要多少?”我说只

要1个。他有些不太高兴的说:“一个呀,280元”。听闻此言,二话没说,转身就跑。只是一块单色的小屏幕,如果

是LCD液晶屏顶多80元,就因为是OLED就多出200元。可是又忍不住对它的神奇所吸引,好想能早点把玩。

时间是把无情刀,能杀人,也能杀价。如今的OLED技术已经广泛被使用,产量高了,价格自然就降低了。从前上百元

的OLED屏幕,现在只要几十元。还有各种尺寸大小、颜色和分辨率。如此一来,我们每一位电子爱好者都有能力玩转

OLED,体验新型显示技术所带来的乐趣,OLED屏的DIY时代已经到来了!对于我而言,OLED可是低功耗便携设备的

优质显示屏,不用它来制作一款便携产品实在太可惜了。经过几个月的创新构想,我正在开发一款OLED屏幕的运动型

手表,这款手表不仅能显示日期和时间,还有计步功能。更为重要的是,这是一款电子DIY的运动型手表,每位电子

爱好者都能根据自己的需要订制显示内容。可以写上对某人的祝福,提醒某些重要纪念日。相信这款手表会带给电子

爱好者一片新的制作领域。到时我也会撰文介绍这款作品。不过在手表问世之前,我想把刚刚研究明白的OLED驱动及

中英文显示的方法与大家分享,希望大家能通过我的文章学会OLED的使用。

2

/10

OLED屏的驱动与使用

【OLED屏的硬件连接】

OLED屏虽然说是新鲜事物,但依然遵循、沿用LCD显示屏的设计方案。一来是降低开发成本,二来也让曾使用LCD

屏的人快速上手。OLED屏有全彩色和单色屏两种,前者用在手机等3C产品上,后者用在工业、医疗、商业的嵌入式

产品上。在工业、医疗、商业领域,早就采用了LCD显示屏,比如我们熟悉的LCD1602、LCD12864等。但LCD屏的

体积大、背光功耗大、环境要求高,而新的OLED屏正好可以解决这些问题,OLED屏的生产商是希望自己的OLED屏

可以取代传统LCD屏,所以OLED屏被设计成可兼容原来LCD屏的规格,如尺寸、分辨率、安装方式。原来LCD屏常

用的分辨率有128x64,那OLED屏也照旧。在屏幕驱动控制上,OLED屏生产商也尽量与传统驱动电路的指令保持一

致。相同功能的直接照搬,有差异的尽量靠近。所以请大家放心,学会OLED屏的驱动和显示并不难。

本文介绍的这款DYS864显示屏模块,是一款0.96英寸的OLED屏。模块由一片OLED玻璃屏幕和一个驱动PCB板组

成。屏幕有单白色和黄绿双色两种颜色可选,其中黄绿双色并不是传统上理解的双色屏。而是把屏幕分成上下两部分,

上面1/4是黄色,下面3/4是蓝色。模块分辨率是128x64,内置了升压电路(OLED点亮显示8~14V的高电压)和复

位电路,所以只要3~5V电源输入电压即可。采用I2C总线通过,电路连接简洁。0.96英寸的大小与1元硬币差不多。

小体积带来小的功耗,只要3mA左右的电流就能让它显示内容,而点亮一支LED灯还需要20mA的电流呢。把它放在

用电池供电的小制作上,再完美不过了。

【图1】DYS864模块的体积小巧

3

/10

OLED屏的驱动与使用

【图2】两种颜色OLED屏的显示效果

你可以把OLED屏上的像素点理解成LED灯,小小玻璃片上嵌入了8192(128x64)个LED,对应的LED点亮或熄灭,

则形成图案和文字。想一想,用单片机驱动LED灯阵列时通常要专用的驱动芯片,那OLED屏上的“LED灯”自然也

要有一个驱动芯片。可是你并不会发现有什么芯片,那是因为生产商把驱动芯片嵌到玻璃片当中了,就在显示区域的

正下方。这种设计工艺叫COG,很多LCD液晶屏也采用过这种设计。OLED屏驱动芯片的型号有很多种,我们这款用的

是SH1106芯片,你能在网上搜索到这款芯片的数据手册。驱动芯片的引脚非常多,主要是用来连接OLED屏阵列上的

“LED灯”,留给用户的接口并不多。DYS864模块的PCB上已经将驱动芯片的外围电路做好了,留给你使用的只有电

源、I2C总线和复位接口。你不需要了解复杂的驱动电路设计,只要把DYS864与单片机连接,专心于编程部分即可。

【图3】是DYS864模块的接口定义,【图4】是模块与单片机连接的电路图。其中模块的1和5脚是VCC和GND,接

3V或5V电源(我用的是5V)。2和3脚是I2C总线接口,与单片机的I/O接口连接。我使用的是STC12C5A32S2型

单片机,其内部没有I2C的硬件控制器,要用软件模拟I2C总线。模拟程序部分我已经写好了,在源程序里直接调用。

【图4】中所画的两个4.7KΩ电阻是I2C总线设计时必须的上拉电阻,它能让没有强上拉能力的单片机在模拟总线时

保持很好的稳定性,不过我们使用的

STC12系列单片机有强上拉能力,所以电阻可省去不接。最后,模块上的4脚(RST)

是复位引脚,如果你想用单片机随时控制OLED模块重新复位初始化,可把第4脚连到I/O接口上,I/O接口输出低电

平时屏幕复位。不过在我们的使用当中用不到复位,所以第4脚可不接。如此一来,不需要接电阻,不需要接复位,

把2根电源线和2根I2C总线接到单片机上就行了。如果你有其他I2C总线模块也可以挂在同一条总线上,电路制作

十分简单!

【图3】DYS864模块接口定义

4

/10

OLED屏的驱动与使用

【图4】DYS864模块与单片机连接电路图

【模块初始化与功能设置】

要想点亮OLED屏模块,编程部分是关键。幸好我已经写好了一套示例程序,你可以在《无线电》杂志的官方网站上找

到下载链接。【图5】这是名为“OLED12864”的一套KEIL4工程文件,打开工程文件可以看到名为OLED12864.c的

主程序,还有VIIC_C51.c的I2C总线模拟程序。这里我们重点讲解OLED12864.c。在主程序里还包含了4个头文件,

stc12c5a60s2.h是单片机头文件,dys864testpic.h和pic2.h是全屏图片显示时所用的图片数据表,ascii.h是显示英文、

数字、符号用的数据表,cc.h是显示汉字用的数据表。也就是说,接下来我会讲到如何用DYS864模块显示全屏图片、

英文和汉字内容,但在此之前必须先让模块初始化,设定好屏幕的相关参数,然后才能开始显示。

【图5】工程文件的内容

5

/10

OLED屏的驱动与使用

【程序1】DYS864模块初始化程序

void OLED_INIT (void){//DYS864模块初始化程序

unsigned char buf[]={//以下是初始设置参数

0xae,//【0xae:关显示,0xaf:开显示】

0xd5,0x80,//显示时钟频率(不要改动)

0xa8,0x3f,//复用率(不要改动)

0xd3,0x00,//显示偏移(不要改动)

0x40,//显示开始线

0x8d,0x14,//VCC电源(不要改动)

0xa1,//设置段重新映射(不要改动)

0xc8,//COM输出方式(不要改动)

0xda,0x12,//COM输出方式(不要改动)

0x81,0xff,//对比度【指令:0x81,数据:0到0xff(最高)】

0xd9,0xf1,//充电周期(不要改动)

0xdb,0x30,//VCC电压输出(不要改动)

0x20,0x00,//水平寻址设置

0xa4,//【0xa4:正常显示,0xa5:整体点亮】

0xa6,//【0xa6:正常显示,0xa7:反色显示】

0xaf//【0xae:关显示,0xaf:开显示】

};

RET=0;//OLED复位

DELAY_MS (50);

RET=1; //复位脚放开

DELAY_MS (50);

ISendStr(OLED12864_ADD,COM,buf,25);//写入25个字节的初始设置参数

}

【程序1】是DYS864模块的初始化程序,其内容是将25个指令写入OLED屏的驱动芯片。这些指令能让显示屏调整

到正常的工作状态,就好像新买的手机需要先设置好铃声、音量、亮度一样,是一个初始的过程。【程序1】里已经把

每一个指令后面加了解释,有兴趣可以看一下,要想了解更深层的意思,就要看驱动芯片的数据手册了。虽然手册是

英文的,但还是不难看懂的。但请注意,如果不明白的指令就不要改动。其中“0x81,0xff”(双字节指令,对比度调

节)可以根据你的喜好调下对比度(也就是亮度),后一个字节的值从0x00到0xff,一共256级对比度调整。写入25

个字节数据之前,程序先给复位引脚一个低电平,让显示屏复位。不过上电时DYS864模块内部的复位电路已经使它复

位一次了,所以不接复位引脚也没关系。写入指令后,显示屏就准备就绪,可以写入内容了。

【全屏图片显示方法】

和LCD屏幕一样,OLED也能全屏显示单色图片。这里介绍两种全屏图片显示的方法,第一种是用同一个数据复位写满

全屏。【程序2】是单字节数据重复写入全屏的程序,它是写入0xff也就是所有点全亮的效果,如【图6】所示。在【程

序2】中分析,实现起来并不难,只要用for循环,重复写入0xff这个数据1024次,每次写入后驱动芯片会自动将写

入点移到下一格,所以我们不用考虑换行的问题。

【程序2】单字节数据的全屏写入

6

/10

OLED屏的驱动与使用

//全屏固定像素写入示例

ISendStr2(OLED12864_ADD,COM,0xB0);//从第1页开始写入

for(i=0;i<1024;i++){//写入满屏1024个字节

ISendStr2(OLED12864_ADD,DAT,0xff);//写入0xff

}

【图6】单字节数据全屏写入效果

第二种是将一幅128x64的单色无灰度图片转换成数据表,再从数据表中读取显示。这是常用的方式,多用于开机画面

等静态内容的显示。单色图片的生成方法很简单,首先在网上找到想要的单色图片,再用画板软件或其他图片处理软

件将像素变成128x64,保存为单色BMP位图。然后用图片取模软件打开位图,转成数据表。【图7】是我用一款常用

的取模软件,将参数中的像素设置为128和64,打开图片,然后点击“数据保存”。把文件保存为头文件(.h)。【图8】

所示是最终改好后,可编译的数据表文件,大家可以参考示例程序。

【图7】设置并调整图片

7

/10

OLED屏的驱动与使用

【图8】导出的图片数据表

有了图片数据表,接下来就是在主程序里调用数据表送入OLED屏显示。【程序3】是两幅图片以1秒间隔切换显示的

程序。首先是发送一条指令0xB0,表示图片从第1页首位置开始显示。之后是1024次for循环,把数据表写入显示

屏。在for循环里面是数据表发送程序,每一个图片都有自己的数据表名称(nBitmapDot[ ]和PIC2[ ]),要显示那个图

片,就改成对应的数据表名称就行了。这里注意,数据表的取模时一定要设置成128x64像素,不然与屏幕不匹配会产

生乱码。【图9】是小车图片的显示效果。

【程序3】写入全屏图片的程序

ISendStr2(OLED12864_ADD,COM,0xB0);//从第1页开始写入

for(i=0;i<1024;i++){//写入整屏图案(DYS864测试)

ISendStr2(OLED12864_ADD,DAT,nBitmapDot[i]);//写入数据

}

DELAY_MS (1000);//显示停留1秒

ISendStr2(OLED12864_ADD,COM,0xB0); //从第1页开始写入

for(i=0;i<1024;i++){//写入整屏图案(MY CAR)

ISendStr2(OLED12864_ADD,DAT,PIC2[i]); //写入数据

}

DELAY_MS (1000);//显示停留1秒

【图9】写入全屏图片的效果

8

/10

OLED屏的驱动与使用

【中英文字符的显示方法】

除了全屏图片显示之外,在屏幕指定位置显示文字也是必须要掌握的。从前面的学习中能看出OLED与传统LCD屏的

差异不大。但这款屏没有内部字库,不论是英文还是汉字,都要事先取模并导出数据表。大家可以把文字的显示理解

成小像素的图片,一个汉字的像素是16x16,一个英文或数字的像素是8x16。虽然你也可以设计更大尺寸的字体,但

字越大显示的内容越少,所以在开发之前你要多试验一下字体的大小。首先来为英文和数字所在的ASCII码取模吧。如

【图10】所示,在取模软件里选择ASCII码,字库选择8x16,数据排列选择“从左到右从上到下”,取模方式选择“从

向8点下高位”。点击“确定参数”后,会出现“ASC”的按键,点击可打开ASCII字库。把字库内容复制到头文件ASCII.h

里,因为ASCII码字库内容并不多,全部复制到工程里也不会占太多空间。汉字的取模占用空间大,所以只能用什么字

只取相应字的数据。【图11】是汉字取模的设置参数和输出的数据表,注意在字库中要选择“粗宋16点阵”,只有这

个字体在小屏幕上能清楚看到。然后在软件下方的输入框中输入你想要显示的汉字,如果汉字有重复,取模软件会自

动只取一次。我们这里只是测试,于是我写了“汉字显示测试”几个字,然后点击“输入字串”按钮。在弹出的数据

表窗口中可看到取出的数据,把数据表复制保存到cc.h文件中,结果就得到【图12】所示的汉字内容数据。注意原数

据表中的汉字部分要加//屏蔽。

【图10】设置并导出ASCII码数据表

【图11】设置并导出汉字数据表

9

/10

OLED屏的驱动与使用

【图12】导出到工程里的数据表格式

接下来是调用ASCII和汉字到屏幕上显示,这里我设计了2个子程序:lcm_ascii();和lcm_cc();。分别用于ASCII及汉字

的显示。【程序4】是显示英文“OLED”和数字“0.96’”的程序,lcm_ascii();中需要3个参数,分别是显示页位置、显

示列位置和文字在数据表中的序号。在【程序4】中先设置了一个开始列位置s=16和开始页(行)位置d=0xB2,表

示从第3页左数第16列开始写文字。修改这两个初始值可以把文字放在任何位置。接下来是文字的写入,在参数中会

看到“s+8*0”这样的算法。S是开始位置,随后的每一个字符都向后窜8*n个列,这样就使文字从左到右依次排列了。

参数最后一项中的“47、44、37、36”是在ASCII.h文件中,字符在数据表中的顺序号。怎么知道哪一个序号对应哪

一个符号呢?这就要你给每个符号标上序号,想显示哪个字符就输入哪个序号。汉字的显示方法和ASCII码基本相同,

只是汉字点用更大的像素位置。所以在汉字和英文混合显示时做特别注意它们的差异。【程序5】是汉字显示的程序部

分,可以看出在参数上s+16*0中的移动基数是16了,其他部分基本不变。

【程序4】ASCII码显示程序

s = 16;//列位置(0~255)

d = 0xB2;//页位置(0xB0~0xB7)

lcm_ascii(d,s+8*0,47);//OLED

lcm_ascii(d,s+8*1,44);

lcm_ascii(d,s+8*2,37);

lcm_ascii(d,s+8*3,36);

lcm_ascii(d,s+8*5,16); //0.96'

lcm_ascii(d,s+8*6,14);

lcm_ascii(d,s+8*7,25);

lcm_ascii(d,s+8*8,22);

lcm_ascii(d,s+8*9,7);

【程序5】汉字显示程序

s = 8;//列位置(0~255)

d = 0xB4;// 页位置(0xB0~0xB7)

lcm_cc(d,s+16*0,0);//汉字显示测试

lcm_cc(d,s+16*1,1);//

lcm_cc(d,s+16*2,2);//

lcm_cc(d,s+16*3,3);//

lcm_cc(d,s+16*4,4);//

lcm_cc(d,s+16*5,5);//

10

/10

OLED屏的驱动与使用

【图13】ASCII码及汉字显示效果

【图13】是ASCII与汉字分两行显示的效果。效果之所以很棒也得利于OLED屏自发光的特性,只有文字发光,很有

未来科技感。同时你还可以自己定义新的字库,比如我正要使用OLED屏设计的运动手表,想让时间显示别具特色,需

要设计每一个数字的形状,再取模导成数据表。其实OLED屏是个开放的显示模块,就像驱动LED点阵屏一样,可以

做各种操作。同时它低功耗和小体积的特点,也能让你尽情发挥创意,制作出让人意想不到的新东西。我所知道的OLED

屏驱动和显示技巧大概就是这些,你可以在《无线电》网站上下载到我写的源程序。没有想到OLED显示技术这么快就

到了我们电子爱好者手里,热爱前沿显示技术的小家伙们,快来过把瘾吧。


本文标签: 显示驱动屏幕数据表图片