OLED
常使用ALINETEK 的 OLED 显示模块,该模块有以下特点:
1)模块有单色和双色两种可选,单色为纯蓝色,而双色则为黄蓝双色。
2)尺寸小,显示尺寸为 0.96 寸,而模块的尺寸仅为 27mm26mm 大小。
3)高分辨率,该模块的分辨率为 12864。
4)多种接口方式,该模块提供了总共 4 种接口包括:6800、8080 两种并行接口方式、4
线 SPI 接口方式以及 IIC 接口方式(只需要 2 根线就可以控制 OLED 了!)。
5)不需要高压,直接接 3.3V 就可以工作了。
注:该模块不和 5.0V 接口兼容,所以请大家在使用的时候一定要小心,别直接接到 5V 的系统上去,否则可能烧坏模块。
以上 4 种模式通过模块的 BS1 和 BS2 设置,
BS1 和 BS2 的设置与模块接口模式的关系如表 15.1.1 所示:
表中“1”代表接 VCC,而“0”代表接 GND。
CS:OLED 片选信号。
WR:向 OLED 写入数据。
RD:从 OLED 读取数据。
D[7:0]:8 位双向数据线。
RST(RES):硬复位 OLED。
DC:命令/数据标志(0,读写命令;1,读写数据)
模块的 8080 并口读/写的过程
1.先根据要写入/读取的数据的类型,设置 DC 为高(数据)/低(命令)
2.拉低片选,选中 SSD1306,接着我们根据是读数据,还是要写数据置 RD/WR为低,
3.在 RD 的上升沿, 使数据锁存到数据线(D[7:0])上;在 WR 的上升沿,使数据写入到 SSD1306 里面;
1、并口写入数据
//引脚口的定义
#define OLED_CS PCout(9)
//#define OLED_RST PBout(14)//在MINISTM32上直接接到了STM32的复位脚!
#define OLED_RS PCout(8)
#define OLED_WR PCout(7)
#define OLED_RD PCout(6)
//向SSD1306写入一个字节
//dat:要写入的数据/命令
//cmd:数据/命令标志位 0,表示命令,1 表示数据;
void OLED_WR_Byte(uchar dat, uchar mode)
{
OLED_RS = cmd;//写命令
OLED_CS = 0;//拉低片选
OLED_WR=0;
OLED_WR=1; //WR上升沿写入数据
OLED_CS=1; //拉高片选
OLED_RS=1;
}
2.并口读取数据
代码与写入数据类似,可自己试试。
在 8080 方式下读数据操作的时候,我们有时候(例如读显存的时候)需要一个假读命(Dummy Read),以使得微控制器的操作频率和显存的操作频率相匹配。在读取真正的数据之前,由一个的假读的过程。这里的假读,其实就是第一个读到的字节丢弃不要,从第二个开始,
才是我们真正要读的数据。
可以看到,在发送了列地址之后,开始读数据,第一个是 Dummy Read,也就是假读,我们从第二个开始,才算是真正有效的数据。
模块的4 线串行(SPI)方式
CS:OLED 片选信号。
RST(RES):硬复位 OLED。
DC:命令/数据标志(0,读写命令;1,读写数据)。
SCLK:串行时钟线。在 4 线串行模式下,D0 信号线作为串行时钟线 SCLK。
SDIN:串行数据线。在 4 线串行模式下,D1 信号线作为串行数据线 SDIN。
注:模块的 D2 需要悬空,其他引脚可以接到 GND。在 4 线串行模式下,只能往模块写数据而不能读数据。
在 4 线 SPI 模式下,每个数据长度均为 8 位,在 SCLK 的上升沿,数据从 SDIN 移入到
SSD1306,并且是高位在前的。DC 线还是用作命令/数据的标志线。在 4 线 SPI 模式下,写操
作的时序如图 15.1.6 所示:
//使用4线串行接口时使用
#define OLED_SCLK PBout(0)
#define OLED_SDIN PBout(1)
#define OLED_CMD 0 //写命令
#define OLED_DATA 1 //写数据
void OLED_WR_Byte(u8 dat,u8 cmd)
{
u8 i;
OLED_RS=cmd; //写命令
OLED_CS=0;
for(i=0;i<8;i++)
{
OLED_SCLK=0;
if(dat&0x80)OLED_SDIN=1;
else OLED_SDIN=0;
OLED_SCLK=1;
dat<<=1;
}
OLED_CS=1;
OLED_RS=1;
}
OLED模块的显存
SSD1306 的显存总共为 128*64bit 大小,SSD1306 将这些显存分为了 8 页,其对应关系如表 15.1.3 所示
为了解决写入的数据显示后,后面的数据覆盖前面的数据情况,我们可以先读出来要写入的那个字节,得到当前状况,在修改了要改写的位之后再写进 GRAM,这样就不会影响到之前的状况了。
//OLED的显示缓存
void OLED_Refresh_Gram(void)
{
u8 i,n;
for(i=0;i<8;i++) //一页一页写 一共八页
{
OLED_WR_Byte (0xb0+i,OLED_CMD); //设置页地址(0~7)
OLED_WR_Byte (0x00,OLED_CMD); //设置显示位置—列低地址 0000 0000
OLED_WR_Byte (0x10,OLED_CMD); //设置显示位置—列高地址 1000 0000
for(n=0;n<128;n++)OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA); //写字节
}
}
最后来说一下OLED的初始化过程,它的程序框图如图所示
有关显示以及清0的代码如下:
//开启OLED显示
void OLED_Display_On(void)
{
OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令
OLED_WR_Byte(0X14,OLED_CMD); //DCDC ON
OLED_WR_Byte(0XAF,OLED_CMD); //DISPLAY ON
}
//关闭OLED显示
void OLED_Display_Off(void)
{
OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令
OLED_WR_Byte(0X10,OLED_CMD); //DCDC OFF
OLED_WR_Byte(0XAE,OLED_CMD); //DISPLAY OFF
}
//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!
void OLED_Clear(void)
{
u8 i,n;
for(i=0;i<8;i++)for(n=0;n<128;n++)OLED_GRAM[n][i]=0X00;
OLED_Refresh_Gram();//更新显示
}
好了以上就是OLED的相关内容了,感谢观看!!!!