STM32硬件SPI驱动OLED

文章目录一、OLED相关1、OLED简介2、0.96寸的OLED模块概述3、模块引脚说明二、硬件SPI1、SPI简介2、SPI的引脚映射关系三、SPI驱动的OLED1、实验要求2、实验环境3、实验过程3.1 实验代码3.2 实验结果一、OLED相关1、OLED简介OLED即有机发光二级管(Organic Light-Emitting Diode,OLED)。OLED 显示技术具有自发光、广视角、几乎无穷高的对比度、较低耗电、极高反应速度、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优点,被
摘要由CSDN通过智能技术生成

一、OLED相关

1、OLED简介

  • OLED即有机发光二级管(Organic Light-Emitting Diode,OLED)。OLED 显示技术具有自发光、广视角、几乎无穷高的对比度、较低耗电、极高反应速度、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优点,被认为是下一代的平面显示器新兴应用技术。

  • OLED 显示和传统的 LCD 显示不同,其可以自发光,所以不需要背光灯,这使得OLED 显示屏相对于LCD显示屏尺寸更薄,同时显示效果更优。

  • LCD都需要背光,而OLED不需要,因为它是自发光的。这样同样的显示,OLED效果要来得好一些。以目前的技术,OLED的尺寸还难以大型化,但是分辨率确可以做到很高。

2、0.96寸的OLED模块概述

模块背面图
在这里插入图片描述
该款OLED模块显示尺寸为0.96寸,拥有128x64分辨率。可以选择3线制、4线制SPI以及lIC三种通信方式,驱动IC为SSD1306。包含显示黑色、蓝色或者黄蓝双色三款模块。

具体说明如下:

  • A、使用4.7K电阻只焊接R3、R4电阻,则选择4线制SPI总线接口(默认)﹔
  • B、使用4.7K电阻只焊接R2、R3电阻,则选择3线制SPI总线接口;
  • C、使用4.7K电阻只焊接R1、R4、R6、R7、R8电阻,则选择IIC总线接口;

3、模块引脚说明

在这里插入图片描述

接口总线模式切换后,需要选择相应配套的软件和相应的接线引脚,模块才能正常运行。相应的接线引脚说明如下:

  • A、选择4线制SPI总线接口,所有的引脚都需要使用;

  • B、选择3线制SPI总线接口,只有DC引脚不需要使用(可以不接),其他引脚都需要使用;

  • C、选择IIC总线接口,只需要使用GND、VCC、D0、D1这四个引脚,同时将RES引脚接高电平(可以接VCC),将DC和CS引脚接电源地;

4、汉字点阵编码原理

汉字点阵编码

  • 在汉字的点阵字库中,每个字节的每个位都代表一个汉字的一个点,每个汉字都是由一个矩形的点阵组成,0 代表没有点,1 代表有点,将 0 和 1 分别用不同颜色画出,就形成了一个汉字,常用的点阵矩阵有 12*12, 14*14, 16*16 三 种字库。

  • 字库根据字节所表示点的不同有分为横向矩阵和纵向矩阵,目前多数的字库都是横向矩阵的存储方式(用得最多的应该是早期 UCDOS 字库),纵向矩阵一 般是因为有某些液晶是采用纵向扫描显示法,为了提高显示速度,于是便把字库 矩阵做成纵向,省得在显示时还要做矩阵转换。

OLED点阵显示

  • 点阵屏像素按128列X64行组织,每一行128个像素单元的阴极是连接在一起,作为公共极(COM),每一列64个像素单元的阳极也连接在一起,作为一段(SEG)。行列交叉点上的LED就是一个显示单元,即一个像素。要点亮一个像素,只要在该像素所在列电极上加上正电压、行电极接地。同样,要驱动一整行图像,就需要同时把128列信号加载到列电极上,把该行行电极接地。该行显示时,其他63行均不能显示,其行电极应为高电平或悬空。

  • 可见,整屏的显示,只能分时扫描进行,一行一行的显示,每次显示一行。行驱依次产生低电平扫描各行,列驱动读取显示数据依次加载到列电极上。扫描一行的时间称为行周期,完成一次全屏扫描,就叫做一帧。一般帧频大于60,人眼观察不到逐行显示。每行扫描显示用时叫占空比,占空比小,为达到相同的显示亮度,驱动电流就大。SSD1306段驱动最大电流为100uA,当整行128个像素全部点亮时,行电极就要流过12.8mA的电流。

二、硬件SPI

OLED 驱动方式

  • 此模块支持四线 SPI、三线 SPI、IIC 接口和 6800、8080 并口方式,模块的通信接口是通过 BS0,BS1,BS2 三个管脚来配置。
    在这里插入图片描述此处使用四线 SPI。

1、SPI简介

  • SPI是串行外设接口(Serial Peripheral Interface)的简写,其实就是一种总线通信协议,该总线以主从方式工作,通常是一个主设备和一个或多个从设备,一般需要4根线来进行数据通信,即SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选),相应的,有一套时序逻辑规定了通信过程。
  • 一般使用SPI的设备都配备了现成的SPI模块,只需要对相应的寄存器写入指令就可以进行通信了,如果没有SPI接口,也可以软件实现,就是根据时序图手动操作GPIO来实现通信,这就比较费劲了。

2、SPI的引脚映射关系

在这里插入图片描述

  • SS( Slave Select):从设备选择信号线,常称为片选信号线。
  • SCK (Serial Clock):时钟信号线,用于通讯数据同步。
  • MOSI (Master Output, Slave Input):主设备输出/从设备输入引脚。
  • MISO(Master Input,,Slave Output):主设备输入/从设备输出引脚。

三、SPI驱动的OLED

1、实验要求

  • 显示自己的学号和姓名;

  • 显示AHT20的温度和湿度;

  • 上下或左右的滑动显示长字符,比如歌词、诗词。(最好使用硬件刷屏模式)

2、实验环境

  • keil5编程软件

  • 野火STM32F103指南者开发板

  • 0.96寸的OLED模块

3、实验结果

(1)显示自己的学号和姓名

实验代码
测试例程下载地址:
http://www.lcdwiki.com/zh/0.96inch_SPI_OLED_Module#.E7.A8.8B.E5.BA.8F.E4.B8.8B.E8.BD.BD
在这里插入图片描述
打开keil工程文件
在这里插入图片描述
利用取模软件,写好自已要显示的内容
在这里插入图片描述
取模时注意要设置参数
在这里插入图片描述

取模软件: PCtoLCD2002完美版.zip
提取码:jfbr

将生成的点阵添加进数组
在这里插入图片描述

注意:在添加字模时,要添加进汉字显示对应的数组。(此处我选择的是16 * 16大小的OLED汉字显示)

修改main.c如下

int main(void)
{
   	
	delay_init();	    	       //延时函数初始化	  
	NVIC_Configuration(); 	   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 	
	OLED_Init();			         //初始化OLED  
	OLED_Clear(0);             //清屏(全黑)
	while(1) 
	{
   	
		TEST_MainPage();         //主界面显示测试
	}
}

修改test.c如下:

void TEST_MainPage(void)
{
   	
	GUI_ShowCHinese(28,20,16,"XX",1);  //XX为名字
    GUI_ShowString(4,48,"YY",16,1);   //YY为学号
	delay_ms(1500);		
	delay_ms(1500);
}

函数说明

  • GUI_ShowString() 的参数
    参数一:X 坐标
    参数二:Y 坐标
    参数三:字符串(ASCLL码中的)
    参数四:bit (表示字符显示格式,这里我用的 16 ,和汉字一样高)
    参数五:显示样式(1:白字黑底;0:黑字白底)

  • GUI_ShowChinese() 的参数
    参数一:X 坐标
    参数二:Y 坐标
    参数三:汉字点阵大小(这里使用的是 16×16 的,参数应该是 16)
    参数四:要显示的汉字
    参数五:显示样式(1:白字黑底;0:黑字白底)

编译运行生成.hex文件
在这里插入图片描述

屏幕显示
按照下图对应连接好STM32开发版和OLED模块
在这里插入图片描述

注:其中CS不接

连接好后如下图
在这里插入图片描述

将代码烧进板子里(.hex文件)
在这里插入图片描述
最终OLED模块显示如下图
在这里插入图片描述

(2)显示AHT20的温度和湿度

实验代码
AHT20的温湿度的读取工程:https://github.com/Thee24LYJ/STM32_AHT20
AHT20 温湿度采集工程文件中的部分代码文件移植到OLED显示的工程文件中:
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

注意要把文件路径添加进去
在这里插入图片描述
bsp_i2c.c修改如下

uint8_t  t;
u8 *strTemp1;
u8 *strTemp2;
u8 *strTemp3;
u8 *strHumi1;
u8 *strHumi2;
u8 *strHumi3;
void read_AHT20(void)
{
   
	uint8_t i;

	//初始化 readByte 数组
	for(i=0; i<6; i++)
	{
   
		readByte[i]=0;
	}

	I2C_Start();

	//通过发送 0x71 可以获取一个字节的状态字
	I2C_WriteByte(0x71);
	ack_status = Receive_ACK();
	
	//接收 6 个 8 bit的数据
	readByte[0]= I2C_ReadByte();
	//发送 ACK 信号
	Send_ACK();

	readByte[1]= I2C_ReadByte();
	Send_ACK();

	readByte[2]= I2C_ReadByte();
	Send_ACK();

	readByte[3]= I2C_ReadByte();
	Send_ACK();

	readByte[4]= I2C_ReadByte();
	Send_ACK();

	readByte[5]= I2C_ReadByte();
	//发送 NACK 信号
	SendNot_Ack();

	I2C_Stop();

	//温湿度的二进制数据处理
	//0x68 = 0110 1000
  //0x08 = 0000 1000	
	if( (readByte[0] & 0x68) == 0x08 )
	{
   
		H1 = readByte[1];
		//H1 左移 8 位并与 readByte[2] 相或 
		H1 = (H1<<8) | readByte[2];
		H1 = (H1<<8) | readByte[3];
		//H1 右移 4 位
		H1 = H1>>4;

		H1 = (H1*1000)/1024/1024;

		T1 = readByte[3];
		//与运算
		T1 = T1 & 0x0000000F;
		T1 = (T1<<8) | readByte[4];
		T1 = (T1<<8) | readByte[5];

		T1 = (T1*2000)/1024/1024 - 500;

		AHT20_OutData[0] = (H1>>8) & 0x000000FF;
		AHT20_OutData[1] = H1 & 0x000000FF;

		AHT20_OutData[2] = (T1>>8) & 0x000000FF;
		AHT20_OutData[3] = T1 & 0x000000FF;
	}
  • 25
    点赞
  • 150
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
STM32是一款强大的微控制器系列产品,OLED是一种流行的显示器件。为了驱动OLED显示屏,通常使用SPI(串行外设接口)协议进行通信。 首先,需要将OLEDSTM32之间的连接线连接好,包括CLK(时钟)、MOSI(主输出从输入)、CS(片选)和DC(数据/命令选择)等线路。然后,按照以下步骤进行模拟SPI驱动OLED: 1. 确定STM32的引脚配置,将其配置为GPIO模式,并将其设置为输出模式。 2. 设置SPI的通信参数,包括数据位数、数据传输速率等。 3. 在主控程序中,选择要发送的数据,将其存储在适当的寄存器中。 4. 使用STM32提供的SPI发送函数,将数据发送到OLED。在发送之前,需要将片选线(CS)置低以选择OLED。 5. 等待数据传输完成,可以使用延迟函数或轮询方式来实现。 6. 将片选线(CS)置高,以停止OLED的数据接收。 以上步骤是模拟SPI驱动OLED的基本过程。但是需要根据具体的硬件和软件情况进行适当的调整和优化。例如,可以添加错误检测和纠正机制,以保证数据的正确传输;还可以使用中断方式来提高数据传输的效率。另外,还需要根据OLED的数据手册提供的指令和数据格式来进行相关编码和解码工作。 总之,使用STM32的模拟SPI驱动OLED需要掌握SPI协议的基本原理和STM32的编程知识,通过配置引脚、设置SPI通信参数和发送数据等操作来完成驱动过程。同时,灵活运用调试工具和参考资料,加上不断实践和调试,最终实现稳定可靠的OLED显示效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值