STM32——OLED

本文详细介绍了ALINETEK的OLED显示模块,涉及单色/双色选择、0.96寸高分辨率、多种接口(6800/8080并口、SPI/IIC)、低电压工作特性及不同接口模式设置。涵盖了并口读写、4线SPI操作、显存结构和初始化流程,以及显示控制和清零方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OLED

常使用ALINETEK 的 OLED 显示模块,该模块有以下特点:
1)模块有单色和双色两种可选,单色为纯蓝色,而双色则为黄蓝双色。
2)尺寸小,显示尺寸为 0.96 寸,而模块的尺寸仅为 27mm26mm 大小。
3)高分辨率,该模块的分辨率为 128
64。
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的相关内容了,感谢观看!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值