ALINETEK 0.96 寸OLED模块
1)模块有单色和双色两种可选,单色为纯蓝色,而双色则为黄蓝双色。
单色模块每个像素点只有亮与不亮两种情况,没有颜色区分。
2)尺寸小,显示尺寸为0.96寸,而模块的尺寸仅为27mm*26mm大小。
3)高分辨率,该模块的分辨率为128*64。
4)多种接口方式,该模块提供了总共4种接口包括:6800、8080两种并行接口方式、 4线的穿行SPI接口方式,、IIC接口方式(只需要2根线就可以控制OLED了!)。
5)不需要高压,直接接3.3V就可以工作了。
注意:该模块不和5.0V接口兼容,所以在使用的时候一定要小心,别直接接到5V的系统上去,否则可能烧坏模块。
OLED模块工作模式选择
4种模式通过模块的BS1/BS2设置,BS1/BS2的设置与模块接口模式的关系如表所示:
如果想要设置为其他模式,则需要在 OLED 的背面,用烙铁修改 BS1 和 BS2 的设置。
OLED 8080并行接口信号线说明
CS:OLED片选信号。
WR:向OLED写入数据。
RD:从OLED读取数据。
D[7:0]:8位双向数据线。
RST(RES):硬复位OLED。
DC:命令/数据标志(0,读写命令;1,读写数据)。
OLED控制器为SSD1306
OLED8080并口读写过程
模块的8080并口读/写的过程为:
先根据要写入/读取的数据的类型,设置DC为高(数据)/低(命令),然后拉低片选,选中SSD1306,接着我们根据是读数据,还是要写数据置RD/WR为低,然后:
1.读数据:在RD的上升沿, 使数据锁存到数据线(D[7:0])上;
2.写数据:在WR的上升沿,使数据写入到SSD1306里面;
在 8080 方式下读数据操作的时候,我们有时候(例如读显存的时候)需要一个假读命 (Dummy Read),以使得微控制器的操作频率和显存的操作频率相匹配。在读取真正的数据之 前,由一个的假读的过程。这里的假读,其实就是第一个读到的字节丢弃不要,从第二个开始, 才是我们真正要读的数据。
OLED模块显存
SSD1306的显存总共为128*64bit大小,SSD1306将这些显存分为了8页。每页包含了128个字节,总共8页,这样刚好是128*64的点阵大小。
程序显示原理:在STM32的内部建立一个 缓存(共128*8个字节),在每次修改的时候,只是修改STM32上的缓存(实际上就是SRAM),在修改完了之后,一次性把STM32上的缓存数据写入到OLED的GRAM。
![](https://i-blog.csdnimg.cn/blog_migrate/468a2fcde70cdc18041ba6b0db106243.png)
- 命令0X81:设置对比度。包含两个字节,第一个0X81为命令,随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。
- 命令0XAE/0XAF:0XAE为关闭显示命令;0XAF为开启显示命令。
- 命令0X8D:包含2个字节,第一个为命令字,第二个为设置值,第二个字节的BIT2表示电荷泵的开关状态,该位为1,则开启电荷泵,为0则关闭。在模块初始化的时候,这个必须要开启,否则是看不到屏幕显示的。
- 命令0XB0~B7:用于设置页地址,其低三位的值对应着GRAM的页地址。
- 命令0X00~0X0F:用于设置显示时的起始列地址低四位。
- 命令0X10~0X1F:用于设置显示时的起始列地址高四位。
OLED初始化过程
1)复位SSD1306:RST=0,延时10ms,RST=1
2)驱动IC初始化代码:建议复位所有的寄存器
3)开启显示
4)清0显存
5)开始显示
几个重要的函数
OLED初始化
//初始化SSD1306
void OLED_Init(void)
{
…//设置IO口模式,所有用到的io口设置为推挽模式。
GPIO_Init();
…//初始化代码,写相关寄存器
OLED_WR_Byte(0xAE,OLED_CMD); //关闭显示
OLED_WR_Byte(0xD5,OLED_CMD); //设置时钟分频因子,震荡频率
OLED_WR_Byte(80,OLED_CMD); //[3:0],分频因子;[7:4],震荡频率
OLED_WR_Byte(0xA8,OLED_CMD); //设置驱动路数
OLED_WR_Byte(0X3F,OLED_CMD); //默认0X3F(1/64)
OLED_WR_Byte(0xD3,OLED_CMD); //设置显示偏移
OLED_WR_Byte(0X00,OLED_CMD); //默认为0
…
…
OLED_Clear();
}
OLED写一个字节
//向SSD1306写入一个字节。
//dat:要写入的数据/命令
//cmd:数据/命令标志 0,表示命令;1,表示数据;
void OLED_WR_Byte(u8 dat,u8 cmd)
{
DATAOUT(dat);
if(cmd)
OLED_RS_Set();
else
OLED_RS_Clr();
OLED_CS_Clr();
OLED_WR_Clr();
OLED_WR_Set();
OLED_CS_Set();
OLED_RS_Set();
}
OLED更新缓存显示内容
我们在 STM32F4内部定义了一个块GRAM: u8 OLED_GRAM[128][8];此部分 GRAM 对应 OLED 模块上的 GRAM。在操作的时候,我们只 要修改 STM32F4 内部的 GRAM 就可以了,然后通过 OLED_Refresh_Gram 函数把 GRAM 一次 刷新到 OLED 的 GRAM 上。OLED_Refresh_Gram 函数先设置页地址,然后写入列地址(也就是纵坐标),然后从 0 开 始写入 128 个字节,写满该页,最后循环把 8 页的内容都写入,就实现了整个从 STM32F4 显 存到 OLED 显存的拷贝。
u8 OLED_GRAM[128][8];
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); //设置显示位置—列低地址
OLED_WR_Byte (0x10,OLED_CMD); //设置显示位置—列高地址
for(n=0;n<128;n++)
OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA);
}
}
OLED画点函数
void OLED_DrawPoint(u8 x,u8 y,u8 t)
{
u8 pos,bx,temp=0;
if(x>127||y>63)return;//超出范围了.
pos=7-y/8;
bx=y%8;
temp=1<<(7-bx);
if(t)OLED_GRAM[x][pos]|=temp;
else OLED_GRAM[x][pos]&=~temp;
}
OLED字符显示函数
//在指定位置显示一个字符,包括部分字符
//x:0~127 y:0~63
//mode:0,反白显示;1, size:选择字体 12/16/24
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode)
{
u8 temp,t,t1; u8 y0=y;
u8 csize=(size/8+((size%8)?1:0))*(size/2); //得到字体一个字符对应点阵集所占的字节数
chr=chr-' ';//得到偏移后的值
for(t=0;t<csize;t++)
{
if(size==12)temp=asc2_1206[chr][t]; //调用1206字体
else if(size==16)temp=asc2_1608[chr][t]; //调用1608字体
else if(size==24)temp=asc2_2412[chr][t]; //调用2412字体
else return; //没有的字库
for(t1=0;t1<8;t1++)
{
if(temp&0x80)OLED_DrawPoint(x,y,mode);
else OLED_DrawPoint(x,y,!mode);
temp<<=1;
y++;
if((y-y0)==size)
{
y=y0;
x++; break;
}
}
}
}