原文链接:https://www.jianshu.com/p/7e54ebb387ee
OLED 屏幕作为一种新型的显示技术,其自身可以发光,亮度,对比度高,功耗低,在当下备受追捧。而在我们正常的显示调整参数过程中,我们越来越多的使用这种屏幕。我们使用的一般是分辨率为 128x64 ,屏幕尺寸为 0.96 寸。由于其较小的尺寸和比较高的分辨率,让它有着很好的显示效果和便携性。
基本信息 | 参数 |
---|---|
分辨率 | 128x64 |
电压 | 3.3V-5V |
协议 | IIC/SPI |
目前我们经常使用的 OLED 屏幕一般有两种接口,IIC 或者 SPI ,两者使用的通信协议稍有不同,这里以 SPI 协议的 OLED 屏幕为例,带来它的使用方法。
模块接口定义
名称 | 用途 |
---|---|
GND | 电源地 |
VCC | 电源正(3~5.5V) |
D0 | OLED 的 D0 脚,在 SPI 和 IIC 通信中为时钟管脚 |
D1 | OLED 的 D1 脚,在 SPI 和 IIC 通信中为数据管脚 |
RES | OLED 的 RES#脚,用来复位(低电平复位) |
DC | OLED 的 D/C#E 脚,数据和命令控制管脚 |
CS | OLED 的 CS#脚,也就是片选管脚 |
我们自己打板制作做的oled
一般OLED屏幕都会有一套相配套的程序库,我一般用的是中景园电子的库,因为他家的库移植比较方便,各种单片机都适用。
BMP.H 是存放的图片数据,也就是大家对一 BMP 图片取模的数据 Oledfont.H 主要是存放的字库数据,包含常用的字符和用户自己所取模的中文
OLED.C 主要是函数的操作大家使用前需要将其添加到自己的程序工程文档中。
OLED.H 这 个 主 要 是 函 数 说 明 和 管 脚 定 义
大家在使用前需要将以上几个文件添加到自己的单片机工程文档中,然后在进行进一步的修改。大家需要对文档中的一部分初始化内容进行更改适配:主要包括IO初始化,延时函数初始化,IO方向函数定义。
以51单片机为例
sbit OLED_CS=P1^4; //片选
sbit OLED_RST =P1^2;//复位
sbit OLED_DC =P1^3;//数据/命令控制
sbit OLED_SCL=P1^0;//时钟 D0(SCL)
sbit OLED_SDIN=P1^1;//D1(MOSI) 数据
上面五行是对接口管脚的定义,而下面的十行则是对管脚定义重新做了一次更为统一的定义,这种统一的定义极大的提高了程序的可移植性,这样只要前面五个脚的定义完成了,程序移植基本上就完成了。
#define OLED_CS_Clr() OLED_CS=0
#define OLED_CS_Set() OLED_CS=1
#define OLED_RST_Clr() OLED_RST=0
#define OLED_RST_Set() OLED_RST=1
#define OLED_DC_Clr() OLED_DC=0
#define OLED_DC_Set() OLED_DC=1
#define OLED_SCLK_Clr() OLED_SCL=0
#define OLED_SCLK_Set() OLED_SCL=1
#define OLED_SDIN_Clr() OLED_SDIN=0
#define OLED_SDIN_Set() OLED_SDIN=1;
而其他单片机还需要在 Oled_Init() 函数中加入对 IO 口初始化以及端口时钟初始化的相关代码,配置为自己将要使用的 IO 口,因为采用的是模拟 SPI,对 IO 口并没有太多的要求,只要不与其他 IO 口使用复用即可
例如在 STM32 单片机中,对 IO 口,输出模式,端口时钟等进行配置。
例如:将 PA4 , PA5 , PA7 , PB0 , PB1 配置为推挽输出,作为 OLED 的输出端口使用
void OLED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能A端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_4);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能B端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1);
... ... //其他的屏幕初始化代码
}
之后是硬件接线,SPI协议的屏幕有7根线,其中包括两根电源线,另外的五根线则需要和程序定义的SPI端口一一对应,连接到单片机或者树莓派等设备上。
完成以上工作之后,我们就可以调用相关函数,进行显示了。
实际编写
这里我们首先在main.c
文件里用#include”oled.h”
,方便我们进行函数调用,然后在main()
函数中,while(1)
前调用oled_init();
,对 oled 屏幕进行初始化,然后我们再调用oled_clear();
,完成屏幕初始化清屏。并在屏幕上打印出 ”Hello world“。
例:在屏幕上打印hello world!
#inlcude “oled.h”
int main()
{
timer_init();
oled_init();
oled_clear();
while(1)
{
oled_ShowString(0,0,"Hello World!");//前两位数字为字母显示在屏幕上的位置
}
}
显示效果
另外常用的函数包括:
OLED_ShowChar(u8 x,u8 y,u8 chr);//显示一个字符函数,参数为屏幕坐标位置,和字符值
OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size);//显示一个数字函数,参数为屏幕坐标,要显示的数字,这个数字的长度,显示数字的大小
OLED_ShowString(u8 x,u8 y, u8 *p);//显示一个字符串函数,参数为屏幕坐标,字符串的首地址指针
OLED_ShowCHinese(u8 x,u8 y,u8 no);//显示一个汉字,参数为屏幕坐标和在汉字字符库Oledfont.H中的字符数组
使用函数库中的函数实现显示图片,汉字
因为oled屏幕本身并没有图片库和汉字库,要显示汉字或者图片只能通过取模的方式来实现。
取模主要有三种一是图片、字符、汉字三种,取的原理是一样的。
打开 PCtoLCD2002.exe 软件
PCtoLCD2002
选择图形模式,打开一个BMP图片
字模设置
按图片所示进行设置
然后将得到的bmp模 数组放到BMP.h当中
最后在程序中调用Oled_Drawbmp();即可实现显示
代码:
int main()
{
Oled_init();
Oled_clear();
While(1)
{
Oled_Drawbmp(0,0,bmp1);
}
}
图片原始BMP文件
显示效果
字符的取模和图片取模方式类似,取好字模放到 oledfont.h
中,然后使用Oled_ShowChinese()
就可以了
OLED 还可以实现更多的显示功能,如描绘几何图形,实现动态波形显示,感兴趣的话可以在网上找到更多的相关资料,自己来实现,如果使用 Arduino 的话还有一个十分强大的 u8g2 库可以调用,实现强大的功能,同时这个库也很容易移植到其他平台使用,同样可以自己尝试,又时间的话后面我还会写一些关于这些绘图库的应用。
推荐给大家的开源库地址:
https://github.com/olikraus/u8g2
http://idown.win/category/pangpangoled%E5%9B%BE%E5%BD%A2%E5%BA%93/