Arduino案例实操 -- OLED中文显示(IIC)

OLED(OrganicLight-Emitting Diode),又称为有机电激光显示、有机发光半导体(OrganicElectroluminesence Display,OLED)。

一、基础知识

1.OLED

OLED属于一种电流型的有机发光器件,是通过载流子的注入和复合而致发光的现象,发光强度与注入的电流成正比。OLED在电场的作用下,阳极产生的空穴和阴极产生的电子就会发生移动,分别向空穴传输层和电子传输层注入,迁移到发光层。当二者在发光层相遇时,产生能量激子,从而激发发光分子最终产生可见光。
在这里插入图片描述
一般而言,OLED可按发光材料分为两种:小分子OLED高分子OLED(也可称为PLED)
OLED是一种利用多层有机薄膜结构产生电致发光的器件,它很容易制作,而且只需要低的驱动电压,这些主要的特征使得OLED在满足平面显示器的应用上显得非常突出。OLED显示屏比LCD更轻薄、亮度高、功耗低、响应快、清晰度高、柔性好、发光效率高,能满足消费者对显示技术的新需求。全球越来越多的显示器厂家纷纷投入研发,大大的推动了OLED的产业化进程。

2.分类

1)从器件结构上进行分类

OLED,是一种有机电致发光器件,由比较特殊的有机材料构成的,按照其结构的不同可以将其划分为四种类型,即单层器件、双层器件、三层器件以及多层器件。
(1)单层器件
单层器件也就是在器件的正、负极之间接入一层可以发光的有机层,其结构为衬底/ITO/发光层/阴极。在这种结构中由于电子、空穴注入、传输不平衡,导致器件效率、亮度都较低,器件稳定性差。
(2)双层器件
双层器件是在单层器件的基础上,在发光层两侧加入空穴传输层(HTL)或电子传输层(ETL),克服了单层器件载流子注入不平衡的问题,改善了器件的电压-电流特性,提高了器件的发光效率。
(3)三层器件
三层器件结构是应用最广泛的一种结构,其结构为衬底/ITO/HTL/发光层/ETL/阴极。这种结构的优点是使激子被局限在发光层中,进而提高器件的效率。
(4)多层结构
多层结构的性能是比较好的一种结构,其能够很好的发挥各个层面的作用。发光层也可以由多层结构组成,由于各发机层之间相互独立,可以分别优化。因此,这种结构能充分发挥各有机层的作用,极大地提高了器件设计的灵活性。

2)从驱动方式上进行分类

OLED按照驱动方式来划分,一般分为两种,一种是主动式,一种是被动式。主动式的一般为有源驱动,被动式的为无源驱动。在实际的应用过程中,有源驱动主要是用于高分辨率的产品,而无源驱动主要应用在显示器尺寸比较小的显示器中。

3)从材料上进行分类

构成OLED的材料主要是有机物,可根据有机物的种类划分,一种为小分子,另一种是高分子。这两种器件的主要差别在制作工艺上,小分子器件主要采用的是真空热蒸发工艺,高分子器件采用的是旋转涂覆或者是喷涂印刷工艺。

3.结构

OLED器件由基板、阴极、阳极、空穴注入层(HIL)、电子注入层(EIL)、空穴传输层(HTL)、电子传输层(ETL)、电子阻挡层(EBL)、空穴阻挡层(HBL)、发光层(EML)等部分构成。其中,基板是整个器件的基础,所有功能层都需要蒸镀到器件的基板上;通常采用玻璃作为器件的基板,但是如果需要制作可弯曲的柔性OLED器件,则需要使用其它材料如塑料等作为器件的基板。阳极与器件外加驱动电压的正极相连,阳极中的空穴会在外加驱动电压的驱动下向器件中的发光层移动,阳极需要在器件工作时具有一定的透光性,使得器件内部发出的光能够被外界观察到;阳极最常使用的材料是ITO。空穴注入层能够对器件的阳极进行修饰,并可以使来自阳极的空穴顺利的注入到空穴传输层;空穴传输层负责将空穴运输到发光层;电子阻挡层会把来自阴极的电子阻挡在器件的发光层界面处,增大器件发光层界面处电子的浓度;发光层为器件电子和空穴再结合形成激子然后激子退激发光的地方;空穴阻挡层会将来自阳极的空穴阻挡在器件发光层的界面处,进而提高器件发光层界面处电子和空穴再结合的概率,增大器件的发光效率;电子传输层负责将来自阴极的电子传输到器件的发光层中;电子注入层起对阴极修饰及将电子传输到电子传输层的作用;阴极中的电子会在器件外加驱动电压的驱动下向器件的发光层移动,然后在发光层与来自阳极的空穴进行再结合。
在这里插入图片描述

4.发光原理

OLED器件的发光过程可分为:电子和空穴的注入、电子和空穴的传输、电子和空穴的再结合、激子的退激
发光。具体为:
(1)电子和空穴的注入
处于阴极中的电子和阳极中的空穴在外加驱动电压的驱动下会向器件的发光层移动,在向器件发光层移动的过程中,若器件包含有电子注入层和空穴注入层,则电子和空穴首先需要克服阴极与电子注入层及阳极与空穴注入层之间的能级势垒,然后经由电子注入层和空穴注入层向器件的电子传输层和空穴传输层移动;电子注入层和空穴注入层可增大器件的效率和寿命。关于OLED器件电子注入的机制还在不断的研究当中,目前最常被使用的机制是穿隧效应和界面偶极机制。
(2)电子和空穴的传输
在外加驱动电压的驱动下,来自阴极的电子和阳极的空穴会分别移动到器件的电子传输层和空穴传输层,电子传输层和空穴传输层会分别将电子和空穴移动到器件发光层的界面处;与此同时,电子传输层和空穴传输层分别会将来自阳极的空穴和来自阴极的电子阻挡在器件发光层的界面处,使得器件发光层界面处的电子和空穴得以累积。
(3)电子和空穴的再结合
当器件发光层界面处的电子和空穴达到一定数目时,电子和空穴会进行再结合并在发光层产生激子。
(4)激子的退激发光
在发光层处产生的激子会使得器件发光层中的有机分子被活化,进而使得有机分子最外层的电子从基态跃迁到激发态,由于处于激发态的电子极其不稳定,其会向基态跃迁,在跃迁的过程中会有能量以光的形式被释放出来,进而实现了器件的发光。
在这里插入图片描述
OLED的知识了解个大概就行,我猜你们更想看的是案例源码,马上安排

二、案例实操

1.实验器材

  • Arduino主板 *1
  • OLED模块(IIC)
  • 杜邦线若干
  • 取字模软件

OLED模块是用常见的0.96寸的12864,还是比较容易找到的

2.模块接线

Arduino主板 OLED模块
VCC(5V) VCC
GND GND
SDA SDA
SCL SCL

剩下的就是Arduino主板的供电了,就这么简单

3.实验源码

demo1 - 使用U8glib库显示

较早前做的案例了,需要先用取字模软件生成字库代码,博主用的是PCtoLCD2002完美版,也是比较容易能找到的,顺便说下操作,打开取字模软件,在菜单栏“模式”中选择字符模式。
在这里插入图片描述
随后进行字模选项设置,菜单栏“选项”,或单击菜单栏齿轮图案。
在这里插入图片描述
选项部分如下图配置就行,取模走向如果在显示的时候发现镜像了就选另一个再生成字库更新就行,需要注意的事自定义格式的内容(C51格式),数据前后缀要改成图中那样,这样生成的字库数据直接复制就行
在这里插入图片描述
回到软件界面,在字符输入框键入需要显示的字符或中文,键入内容后点击生成字模,可在下方输出框中看到生成的字库代码,以单个字母或者单个文字区分开了。
在这里插入图片描述
编写代码之前需要在IDE安装OLED对应的显示库U8glib,可以直接安装或者通过解压ZIP的方式调用,安装U8glib库的方式可参考博文 - Arduino IDE – 安装TimerOne库

成功添加U8glib资源库后,在程序的第一行加入OLED显示屏的相关头文件,并初始化一个OLED显示屏的可用对象u8g,案例中所用的OLED为I2C接线的,在初始化参数中可以看到I2C相关字样,OLED类型SSD1306。
在这里插入图片描述
随后把取字模软件生成的字库代码复制出来,包装成字符数组添加到代码中,如下图,命名 logo0_glcd_bmp [] ,注意这里一个数组只表示一个字母或汉字,在生成的字库代码中每个字母汉字的代码都是分开,很好操作
在这里插入图片描述
像上面的“世界你好”四个字就写成4个数组,注意数组命名不能一样
在setup函数中,调用库函数执行文字显示,在U8glib库中,执行任何屏幕相关显示都需要调用到两个函数:firstPage()nextPage();格式如下
在这里插入图片描述
firstPage 函数作用:表示图像循环的开始,nextPage函数作用:返回0时表示图像循环的结束;这两个函数一般是配 do...while() 循环来使用,而描绘OLED的每个点位则是用 drawBitmapP() 函数。显示一个字母或汉字的代码如下
在这里插入图片描述
完整代码(OLED显示“世界你好”)

//添加OLED显示屏头文件
#include "U8glib.h"
//创建u8g对象
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);
//文字 - 世 数组
const static unsigned char  logo0_glcd_bmp [] U8G_PROGMEM ={
    
     
0x02,0x20,0x12,0x20,0x12,0x20,0x12,0x20,0x12,0x20,0xFF,0xFE,0x12,0x20,0x12,0x20,
0x12,0x20,0x12,0x20,0x13,0xE0,0x10,0x00,0x10,0x00,0x10,0x00,0x1F,0xFC,0x00,0x00,
};
//文字 - 界 数组
const static unsigned char logo1_glcd_bmp[] U8G_PROGMEM = {
    
    
0x00,0x00,0x1F,0xF0,0x11,0x10,0x11,0x10,0x1F,0xF0,0x11,0x10,0x11,0x10,0x1F,0xF0,
0x02,0x80,0x0C,0x60,0x34,0x58,0xC4,0x46,0x04,0x40,0x08,0x40,0x08,0x40,0x10,0x40
};
//文字 - 你 数组
const static unsigned char logo2_glcd_bmp[] U8G_PROGMEM = {
    
    
0x08,0x80,0x08,0x80,0x08,0x80,0x11,0xFE,0x11,0x02,0x32,0x04,0x34,0x20,0x50,0x20,
0x91,0x28,0x11,0x24,0x12,0x24,0x12,0x22,0x14,0x22,0x10,0x20,0x10,0xA0,0x10,0x40,
};
//文字 - 好 数组
const static unsigned char logo3_glcd_bmp[] U8G_PROGMEM = {
    
    
0x10,0x00,0x10,0xFC,0x10,0x04,0x10,0x08,0xFC,0x10,0x24,0x20,0x24,0x20,0x25,0xFE,
0x24,0x20,0x48,0x20,0x28,0x20,0x10,0x20,0x28,0x20,0x44,0x20,0x84,0xA0,0x
00,0x40, 
};

//setup函数,做文字显示
void setup()
{
    
    
	u8g.firstPage();
	do{
    
    
		u8g.drawBitmapP(0,0,2,16,logo0_glcd_bmp);
		u8g.drawBitmapP(16,0,2,16,logo1_glcd_bmp);
		u8g.drawBitmapP(32,0,2,16,logo2_glcd_bmp);
		u8g.drawBitmapP(48,0,2,16,logo3_glcd_bmp);
	}while(u8g.nextPage());
}

void loop()
{
    
    

}

这里对 drawBitmapP() 函数做下介绍

定义:
void U8GLIB::drawXBMP(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h, const u8g_pgm_uint8_t *bitmap)
功能:
此函数是一个显示一个位图的方法。
参数:
x:位图左上角的横坐标
y:位图左上角的纵坐标
w:位图的宽
h:位图的高
*bitmap:位图对象

demo2 - 使用U8g2库显示

取字模软件的用法一样的,不同的是要安装的库是u8g2。
在这里插入图片描述

在这里插入图片描述
当需要显示的字体比较多导致字库代码比较多时,可以新建font.h文件放在.ino同路径调用就行,同样的用数组包装,这里就不整上来了
在这里插入图片描述
完整代码(串口字符串指令控灯,OLED显示LED状态)

#include <U8g2lib.h>              //OLED模块相关库
#include "font.h"                 //字库文件
 
#define LED_PIN 13                //定义LED引脚

//创建u8g类库对象
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, 21, 20, U8X8_PIN_NONE);

String str = "";                  //串口接收字符串变量

void setup() {
    
    
  // put your setup code here, to run once:
  u8g2.begin();                           //OLED初始化
  Serial.begin(115200);                    //串口波特率初始化
  pinMode(LED_PIN,OUTPUT);                //LED引脚初始化
  u8g2.clearBuffer();                     	//清屏
  u8g2.setFont(u8g2_font_gb16st_t_2);    // 选择字体
  u8g2.drawXBMP(16,24,8,16,State1);      //字串 LED测试程序
  u8g2.drawXBMP(24,24,8,16,State2);
  u8g2.drawXBMP(32,24,8,16,State3);
  u8g2.drawXBMP(40,24,8,16,State4);
  u8g2.drawXBMP(48,24,16,16,Test1);
  u8g2.drawXBMP(64,24,16,16,Test2);
  u8g2.drawXBMP(80,24,16,16,Test3);
  u8g2.drawXBMP(96,24,16,16,Test4);
  u8g2.sendBuffer();

  digitalWrite(LED_PIN,LOW);              //关闭LED
}

void loop() {
    
    
  //接收串口数据并赋值变量str
  if(Serial.available())
  {
    
    
    while(Serial.available())
    {
    
    
      str += (char)(Serial.read());
      delay(2);  
    }
  }

  //对比字符串进行LED状态控制
  if(str.equals("open"))
  {
    
    
    digitalWrite(LED_PIN,HIGH);
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_gb16st_t_2); // 字串 LED打开
    u8g2.drawXBMP(30,25,8,16,State1);
    u8g2.drawXBMP(38,25,8,16,State2);
    u8g2.drawXBMP(46,25,8,16,State3);
    u8g2.drawXBMP(54,25,8,16,State4);
    u8g2.drawXBMP(62,25,16,16,State5);
    u8g2.drawXBMP(78,25,16,16,State6);
    u8g2.sendBuffer();
  }
  if(str.equals("close"))
  {
    
    
    digitalWrite(LED_PIN,LOW);
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_gb16st_t_2); // 字串 LED关闭
    u8g2.drawXBMP(30,25,8,16,State1);
    u8g2.drawXBMP(38,25,8,16,State2);
    u8g2.drawXBMP(46,25,8,16,State3);
    u8g2.drawXBMP(54,25,8,16,State4);
    u8g2.drawXBMP(62,25,16,16,State7);
    u8g2.drawXBMP(78,25,16,16,State8);
    u8g2.sendBuffer();
  }
  str = "";                             		//清空变量str
}

定义:
u8g.drawXBMP(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h, const u8g_pgm_uint8_t *bitmap)
功能:
显示一个位图的方法
参数:
x:位图左上角的横坐标
y:位图左上角的纵坐标
w:位图的宽
h:位图的高
*bitmap:位图对象

4.实验结果

demo1

比较简单,上电后就直接显示了。
在这里插入图片描述
修改一下坐标汉字的显示位置又变了。
在这里插入图片描述

demo2

下载完程序,上电后,程序正常运行,OLED显示屏居中位置显示“LED 测试程序”,此时LED处于关闭状态。
在这里插入图片描述
打开Arduino IDE的串口监视器,因实验中涉及到串口输入的字符串对比,为了实验的正常运行,需要把串口监视器的数据发送配置修改一下,将“换行符”换成“没有结束符”。
在这里插入图片描述
在串口监视器发送字符串“open”到控制器中,控制器板载LED灯被打开,同时OLED屏幕显示“OLED 打开”。
在这里插入图片描述
串口监视器发送字符串“close”到控制器中,关闭控制器板载LED灯,同时OLED屏幕显示“OLED 关闭”。
在这里插入图片描述

三、结语

看过OLED的中文显示案例你应该知道该怎么去操作自己的OLED了,能显示中文之后,可以试试显示图片

遗留问题

虽然能成功显示中文了,但是都是单个汉字或单个字母的调用数组去显示,最近看到过别人用其他的取字模软件可以生成字串的字库代码,也就是好几个汉字生成了一个字库数组,只调用一次 drawXBMP 函数就能在OLED上面显示了好几个汉字,如果你知道怎么去实现这个操作,可以在评论区跟大伙分享一下~~

猜你喜欢

转载自blog.csdn.net/qq_36955622/article/details/105663196