OLED SH1108 STM32 8080接口实际使用

OLED SH1108 STM32 8080接口实际使用

目录

OLED SH1108 STM32 8080接口实际使用

硬件部分

软件部分


之前有项目使用维信诺一款OLED 核心控制器为SH1108,一直埋头搞项目,没有实际做点记录查看SH1108数据手册,感觉这个图很好,把SH1108描述的很形象,这里贴出来

硬件部分

这里需要说明的是sh1108支持的接口很多,如下表所示,8080、6800的并口方式,也支持串行接口IIC/4线SPI/三线SPI

这里需要在原理图设计的时候,注意IM0/IM1/IM2三个管脚的电平选择

本文涉及的项目是车载用的LED屏幕,所以对空间要求小,屏幕有点大,就采用并口设计的方式,加快屏幕的刷新过程,很多设计都是采用IIC也是可以的,使用的接口线少,方便硬件布局布线

IIC一般针对屏幕小,设备尺寸小,采用的一种接口方式。

项目选择是用8080接口,采用IO模拟的方式进行SH1108通信,IM0/IM1/IM2三个管脚的电平选择

0、1、1

8080接口需要使用的信号新如下图所示

明显可以看出来使用数据线D0-D8,一次刷新可以填入8bit数据,加快数据的写入

 项目使用的OLED屏屏为128 COM× 160 SEG,该屏幕有128 个column与20 个Page,每Page有8 Seg即一共160 Seg。

OLED和STM32的硬件连接,STM32使用外部晶振25Mhz,倍频到72Mhz

原理图设计的时候需要注意的是

需要把上述表格中D0-D7分别连接到MCU PX0-PX7,这样一次赋值就可以将8bit数据写入

在固件库函数中调用如下函数

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)

软件部分

关于stm32和OLED的管脚定义如下所列

这里定义如下宏定义,方便实现8080写时序


//------------OLED ------------------------------------------------------------------
#define OLED_SH1108_CS_PIN              GPIO_Pin_1                  /* PB.1 -------> OLED_CS */
#define OLED_SH1108_CS_GPIO_PORT        GPIOB                       /* GPIOB */
#define OLED_SH1108_CS_GPIO_CLK         RCC_APB2Periph_GPIOB

#define OLED_SH1108_DC_PIN              GPIO_Pin_13                  /* PB.13 -------> OLED_A0 */
#define OLED_SH1108_DC_GPIO_PORT        GPIOB                       /* GPIOB */
#define OLED_SH1108_DC_GPIO_CLK         RCC_APB2Periph_GPIOB

#define OLED_SH1108_WR_PIN              GPIO_Pin_14                  /* PB.14 -------> OLED_WR */
#define OLED_SH1108_WR_GPIO_PORT        GPIOB                       /* GPIOB */
#define OLED_SH1108_WR_GPIO_CLK         RCC_APB2Periph_GPIOB

#define OLED_SH1108_RD_PIN              GPIO_Pin_15                 /* PB.15 -------> OLED_RD */
#define OLED_SH1108_RD_GPIO_PORT        GPIOB                       /* GPIOB */
#define OLED_SH1108_RD_GPIO_CLK         RCC_APB2Periph_GPIOB

#define OLED_SH1108_RES_PIN              GPIO_Pin_12                /* PB.12 -------> OLED_RES */
#define OLED_SH1108_RES_GPIO_PORT        GPIOB                      /* GPIOB */
#define OLED_SH1108_RES_GPIO_CLK         RCC_APB2Periph_GPIOB

#define OLED_SH1108_D0_PIN              GPIO_Pin_0                 /* PC.0 -------> OLED_D0 */
#define OLED_SH1108_D0_GPIO_PORT        GPIOC                      /* GPIOC */
#define OLED_SH1108_D0_GPIO_CLK         RCC_APB2Periph_GPIOC

#define OLED_SH1108_D1_PIN              GPIO_Pin_1                 /* PC.1 -------> OLED_D1 */
#define OLED_SH1108_D1_GPIO_PORT        GPIOC                      /* GPIOC */
#define OLED_SH1108_D1_GPIO_CLK         RCC_APB2Periph_GPIOC

#define OLED_SH1108_D2_PIN              GPIO_Pin_2                 /* PC.2 -------> OLED_D2 */

#define OLED_SH1108_D3_PIN              GPIO_Pin_3                 /* PC.3 -------> OLED_D3 */

#define OLED_SH1108_D4_PIN              GPIO_Pin_4                 /* PC.4 -------> OLED_D4 */

#define OLED_SH1108_D5_PIN              GPIO_Pin_5                 /* PC.5 -------> OLED_D5 */

#define OLED_SH1108_D6_PIN              GPIO_Pin_6                 /* PC.6 -------> OLED_D6 */

#define OLED_SH1108_D7_PIN              GPIO_Pin_7                 /* PC.7 -------> OLED_D7 */

#define OLED_SH1108_XDATA_GPIO_PORT     GPIOC                       /* GPIOC */
#define OLED_SH1108_XDATA_GPIO_CLK      RCC_APB2Periph_GPIOC

#define OLED_SH1108_RES_LOW()            GPIO_ResetBits(OLED_SH1108_RES_GPIO_PORT, OLED_SH1108_RES_PIN)         
#define OLED_SH1108_RES_HIGH()           GPIO_SetBits(OLED_SH1108_RES_GPIO_PORT, OLED_SH1108_RES_PIN)

#define OLED_SH1108_CS_LOW()            GPIO_ResetBits(OLED_SH1108_CS_GPIO_PORT, OLED_SH1108_CS_PIN)         
#define OLED_SH1108_CS_HIGH()           GPIO_SetBits(OLED_SH1108_CS_GPIO_PORT, OLED_SH1108_CS_PIN)

#define OLED_SH1108_DC_LOW()            GPIO_ResetBits(OLED_SH1108_DC_GPIO_PORT, OLED_SH1108_DC_PIN)         
#define OLED_SH1108_DC_HIGH()           GPIO_SetBits(OLED_SH1108_DC_GPIO_PORT, OLED_SH1108_DC_PIN)

#define OLED_SH1108_WR_LOW()            GPIO_ResetBits(OLED_SH1108_WR_GPIO_PORT, OLED_SH1108_WR_PIN)         
#define OLED_SH1108_WR_HIGH()           GPIO_SetBits(OLED_SH1108_WR_GPIO_PORT, OLED_SH1108_WR_PIN)

#define OLED_SH1108_RD_LOW()            GPIO_ResetBits(OLED_SH1108_RD_GPIO_PORT, OLED_SH1108_RD_PIN)         
#define OLED_SH1108_RD_HIGH()           GPIO_SetBits(OLED_SH1108_RD_GPIO_PORT, OLED_SH1108_RD_PIN)

#define OLED_SH1108_XDATA(x)            GPIO_Write(OLED_SH1108_XDATA_GPIO_PORT, x)
//#define OLED_SH1108_XDATA(x)            GPIOC->ODR=(GPIOC->ODR & 0xff00) | (x & 0x00FF)

#define OLED_SH1108_SCL_LOW()           GPIO_ResetBits(OLED_SH1108_XDATA_GPIO_PORT, OLED_SH1108_D0_PIN)         
#define OLED_SH1108_SCL_HIGH()          GPIO_SetBits(OLED_SH1108_XDATA_GPIO_PORT, OLED_SH1108_D0_PIN)
#define OLED_SH1108_SI_LOW()            GPIO_ResetBits(OLED_SH1108_XDATA_GPIO_PORT, OLED_SH1108_D1_PIN)         
#define OLED_SH1108_SI_HIGH()           GPIO_SetBits(OLED_SH1108_XDATA_GPIO_PORT, OLED_SH1108_D1_PIN)

这里为了速度将PC口单独连接到OLED的数据线上,这样可以加快操作OLED的读写速度,OLED_SH1108_XDATA这个宏定义就是针对上述数据方式添加的。

测试main函数,实现了OLED显示汉字和字符串,部分图案显示没有测试

/******************************************************************************
* 函数名称: main()
* 功能描述: OLED测试
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 其它说明: 
* 修改日期      版本号      修改人     修改内容
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
* 2013/02/22    V1.0.0.0       
******************************************************************************/
INT32S main (void)
{
	BSP_Init();        // 系统初始化	
	oled_sh1108_init_program();
	OLED_ShowChinese(1, 20, 4, 1);//主
	OLED_ShowChinese(93, 20, 5, 1);//副
	while(1)
	{		
		sprintf((char*)oled_display_buf,"    ");
		oled_sh1108_show_string(61, 5, oled_display_buf, 12);				
		sprintf((char*)oled_display_buf,"%4.4d-%2.2d-%2.2d", 2022, 1, 1);
		oled_sh1108_show_string(1, 5, oled_display_buf, 12);
		sprintf((char*)oled_display_buf,"%2.2d:%2.2d:%2.2d", 10, 10, 10);
		oled_sh1108_show_string(105, 5, oled_display_buf, 12);	
		oled_sh1108_refresh_gram();
	}

	return (0);
}

STM32内部缓存定义,每次更改该数据,一定时间,或者及时将该数据刷新​​​​​

/*                  OLED的显存
*					存放格式如下.
*					[0]0 1 2 3 ... 127	
*					[1]0 1 2 3 ... 127	
*					[2]0 1 2 3 ... 127	
*
*					[19]0 1 2 3 ... 127 		   
*/
static unsigned char OLED_GRAM[128][20];	

刷新缓存到OLED,该函数实现将缓存数据刷新到OLED

/******************************************************************************
* 函数名称: oled_sh1108_all_screen()
* 功能描述: 更新显存到LCD		
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 其它说明: 
* 修改日期      版本号      修改人     修改内容
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
* 2013/02/22    V1.0.0.0       
******************************************************************************/
void oled_sh1108_refresh_gram(void)
{
	unsigned char i, j;		    
//	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); 
//	}
	for(i = 0; i < 20; i++)
	{
		oled_sh1108_write_c(0xb0);
		oled_sh1108_write_c(0x00 + i);

		oled_sh1108_write_c(0x00);
		oled_sh1108_write_c(0x11); 
		for(j = 0; j < 128; j++)
		{
			oled_sh1108_write_d(OLED_GRAM[j][i]);
		}
	}	
}		

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: SH1107是一款OLED显示器控制器芯片,OLED0.96是指使用了该芯片的0.96寸OLED显示屏,而STM32是指使用了STMicroelectronics公司的STM32系列单片机。 SH1107是一款高性能的OLED控制器芯片,具有低功耗、高亮度、高对比度等特点。它可以通过串行接口与单片机进行通信,实现显示内容的控制。OLED0.96是一款尺寸为0.96寸的显示屏,使用了SH1107芯片作为控制器,可以用来显示各种图形和文字。它的小尺寸和高分辨率使其成为很多嵌入式系统中的理想选择。 STM32是STMicroelectronics公司推出的一款32位单片机系列,具有强大的处理能力和丰富的外设功能。它可以与各种外围设备进行通信,并可通过编程语言来控制和操作这些设备。在使用SH1107 OLED显示器时,STM32可以通过串行接口与SH1107芯片进行通信,实现对OLED显示屏的显示内容进行控制。 通过将SH1107 OLED显示器与STM32单片机结合使用,我们可以实现各种应用。例如,可以将STM32用作控制器,通过编程控制SH1107显示器显示温度、湿度等传感器数据;或者将STM32用作嵌入式系统的核心,并通过SH1107显示器显示系统的状态信息、用户界面等。另外,由于STM32具有丰富的外设功能,还可以通过STM32与其他设备进行通信,如WiFi模块、蓝牙模块等,进一步扩展系统的功能和应用范围。 综上所述,使用SH1107 OLED0.96和STM32的组合,可以实现丰富的应用,并为嵌入式系统的开发提供了很大的便利性。 ### 回答2: SH1107是一种OLED显示驱动芯片,适用于0.96英寸的OLED显示屏。STM32是一种32位单片机,具有强大的计算和控制能力。在使用SH1107驱动OLED显示屏时,可以通过STM32来控制和驱动屏幕显示。 使用SH1107驱动OLED显示屏,首先需要使用STM32来初始化和配置SH1107芯片。通过配置引脚连接以及相应的寄存器设置,可以将STM32与SH1107与OLED显示屏连接起来。 一旦连接建立,STM32可以通过发送指令和数据来控制OLED显示屏的显示内容。可以通过发送指令来设置显示模式、亮度、对比度和显示位置等参数。同时,也可以发送数据来显示文字、图像或者其他任意自定义内容。 而在STM32中,可以通过编写相应的代码来实现对SH1107和OLED显示屏的控制和驱动。这可以包括使用GPIO口进行引脚设置、使用SPI或I2C总线进行数据传输以及使用相应的函数库或驱动程序进行相关操作。 通过将SH1107与STM32结合使用,可以实现对0.96英寸OLED显示屏的全面控制。这样可以用于各种应用场景,比如在嵌入式系统中显示实时数据、创建小型显示设备或者实现自定义的界面等等。 总之,SH1107 OLED0.96屏幕与STM32结合使用,可以实现对OLED显示屏的高度定制化的控制和驱动,使其适应各种应用需求。 ### 回答3: SH1107是一种OLED显示屏控制器芯片,支持0.96英寸大小的显示屏。在使用STM32微控制器时,可以通过连接STM32和SH1107实现OLED显示屏的驱动和控制。 对于使用SH1107与STM32OLED 0.96英寸显示屏,需要进行以下步骤: 1. 连接硬件:将STM32的引脚与SH1107的引脚相连。具体连接方式需要根据SH1107和STM32的引脚定义进行设置,确保正确连接。 2. 初始化STM32使用STM32的开发环境,初始化相关引脚和外设,以便与SH1107进行通信。 3. 编写驱动程序:编写STM32与SH1107之间的驱动程序,包括发送指令和数据给SH1107的函数。通过这些函数,可以向OLED显示屏发送显示数据、控制指令等。 4. 控制OLED的显示:根据需要,可以通过STM32发送指令和数据给SH1107控制OLED的显示。可以设置显示内容、显示位置、显示字体等参数。 5. 更新显示数据:通过驱动程序,可以实现在OLED上动态更新显示内容。可以根据传感器数据、计算结果等,不断更新OLED上的信息。 总结起来,使用SH1107 OLED 0.96英寸和STM32微控制器,需要通过连接硬件、初始化STM32、编写驱动程序以及控制OLED的显示来实现其驱动和控制。这样可以通过STM32来控制OLED显示屏的显示内容和实现界面的更新。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大牛攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值