OLED(经典0.96英寸)--4SPI--SSD1306控制原理(含常用芯片_oled例程)

OLED内部结构

主要结构

主要结构包括,MCU、 (经典款用的是SSD1306;方屏SSD1317;竖屏SH1107;有些新款用的是SSD1315)
GDDRAM(我们写入的显示数据存放在这里)、Command register(命令寄存器,写入的命令放在这里)等部分。

各芯片数据手册链接如下:
SSD1306:https://leoeinstein.lanzous.com/iTI83kivv9e
SSD1317:https://leoeinstein.lanzous.com/iiJTukivv8d
SSD1107:https://leoeinstein.lanzous.com/iYK41kivvaf
SSD1315:https://leoeinstein.lanzous.com/iLhlmkivvbg

在这里插入图片描述

部分引脚说明

" # "表示“”,低电平有效

引脚说明
RES#复位信号,拉低时芯片会开始初始化,置1的时候正常工作
CS#片选脚,不接的情况下,默认低电平(默认选中)
D/C#为1时,读写数据;为0时,读写指令
R/W#读写控制端,为1时读;为0时写
E/(RD#)串行模式下接到VSS,也就是低电平
D[7:0]串行通信模式下,D0是串行时钟输入(SCLK);D1是串行数据输入(SDIN)

在选择不同的通信方式时,引脚的接法会有些差别,请看下表:
在这里插入图片描述

4线SPI

串行接口说明

四线串行接口由串行时钟: SCLK串行数据: SDIND/C#、CS组成

其中D0充当SCLK,D1充当 SDIN;

对于未使用的数据引脚,D2应该保持开路状态;D3到D7、E和 R/W# 的引脚连接到外部地

在这里插入图片描述

时序图

4SPI 时序图
通过时序图可以看到:

在SCLK的每个上升沿,SDIN数据从高到低逐位,移位到一个8位移位寄存器,其顺序为D7…D0。

8个时钟后,对D/C#进行采样(看看接下来的是数据还是命令),移位寄存器中的数据字节会同步写入到图形显示数据aRAM ( GDDRAM )或命令寄存器。

GDDRAM

在这里插入图片描述
如上图显示数据寄存器,被分为128 * 8页,每一页有8位,总的就有 128 *8 * 8=128 * 64

在这里插入图片描述
如上图所示,当一个字节(8位)数据写入GDDRAM时候,会从低位数据D0开始写入,一直到D7。

也就要求了,字符或者图片取模时要求 取模方式列行式取模走向低位在前

在这里插入图片描述

命令

命令表(部分)

HexCommand
AF设置显示为打开
AE设置显示为关闭
A4/A5显示打开
A6/A7正常显示(A6)/反转显示(A7)
81设置对比度控制

在这里插入图片描述
更为详细的命令可参考:SSD1306手册

OLED 初始化程序

驱动芯片:STM32F407

//-----------------OLED端口定义----------------

#define OLED_SCLK_Clr() GPIO_ResetBits(GPIOG,GPIO_Pin_12)//SCL
#define OLED_SCLK_Set() GPIO_SetBits(GPIOG,GPIO_Pin_12)

#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_5)//DIN
#define OLED_SDIN_Set() GPIO_SetBits(GPIOD,GPIO_Pin_5)

#define OLED_RES_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_4)//RES
#define OLED_RES_Set() GPIO_SetBits(GPIOD,GPIO_Pin_4)

#define OLED_DC_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_15)//DC
#define OLED_DC_Set() GPIO_SetBits(GPIOD,GPIO_Pin_15)
 		     
#define OLED_CS_Clr()  GPIO_ResetBits(GPIOD,GPIO_Pin_1)//CS
#define OLED_CS_Set()  GPIO_SetBits(GPIOD,GPIO_Pin_1)
//OLED的初始化函数
void OLED_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOG|RCC_AHB1Periph_GPIOE,ENABLE);//使能PORTA~E,PORTG时钟
  	
	//GPIO初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_15 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化

	//GPIO初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化
	
	//GPIO初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化
	
	OLED_RES_Clr();
	delay_ms(200);
	OLED_RES_Set();
	
	OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
	OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
	OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
	OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
	OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
	OLED_WR_Byte(0xCF,OLED_CMD);// Set SEG Output Current Brightness
	OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
	OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
	OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
	OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
	OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
	OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset	Shift Mapping RAM Counter (0x00~0x3F)
	OLED_WR_Byte(0x00,OLED_CMD);//-not offset
	OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
	OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
	OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
	OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
	OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
	OLED_WR_Byte(0x12,OLED_CMD);
	OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
	OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
	OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
	OLED_WR_Byte(0x02,OLED_CMD);//
	OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
	OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
	OLED_WR_Byte(0xA4,OLED_CMD);// Entire Display On (0xa4/0xa5)
	OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7) 
	OLED_WR_Byte(0xAF,OLED_CMD);
	OLED_Clear();
}

例程

工程链接:https://leoeinstein.lanzous.com/ipI81kj0vgb

  • 3
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 中景园电子是一家专业生产OLED显示屏的公司,他们的0.96OLED显示屏适用于STM32 ZET系列开发板,并且可以通过SPI接口连接。下面我将简要介绍如何在STM32开发板上使用该OLED显示屏。 首先,我们需要在STM32开发板上连接OLED显示屏。可以将OLED的VCC引脚连接到STM32的3.3V电源引脚,GND引脚连接到GND,SDA引脚连接到STM32SPI MOSI引脚,SCL引脚连接到SPI SCK引脚,RES引脚连接到任意GPIO引脚,DC引脚连接到SPI CS引脚。另外,为了保证数据传输的稳定性,可以在VCC和GND之间加入一个电容。 接下来,在STM32的代码中引入OLED的库函数,并初始化SPI接口。可以使用STM32提供的标准库函数来实现SPI的初始化,包括初始化SPI的时钟源、引脚、速率等参数。然后,利用库函数对OLED进行初始化,设置其工作模式、亮度、对比度等参数。 在完成初始化之后,我们可以通过库函数来控制OLED显示屏的操作。例如,通过设置点亮的像素来显示图形和字符,可以在屏幕的指定位置绘制线条、矩形和圆等图形,也可以显示文字,甚至可以进行动画的显示。 通过以上步骤,我们可以在STM32开发板上通过SPI接口使用中景园电子的0.96OLED显示屏。可以根据实际需求编写相应的代码,实现各种丰富的显示效果。希望以上的回答对您有所帮助。 ### 回答2: 中景园电子0.96oled显示屏是一款高清显示屏,采用了0.96英寸OLED屏幕,具有显示效果优良、显示画面清晰等特点。该显示屏可以通过SPI总线与STM32ZET系列微控制器进行通信。 在使用中景园电子0.96oled显示屏时,我们可以使用STM32ZET系列微控制器提供的SPI外设来与显示屏进行通信。SPI是一种同步串行通信协议,通过传输时钟、数据、以及控制信号来实现数据的传输。我们可以通过配置SPI外设的寄存器来实现与显示屏的通信。 在使用SPI控制中景园电子0.96oled显示屏时,我们需要先配置SPI的时钟分频因子、数据传输位序、数据传输模式等参数。然后,可以通过向SPI发送特定命令来控制显示屏的初始化、设置显示位置、写入数据等操作。 例如,可以使用SPI向显示屏发送指令0xAE来关闭显示,使用指令0xAF来开启显示。可以使用指令0x20和0x21来设置显示位置等。 此外,为了简化编程的过程,我们可以参考STM32ZET系列微控制器的SPI例程进行开发。例程中会提供一些用于配置SPI的代码和一些操作显示屏的示例代码。我们可以根据自己的需求进行修改和扩展,以实现更丰富的显示功能。 综上所述,中景园电子0.96oled显示屏与STM32ZET系列微控制器的SPI外设结合使用,可以实现高清、清晰的显示效果。通过合理配置SPI参数和使用相关指令,我们可以实现对显示屏的初始化、控制和数据操作等功能。通过参考SPI例程,我们可以快速上手并进行开发。 ### 回答3: 中景园电子的0.96 OLED显示屏与STM32ZET系列芯片SPI接口可以通过以下例程进行操作。 首先,需要在STM32ZET系列芯片的开发环境中导入相关的库文件。然后,在主函数中进行初始化设置,包括引脚设置、SPI初始化和OLED显示屏的初始化等。 接下来,在主循环中,可以通过SPI接口与0.96 OLED显示屏进行通信。在传输数据之前,先向OLED发送指令以选择相应的显示模式或设置参数。然后,根据需要调用相应的函数发送数据到OLED显示屏上。例如,可以使用spi_transfer函数将需要显示的数据传输到OLED显示屏的缓冲区中。最后,调用更新显示函数,将缓冲区中的数据显示在屏幕上。 需要注意的是,SPI传输是通过片选信号进行控制的。通过拉低片选信号(选通OLED显示屏),可以与OLED进行通信;反之,拉高片选信号(非选通OLED显示屏),可以与其他SPI设备进行通信。 此外,还可以根据需要添加其他功能,如图形绘制、文字显示等。 总结来说,中景园电子的0.96 OLED显示屏与STM32ZET系列芯片SPI接口可以通过适当的库文件和例程进行初始化和通信设置,让开发者能够实现自定义的显示内容和功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值