STM32之OLED显示

这篇具有很好参考价值的文章主要介绍了STM32之OLED显示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、模块介绍

1、常见的显示设备

LED、数码管、点阵、LCD屏(1602/12864)、OLED屏(消费电子)

STM32之OLED显示,STM32单片机,stm32,单片机STM32之OLED显示,STM32单片机,stm32,单片机STM32之OLED显示,STM32单片机,stm32,单片机

2、OLED屏的概述

OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。因为具备轻薄、省电等特性,因此从2003 年开始,这种显示设备在 MP3 播放器上得到了广泛应用,而对于同属数码类产品的 DC与手机,此前只是在一些展会上展示过采用 OLED 屏幕的工程样品。自 2007 年后,寿命得到很大提高,具备了许多 LCD 不可比拟的优势

3、特性

STM32之OLED显示,STM32单片机,stm32,单片机

型号:SH1106

尺寸:132 * 64个像素点(前两列和最后的两列显示不了东西)

像素点:一帧画面所能表示的最小的显示单位。

分辨率:横向像素点的个数 * 竖向像素点个数

通信方式:

STM32之OLED显示,STM32单片机,stm32,单片机

STM32之OLED显示,STM32单片机,stm32,单片机

硬线接线四线SPI的通信方式

二、硬件分析

1、引脚分布

STM32之OLED显示,STM32单片机,stm32,单片机

STM32之OLED显示,STM32单片机,stm32,单片机

STM32之OLED显示,STM32单片机,stm32,单片机

STM32之OLED显示,STM32单片机,stm32,单片机

A0管脚如果是低电平就是发送命令过去

A0管脚如果是高电平就是发送显示数据过去

OLED_SCL -- 时钟线

(MOSI)OLED_SI -- 输入对于OLED的驱动芯片

OLED_CS -- 片选线

OLED_RES -- 复位管脚

OLED_D/C -- 命令或数据引脚

IO口模拟SPI

使用SPI控制器

三、SPI通信

1、通信特点

4线SPI:同步串行全双工

3线SPI:同步串行半双工

2、通信速度

几十Mhz以上

3、通信模式

MODE0和MODE3:上升沿接收数据,下降沿发送数据

MODE1和MODE2:下降沿接收数据,上升沿发送数据

器件支持MODE0模式也支持MODE3,支持MODE1模式也支持MODE2

4、通讯图

STM32之OLED显示,STM32单片机,stm32,单片机

四、软件编写

1、时序图

STM32之OLED显示,STM32单片机,stm32,单片机

1. CS线要拉低
2. SPI符合模式0或者模式3,上升沿接收数据,下降沿发送数据
3. A0线拉低代表把刚刚传输过去的八位数据给到命令寄存器里,拉高代表传输到显存

2、OLED相关命令

STM32之OLED显示,STM32单片机,stm32,单片机

STM32之OLED显示,STM32单片机,stm32,单片机

假如现在想要从第1页开始显示就要把0xB0的指令发送出去

STM32之OLED显示,STM32单片机,stm32,单片机

设置列地址分为了高四字节和低四字节

如果要去设置列地址就要分两次命令发送

当前如果要在第1列显示数据:

发送低位的列地址就是00

发送高位的列地址就是10

3、字模提取:

STM32之OLED显示,STM32单片机,stm32,单片机

4、图像提取

STM32之OLED显示,STM32单片机,stm32,单片机

五、流程

1、初始化GPIO口

复用功能

复用到哪里

PB3 -- SCL -- SPI1_SCL

PB5 -- SI -- SPI1_MOSI

PB13 -- RES -- 推挽输出

PB7 -- CS --  推挽输出

PA15 -- DC --  推挽输出

STM32之OLED显示,STM32单片机,stm32,单片机

STM32之OLED显示,STM32单片机,stm32,单片机

STM32之OLED显示,STM32单片机,stm32,单片机

STM32之OLED显示,STM32单片机,stm32,单片机

2、初始化SPI控制器

使用库函数:

先打开外设时钟

找Init函数

#include "spi.h"

/****************************
函数功能:SPI管脚初始化
函数形参:u32 nms
函数返回值:void
函数说明:
PB3 -- SCL -- SPI1_SCL
PB5 -- SI -- SPI1_MOSI
PB13 -- RES -- 推挽输出
PB7 -- CS --  推挽输出
PA15 -- DC --  推挽输出
****************************/
void Spi_Port_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;//定义了一个结构体变量
	SPI_InitTypeDef   SPI_InitStruct;  
	//1. 打开GPIOA的时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
	
	//2. 配置GPIO口功能
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;//配置输出模式
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//配置为推挽
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_13;//选择7号管脚
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上下拉
	GPIO_InitStruct.GPIO_Speed = GPIO_Fast_Speed;//低速
	GPIO_Init(GPIOB, &GPIO_InitStruct); 
	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;//选择15号管脚
	GPIO_Init(GPIOA, &GPIO_InitStruct); 
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;//配置复用模式
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_5;//选择3和5号管脚
	GPIO_Init(GPIOB, &GPIO_InitStruct); 
	
	//3.复用到哪里
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_SPI1);
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI1);
	
	//4.SPI控制器初始化
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
	SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//选择二分频
	SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;//前沿采集
	SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;//空闲时为低电平
	SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;//8位数据为一帧
	SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//选择全双工
	SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;//高位先发
	SPI_InitStruct.SPI_Mode = SPI_Mode_Master;//主模式
	SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;//软件从模式管理
	SPI_Init(SPI1,&SPI_InitStruct);
	
	SPI_Cmd(SPI1,ENABLE);//使能SPI1

}

/****************************
函数功能:SPI发送一个字节数据
函数形参:u8 data
函数返回值:void
函数说明:
		
****************************/
void Spi_SendByte(u8 data)
{
	while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET)//当前发送缓冲区为空才能跳出循环
	{
			
	}
	SPI_I2S_SendData(SPI1,data);//发送数据
	
	while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE) == RESET)//当前接收缓冲区为空才能跳出循环
	{
			
	}
	SPI_I2S_ReceiveData(SPI1);//接收数据

}
#include "oled.h"

/**********************************************************************************************************
* 函数名    :   OLED_writeByte
* 功能描述  :   oled字节写,向SH1106写入一个字节。 
* 参数说明  :   dat:要写入的数据/命令
* cmd:数据/命令标志 0,表示命令;1,表示数据;
* 返回值说明:   none
* 修改记录  : 
* 其他      :
**********************************************************************************************************/
void OLED_writeByte(u8 dat, u8 cmd)
{	
	cmd ? OLED_DC_SET() : OLED_DC_CLR();	
		
	OLED_select();		 
	
	Spi_SendByte(dat);
	
	OLED_deSelect();
} 

/**********************************************************************************************************
* 函数名    :   OLED_clear
* 功能描述  :   清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!	 
* 参数说明  :   none
* 返回值说明:   none
* 修改记录  : 
* 其他      :
 OLED;8页,每页132字节,
清屏:首先清除第1页,从第一个字节开始
                2
前面 & 后面 4列 因边框问题不处理
**********************************************************************************************************/
void OLED_clear(void)  
{  
	u8 i,n;		    
	for(i=0;i<8;i++)  //8页
	{  
		OLED_writeByte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
		//从第2列(0x02)开始
		OLED_writeByte (0x02,OLED_CMD);      //设置显示位置—列低地址
		OLED_writeByte (0x10,OLED_CMD);      //设置显示位置—列高地址   
		for(n=0; n<130; n++)//到第130列
		{
			OLED_writeByte(0,OLED_DATA);   //息屏整个屏幕是黑色的!和没点亮一样!!!	
		}
	} //更新显示
}   

/**********************************************************************************************************
* 函数名    :   Oled_init
* 功能描述  :   oled初始化 
* 参数说明  :   none
* 返回值说明:   none
* 修改记录  : 
* 其他      :
**********************************************************************************************************/
				    
void Oled_init(void)
{ 
	Spi_Port_Init();	//管脚初始化
	OLED_RES_L;
	Delay_ms(100);
	OLED_RES_H;
	
	
	OLED_writeByte(0xAE,OLED_CMD);//--turn off oled panel
	OLED_writeByte(0x02,OLED_CMD);//---SET low column address
	OLED_writeByte(0x10,OLED_CMD);//---SET high column address
	OLED_writeByte(0x40,OLED_CMD);//--SET start line address  SET Mapping RAM Display Start Line (0x00~0x3F)
	OLED_writeByte(0x81,OLED_CMD);//--SET contrast control register
	OLED_writeByte(0xCF,OLED_CMD); // SET SEG Output Current Brightness
	OLED_writeByte(0xA1,OLED_CMD);//--SET SEG/Column Mapping     0xa0左右反置 0xa1正常
	OLED_writeByte(0xC8,OLED_CMD);//SET COM/Row Scan Direction   0xc0上下反置 0xc8正常
	OLED_writeByte(0xA6,OLED_CMD);//--SET normal display
	OLED_writeByte(0xA8,OLED_CMD);//--SET multiplex ratio(1 to 64)
	OLED_writeByte(0x3f,OLED_CMD);//--1/64 duty
	OLED_writeByte(0xD3,OLED_CMD);//-SET display offSET	Shift Mapping RAM Counter (0x00~0x3F)
	OLED_writeByte(0x00,OLED_CMD);//-not offSET
	OLED_writeByte(0xd5,OLED_CMD);//--SET display clock divide ratio/oscillator frequency
	OLED_writeByte(0x80,OLED_CMD);//--SET divide ratio, SET Clock as 100 Frames/Sec
	OLED_writeByte(0xD9,OLED_CMD);//--SET pre-charge period
	OLED_writeByte(0xF1,OLED_CMD);//SET Pre-Charge as 15 Clocks & Discharge as 1 Clock
	OLED_writeByte(0xDA,OLED_CMD);//--SET com pins hardware configuration
	OLED_writeByte(0x12,OLED_CMD);
	OLED_writeByte(0xDB,OLED_CMD);//--SET vcomh
	OLED_writeByte(0x40,OLED_CMD);//SET VCOM Deselect Level
	OLED_writeByte(0x20,OLED_CMD);//-SET Page Addressing Mode (0x00/0x01/0x02)
	OLED_writeByte(0x02,OLED_CMD);//
	OLED_writeByte(0x8D,OLED_CMD);//--SET Charge Pump enable/disable
	OLED_writeByte(0x14,OLED_CMD);//--SET(0x10) disable
	OLED_writeByte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
	OLED_writeByte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7) 
	OLED_writeByte(0xAF,OLED_CMD);//--turn on oled panel
	
	OLED_writeByte(0xAF,OLED_CMD); /*display ON*/ 
	OLED_clear();	
}  

/**********************************************************************************************************
* 函数名    :   OLED_setPos
* 功能描述  :   
* 参数说明  :  
	X: 列坐标  0----131
	Y: 页坐标  0----7
	列总共由8个位组成
* 返回值说明:   none
* 修改记录  : 
* 其他      :  
                       
                        
**********************************************************************************************************/
void OLED_setPos(unsigned char x, unsigned char y) //34 - 0010 0010
{ 
	x += 2;//SSH1106 要加这个
	y &= 7;//保证页的地址不超
	OLED_writeByte(0xb0+y,OLED_CMD); //设置页地址
	
	OLED_writeByte(((x&0xf0)>>4)|0x10, OLED_CMD);//设置显示位置—列高地址
	//0010 0010 & 1111 0000
	//0010 0000 >> 4 -- 0000 0010
	
	OLED_writeByte((x&0x0f),OLED_CMD); 
	//0010 0010 & 0000 1111 -- 0000 0010
}  



/**********************************************************************************************************
* 函数名    :   Show_Signal_Word
* 功能描述  :   显示单个字符
* 参数说明  :   u8 page, u8 col, u8 ch
* 返回值说明:   none
* 修改记录  : 
* 其他      :
**********************************************************************************************************/
void Show_Signal_Word(u8 page, u8 col, u8 ch)//'a' -- 97
{
	u8 i;
	u8 n;
	u8 index = ch - ' ';//得到当前这个字符在ASCII_816的位置,97 - 32 = 65
	if(col > 120)
	{
		col = 0;
		page += 2;
	}
	OLED_setPos(col,page);
	//由于一页只有八行,一个字符有16行,所以需要换两页
	
	for(i = 0; i < 2; i++)
	{
		//由于一个字符只有8列
		for(n=0; n< 8; n++)//到第130列
		{
			OLED_writeByte(ASCII_816[index*16 + i*8 + n],OLED_DATA);   //息屏整个屏幕是黑色的!和没点亮一样!!!	
		}
		OLED_setPos(col,page+1);
	}
}


/**********************************************************************************************************
* 函数名    :   Show_String
* 功能描述  :   显示字符串
* 参数说明  :   u8 page, u8 col, u8 *str, u8 num
* 返回值说明:   none
* 修改记录  : 
* 其他      :
**********************************************************************************************************/
void Show_String(u8 page, u8 col, u8 *str, u8 num)//"sakdjfhjk",0
{
	u8 i;
	OLED_setPos(col,page);
	for(i = 0; i < num; i++)
	{
		Show_Signal_Word(page,col,*str);
		str++;
		col += 8;//为了保证下一个字符和前一个字符不重合,根据字体大小所以+8
		if(col > 120)
		{
			col = 0;
			page += 2;
		}
		OLED_setPos(col,page);
	}
}


/**********************************************************************************************************
* 函数名    :   Show_Chinese
* 功能描述  :   显示字符串
* 参数说明  :   u8 page, u8 col, u8 *str, u8 num
* 返回值说明:   none
* 修改记录  : 
* 其他      :
**********************************************************************************************************/
void Show_Chinese( u8 page, u8 col, u8 *str, u8 num)
{
	u8 i,j;
	u8 n;
	if(col > 112)
	{
		col = 0;
		page += 2;
	}
	OLED_setPos(col,page);
	
	for(j = 0; j < num; j++)
	{
		for(i = 0; i < 2; i++)
		{
			//由于一个字符只有8列
			for(n=0; n < 16; n++)//代表有16列的数据
			{
				OLED_writeByte(str[j *32 + i*16 + n],OLED_DATA);   //息屏整个屏幕是黑色的!和没点亮一样!!!	
			}
			OLED_setPos(col,page+1);
		}
		col += 16;
		if(col > 112)
		{
			col = 0;
			page += 2;
		}
		OLED_setPos(col,page);
	}
}

/**********************************************************************************************************
* 函数名    :   Show_Pic
* 功能描述  :   显示图片
* 参数说明  :   u8 page, u8 col, u8 *pic
* 返回值说明:   none
* 修改记录  : 
* 其他      :
**********************************************************************************************************/
void Show_Pic(u8 page, u8 col, u8 *pic)
{
	u8 weight = pic[2];
	u8 height = pic[4];
	u8 i,j;
	pic += 6;//先偏移掉数据头的数据
	if(weight > 129 - col)
	{
		col = 0;
		page += 2;
	}
	OLED_setPos(col,page);
	for(i = 0; i < height / 8; i++)
	{
		for(j = 0;j < weight; j++)
		{
			OLED_writeByte(*pic,OLED_DATA);
			pic++;
		}
		page += 1;
		OLED_setPos(col,page);
	}
	
}

STM32之SPI总线-CSDN博客文章来源地址https://www.toymoban.com/news/detail-796420.html

到了这里,关于STM32之OLED显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • K_A16_001 基于STM32等单片机驱动HX711称重模块 串口与OLED0.96双显示

    单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M HX711称重模块 STC89C52RC驱动HX711称重模块 串口与OLED0.96双显示 STM32F103C8T6 晶振8M/系统时钟72M HX711称重模块 STM32F103C8T6驱动HX711称重模块参数 串口与OLED0.96双显示 其他资料目录 直戳跳转 HX711参数 1.两路可选择差分输入

    2023年04月27日
    浏览(66)
  • K_A37_005 基于STM32等单片机驱动ADS1115 ADC模块 串口与OLED0.96双显示

    其他资料目录 直戳跳转 单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M ADS1115 ADC模块 STC89C52RC驱动ADS1115 ADC模块 串口与OLED0.96双显示 STM32F103C8T6 晶振8M/系统时钟72M ADS1115 ADC模块 STM32F103C8T6驱动ADS1115 ADC模块 串口与OLED0.96双显示 ADS1115 ADC模块 引脚说明 VIN 正极 5V供电

    2024年02月16日
    浏览(53)
  • K_A18_001 基于STM32等单片机采集MQ2传感参数串口与OLED0.96双显示

    单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M MQ2传感模块 STC89C52RC采集MQ2传感模块参数 串口与OLED0.96双显示 STM32F103C8T6 晶振8M/系统时钟72M MQ2传感模块 STM32F103C8T6采集MQ2传感模块参数 串口与OLED0.96双显示 其他资料目录 直戳跳转 可以用于家庭和工厂的气体泄漏监

    2024年02月01日
    浏览(82)
  • K_A16_003 基于STM32等单片机采集薄膜压力传感器参数串口与OLED0.96双显示

    单片机型号 测试条件 模块名称 代码功能 STM32F103C8T6 晶振8M/系统时钟72M 薄膜压力传感器模块 STM32F103C8T6驱动薄膜压力传感器模块 串口与OLED0.96双显示 其他资料目录 直戳跳转 厚度 :0.4mm 样式 :薄片状,柔性 触发力 :20g,默认电阻值小于 200kΩ 时触发 压力感应范围 :20g~6kg

    2024年02月05日
    浏览(50)
  • K_A18_008 基于STM32等单片机驱动SGP30气体传感器串口与OLED0.96双显示

    其他资料目录 直戳跳转 单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M SGP30气体传感器 模块 STC89C52RC驱动SGP30气体传感器模块串口与OLED0.96双显示 STM32F103C8T6 晶振8M/系统时钟72M SGP30气体传感器模块 STM32F103C8T6驱动SGP30气体传感器模块串口与OLED0.96双显示 SGP30气体传

    2024年02月04日
    浏览(52)
  • K_A35_017 基于STM32等单片机驱动TTP229矩阵触摸传感器 串口与OLED0.96双显示

    其他资料目录 直戳跳转 单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M TTP229矩阵触摸模块 STC89C52RC驱动TTP229矩阵触摸模块 串口与OLED0.96双显示 STM32F103C8T6 晶振8M/系统时钟72M TTP229矩阵触摸模块 STM32F103C8T6驱动TTP229矩阵触摸模块 串口与OLED0.96双显示 TTP229矩阵触摸传

    2024年02月02日
    浏览(43)
  • K_A12_022 基于STM32等单片机驱动VL53L0X模块 串口与OLED0.96双显示

    注:偏差校准步骤(均十六进制发送) 1、偏差校准命令 A5 21 0A D0(此处是在10CM处校准) 2、加载数据命令 A5 43 04 EC(断电重启后加载偏差补偿) 3、保存设置命令 A5 87 01 2D(保存设置后生效) 单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M VL53L0X模块 STC89C52RC驱动VL53L0X模

    2024年02月13日
    浏览(35)
  • STM32单片机(四)第一节:OLED调试工具

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月08日
    浏览(55)
  • K_A12_004 基于STM32等单片机采集人体红外感应(HC-SR501)模块串口与OLED0.96双显示

    单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M HC-SR501模块 STC89C52RC采集HC-SR501模块参数 串口与OLED0.96双显示 STM32F103C8T6 晶振8M/系统时钟72M HC-SR501模块 STM32F103C8T6采集HC-SR501模块参数 串口与OLED0.96双显示 其他资料目录 直戳跳转 HC-SR501模块 引脚说明 VCC 正极 3.3-5V供电

    2024年01月19日
    浏览(50)
  • K_A12_014 基于STM32等单片机驱动S12SD紫外线传感器模块 串口与OLED0.96双显示

    注:PCF8591为8位ADC通过计算后分辨率会相对不是很理想 建议用10位及其以上ADC模块或者用STM32 具体计算公式可参考文档手册中CJMCU-S12D-test-arduino.txt文件 单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M S12SD紫外线传感器模块 STC89C52RC采集S12SD紫外线传感器模块参数

    2024年02月05日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包