OLED12864屏幕指南

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中的字符数组
    其中屏幕坐标对应的就是 128x64 的一个坐标面,其中 x 为 0-127 内的数字任意移动,而 y 则和显示的字符大小有关,正常我们显示 8x16 的字符,oled 可以显示 4行,则对应的 y 坐标范围就是 0-3。

使用函数库中的函数实现显示图片,汉字


因为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/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,963评论 25 707
  • SPI通信实验 SPI简介 串行外设接口(Serial Peripheral Interface Bus,SPI)...
    btskyrmb阅读 9,400评论 1 12
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 如果我把心态摆正了,在上研究生那我就,觉得生活很幸福了 像今天我早早来了,就有早来的的作用,看见了就知道原来是这样...
    lygly9阅读 155评论 0 0
  • 产权是关于资产的权利,如确权、流转等。产权兴起的两个重要动力,一个是为了减少外部性,第二是由于交通成本下降、集聚带...
    张永胜_永往直前阅读 257评论 0 0