第十四章 OLED试验 本次试验目的是通过W7500EVB的SPI总线实现与OLED屏通信。将会利用W7500EVB的 PB0,PB1,PB2,PB3管脚和SPI总线的通信管脚来点亮OLED屏,实现字符显示。
本章分为如下几个部分:
14.1 OLED 简介
14.2 硬件设计
14.3 软件设计
14.4 下载验证
14.1 OLED 简介OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(OrganicElectroluminesence Display, OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。LCD 都需要背光,而 OLED 不需要,因为它是自发光的。这样同样的显示,OLED效果要来得好一些。以目前的技术, OLED 的尺寸还难以大型化,但是分辨率确可以做到很高,如图14.1.1所示:
在本章中,我们使用的是 OLED 显示模块,该模块有以下特点:
1) 模块有单色和双色两种可选,单色为纯蓝色,而双色则为黄蓝双色。
2) 尺寸小,显示尺寸为 0.96 寸,而模块的尺寸仅为 27mm*26mm 大小。
3) 高分辨率,该模块的分辨率为 128*64。
4) 多种接口方式,该模块提供了总共 5 种接口包括:6800、8080 两种并行接口方式、3线或 4 线的串行 SPI 接口方式、IIC 接口方式(只需要 2 根线就可以控制 OLED 了!)。
5) 不需要高压,直接接 3.3V 就可以工作了。 图14.1.1 0.96寸OLED正反面图 OLED 模块的接口方式需要如下一些信号线:
CS: OLED 片选信号。
SCK:时钟线。
SDA:数据线。
RST(RES):硬复位 OLED。
DC:命令/数据标志(0,读写命令; 1,读写数据)。 在 4 线 SPI 模式下,每个数据长度均为 8 位,在 SCK 的上升沿,数据从 SDA 移入到SSD1306,并且是高位在前的。 DC 线是用作命令/数据的标志线。写操作的时序如图14.1.2所示: 图14.1.2 SPI通信时序图 接下来,介绍一下模块的显存, SSD1306 的显存总共为 128*64bit 大小, SSD1306 将这些显存分为了 8 页,如图14.1.3所示: 图14.1.3 OLED模块的显存 可以看出, SSD1306 的每页包含了128个字节,总共 8 页,这样刚好是 128*64 的点阵大小。因为每次写入都是按字节写入的,这就存在一个问题,如果使用只写方式操作模块,那么,每次要写8个点,这样,在画点的时候,就必须把要设置的点所在的字节的每个位都搞清楚当前的状态(0/1),否则写入的数据就会覆盖掉之前的状态,结果就是有些不需要显示的点,显示出来了,或者该显示的没有显示了。这个问题在能读的模式下,可以先读出来要写入的那个字节,得到当前状况,在修改了要改写的位之后再写进 GRAM,这样就不会影响到之前的状况了。但是这样需要能读 GRAM,对于 3 线或 4 线 SPI 模式,模块是不支持读的,而且读->改->写的方式速度也比较慢。所以采用的办法是在 W7500 的内部建立一个 OLED 的 GRAM(共128*8个字节),在每次修改的时候,只是修改 W7500 上的 GRAM(实际上就是 SRAM),在修改完了之后,一次性把 W7500 上的 GRAM 写入到 OLED 的 GRAM。这里仅介绍几个比较常用的命令,如图14.1.4所示: 图14.1.4 OLED常用的命令 第一个命令为 0X81,用于设置对比度的,这个命令包含了两个字节,第一个 0x81 为命令,随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。 第二个命令为 0XAE/0XAF。 0XAE 为关闭显示命令; 0XAF 为开启显示命令。 第三个命令为 0X8D,该指令也包含2个字节,第一个为命令字,第二个为设置值,第二个字节的 BIT2 表示电荷泵的开关状态,该位为 1,则开启电荷泵,为 0 则关闭。在模块初始化的时候,这个必须要开启,否则是看不到屏幕显示的。 第四个命令为 0XB0~B7,该命令用于设置页地址,其低三位的值对应着 GRAM 的页地址。 第五个指令为 0X00~0X0F,该指令用于设置显示时的起始列地址低四位。 第六个指令为 0X10~0X1F,该指令用于设置显示时的起始列地址高四位。 最后,再来介绍一下 OLED 模块的初始化过程,SSD1306 的典型初始化框图,如图14.1.5所示:
图14.1.5 OLED初始化流程图 驱动 IC 的初始化代码,直接使用厂家推荐的设置就可以了,只要对细节部分进行一些修改,使其满足自己的要求即可,其他不需要变动。OLED 的介绍就到此为止,我们重点向大家介绍了 OLED 模块的相关知识,接下来将使用这个模块来显示字符和数字。通过以上介绍,可以得出 OLED 显示需要的相关设置步骤如下: 1 设置 W7500 与 OLED 模块相连接的 IO。 这一步,先将与 OLED 模块相连的 IO 口设置为输出,具体使用哪些 IO 口,这里需要根据连接电路以及 OLED 模块所设置的通讯模式来确定。这些将在硬件设计部分向大家介绍。 2 初始化 OLED 模块。 其实这里就是上面的初始化框图的内容,通过对 OLED 相关寄存器的初始化,来启动 OLED的显示。为后续显示字符和数字做准备。 3 通过函数将字符和数字显示到 OLED 模块上。 这里就是通过设计的程序,将要显示的字符送到 OLED 模块就可以了,这些函数将在软件设计部分向大家介绍。 通过以上三步,就可以使用 OLED 模块来显示字符和数字了。 14.2 硬件设计本实验用到的硬件资源有: 1) OLED模块 OLED 模块的电路在前面已有详细说明了,这里介绍一下 OLED 模块与W7500EVB的连接。开发板的 OLED 接口(U3接口) 和 OLED 模块直接可以对插,如图14.2.1所示: 14.2.1 W7500EVB OLED排针原理图 0.96"OLED屏接W7500的SPI1硬件接线定义 OLED_SCK ---> W7500_PB1 OLED屏的时钟管脚 OLED_SDA ---> W7500_PB3 OLED屏的数据传输管脚 OLED_RES ---> W7500_PB2 OLED屏的复位管脚
低电平时对模块进行复位操作,运行中应一直处于高电平 OLED_DC ---> W7500_PB0 OLED屏的数据/命令管脚
低电平时传输的是数据,高电平时传输的是指令 OLED_CS ---> GND OLED屏的片选管脚
低电平时对模块操作有效,高电平时对模块操作无效 14.3 软件设计在W7500EVB OLED试验中可以发现 user文件下面有一个 oled.c 文件,同时包含了头文件 oled.h。 oled.c 的代码,由于比较长,这里我们就不贴出来了,仅介绍几个比较重要的函数。首先是 OLED_Init 函数,该函数的结构比较简单,开始是对 IO 口的初始化,其他就是一些初始化序列了,按照厂家提供的资料来做就可以。最后要说明一点的是,因为 OLED 是无背光的,在初始化之后,把显存都清空了,所以在屏幕上是看不到任何内容的,跟没通电一个样,不要以为这就是初始化失败,要写入数据模块才会显示的。 OLED_Init 函数代码如下: - void OLED_Init(void)
- {
- OLED_GPIO_init();
- OLED_RES();
- delay_ms(100);
- OLED_SPI_DATA(0xAE,0);
- OLED_SPI_DATA(0x20,0);
- OLED_SPI_DATA(0x10,0);
- OLED_SPI_DATA(0xb0,0);
- OLED_SPI_DATA(0xc8,0);
- OLED_SPI_DATA(0x00,0);
- OLED_SPI_DATA(0x10,0);
- OLED_SPI_DATA(0x40,0);
- OLED_SPI_DATA(0x81,0);
- OLED_SPI_DATA(0xff,0);
- OLED_SPI_DATA(0xa1,0);
- OLED_SPI_DATA(0xa6,0);
- OLED_SPI_DATA(0xa8,0);
- OLED_SPI_DATA(0x3F,0);
- OLED_SPI_DATA(0xa4,0);
- OLED_SPI_DATA(0xd3,0);
- OLED_SPI_DATA(0x00,0);
- OLED_SPI_DATA(0xd5,0);
- OLED_SPI_DATA(0xf0,0);
- OLED_SPI_DATA(0xd9,0);
- OLED_SPI_DATA(0x22,0);
- OLED_SPI_DATA(0xda,0);
- OLED_SPI_DATA(0x12,0);
- OLED_SPI_DATA(0xdb,0);
- OLED_SPI_DATA(0x20,0);
- OLED_SPI_DATA(0x8d,0);
- OLED_SPI_DATA(0x14,0);
- OLED_SPI_DATA(0xaf,0);
- OLED_CLS();
- }
复制代码在OLED初始化里有用到OLED_SPI_DATA,OLED_SPI_DATA函数是用来发送数据的,可以选择发送的是命令还是数据。 - void OLED_SPI_DATA(uint8 data,uint8 cod);
复制代码 OLED_SPI_DATA函数的第一个传参是需要发送的数据,第二个传参是选择发送的数据为命令还是数据。如果要将坐标改成左上脚的第一个点上,可以调用OLED_SPI_DATA函数来发送以下命令: - OLED_SPI_DATA((0xB0 + x),0); //x = 0
- OLED_SPI_DATA((0x0F & y),0); //y = 0
- OLED_SPI_DATA(0x10 | (0xF0 & y),0);
复制代码其中 x 的范围为: 0~127; y 的范围为: 0~63。 画点函数OLED_DrawPoint函数代码如下: - void OLED_DrawPoint(uint8_t x,uint8_t y,uint8_t data)
- {
- OLED_SPI_DATA(0xB0 + x,0);
- OLED_SPI_DATA(0x0F & y,0);
- OLED_SPI_DATA(0x10 | (0xF0 & y),0);
- OLED_SPI_DATA(data,1);
- }
复制代码OLED_DrawPoint函数有3个参数,前两个是坐标,第三个 data 为要写入 1 还是 0。该函数实现了在 OLED模块上任意位置画点的功能。 在介绍完画点函数之后,再介绍一下显示字符函数,在介绍之前,先来看一下字符(ASCII 字符集)是怎么显示在 OLED 模块上去的。要显示字符,先要有字符的点阵数据, ASCII 常用的字符集总共有95个,从空格符开始,分别为: ! " # $ % & ' ( ) * + , - 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h I j k l m n o p q r s t u v w x y z { | } ~ . 先要得到这个字符集的点阵数据,这里使用的字符提取软件为:PCtoLCD2002 完美版,如图14.3.1所示: 图14.3.1 取摸软件 然后选择设置,在设置里面设置取模方式,如图14.3.2所示: 图14.3.2 取摸软件设置图 在知道了取模方式之后,就可以根据取模的方式来编写显示字符的代码了,这里针对以上取模方式的显示字符代码如下: - void OLED_ASCII(uint8 x,uint8 y,uint16 site)
- {
- uint8 i;
- for(i = 0;i < 16;i++)
- {
- if((i % 8) == 0)
- {
- if(i != 0)
- x++;
- OLED_SPI_DATA(0xB0 + x,0);
- OLED_SPI_DATA(0x10 | ((0xF0 & y) >> 4),0);
- OLED_SPI_DATA((0x0F & y) | 0x01,0);
- }
- OLED_SPI_DATA(ASCII_8x16[i + site],1);
- }
- }
复制代码该函数为字符以及字符串显示的核心部分,函数中 chr=chr-' ';这句是要得到在字符点阵数据里面的实际地址,因为我们的取模是从空格键开始的,例如 oled_asc2_1206[0][0],代表的是空格符开始的点阵码。在接下来的代码,也是按照从上到小,从左到右的取模方式来编写的,先得到最高位,然后判断是写 1 还是 0,画点。接着读第二位,如此循环,直到一个字符的点阵全部取完为止。这其中涉及到列地址和行地址的自增,根据取模方式来理解,就不难了。 最后来看看主函数源码: - int main()
- {
- SystemInit(); /* 系统内部时钟初始化 */
- delay_init(); /* 系统滴答时钟配置*/
- UART_Configuration(); /*初始化串口通信:115200@8-n-1*/
- SSP_Configuration(); /* SPI0配置初始化 */
- OLED_Init(); /* OLED屏配置初始化 */
- /*------------------------------------------------------------------
- | 炜世科技—WIZnet W7500官方代理商,全程技术支持,价格绝对优势! |
- ------------------------------------------------------------------*/
- OLED_Show_Hybrid(0,0,(uint8*)"炜世科技W7500EVB\r\n OLED");
- while(1)
- ;
- }
复制代码 14.4 下载验证将代码下载到W7500EVB 开发板后,可以看到OLED 模块显示,如图14.4.1所示: 图14.4.1 W7500EVB OLED试验结果 通过这一章的学习,我们学会了OLED 模块的使用。在调试代码的时候,又多了一种显示信息的途径,在以后的程序编写中,大家可以好好利用。
|