OLED显示温湿度(AHT20)及姓名学号

一.SPI介绍

1.SPI协议

SPI 协议是由摩托罗拉公司提出的通讯协议(SerialPeripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间,要求通讯速率较高的场合。

1.SPI物理层

SPI 物理层
SPI 通讯设备之间的常用连接方式见下图。
在这里插入图片描述
SPI 通讯使用 3 条总线及片选线,3 条总线分别为 SCKMOSIMISO,片选线为 SS-(-为所连接从机编号)

SS-( Slave Select)

从设备选择信号线,常称为片选信号线,也称为 NSS、CS,以下用 NSS 表示。当有多个 SPI从设备与 SPI主机相连时,设备的其它信号线 SCK、MOSI及 MISO同时并联到相同的 SPI总线上,即无论有多少个从设备,都共同只使用这 3条总线;而每个从设备都有独立的这一条 NSS 信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。I2C 协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而 SPI 协议中没有设备地址,它使用 NSS 信号线来寻址,当主机要选择从设备时,把该从设备的 NSS 信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行 SPI通讯。所以 SPI通讯以 NSS 线置低电平为开始信号,以 NSS 线被拉高作为结束信号

SCK (Serial Clock)

时钟信号线,用于通讯数据同步。它由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如 STM32 的 SPI 时钟频率最大为fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备。

MOSI (Master Output, Slave Input)

主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机

MISO(Master Input,,Slave Output)

主设备输入/从设备输出引脚。主机从这条信号线
读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机

2.SPI协议层

SPI协议层
SPI 协议定义了通讯的起始和停止信号、数据有效性、时钟同步等环节。

在这里插入图片描述
由上图可以看出,NSS、SCK、MOSI 信号都由主机控制产生,而 MISO 的信号由从机产生,主机通过该信号线读取从机的数据。MOSI 与 MISO 的信号只在 NSS 为低电平的时候才有效,在 SCK 的每个时钟周期 MOSI 和 MISO 传输一位数据。

通讯的起始和停止信号
在这里插入图片描述
标号1处,NSS 信号线由高变低,是 SPI 通讯的起始信号。
NSS 是每个从机各自独占的信号线,当从机在自己的 NSS 线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。
标号6处,NSS 信号由低变高,是 SPI 通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。

数据有效性

SPI 使用 MOSI 及 MISO 信号线来传输数据,使用 SCK 信号线进行数据同步。MOSI 及MISO 数据线在 SCK 的每个时钟周期传输一位数据,且数据输入输出是同时进行的。数据传输时,MSB 先行或 LSB 先行并没有作硬性规定,但要保证两个 SPI 通讯设备之间使用同样的协定,一般都会采用图 25-2 中的 MSB 先行模式

在这里插入图片描述
MOSI 及 MISO 的数据在 SCK 的上升沿期间变化输出(触发),在SCK 的下降沿时被采样。即在 SCK 的下降沿时刻,MOSI 及 MISO 的数据有效,高电平时表示数据“1”,为低电平时表示数据“0”。在其它时刻,数据无效,MOSI及 MISO 为下一次表示数据做准备。
SPI 每次数据传输可以 8 位或 16 位为单位,每次传输的单位数不受限制。

二.stm32的SPI外设

STM32芯片有多个 SPI 外设,它们的 SPI 通讯信号引出到不同的 GPIO 引脚上,使用时必须配置到这些指定的引脚,见下图
在这里插入图片描述
SPI1 是 APB2 上的设备,最高通信速率达 36Mbtis/s,SPI2、SPI3 是 APB1 上的设备,最高通信速率为18Mbits/s。除了通讯速率,在其它功能上没有差异。其中 SPI3 用到了下载接口的引脚,这几个引脚默认功能是下载,第二功能才是 IO 口,如果想使用 SPI3 接口,则程序上必须先禁用掉这几个 IO 口的下载功能。
主模式收发流程及事件说明如下:
(1) 控制 NSS 信号线,产生起始信号;
(2) 把要发送的数据写入到“数据寄存器 DR”中,该数据会被存储到发送缓冲区;
(3) 通讯开始,SCK 时钟开始运行。MOSI 把发送缓冲区中的数据一位一位地传输出去;MISO 则把数据一位一位地存储进接收缓冲区中;
(4) 当发送完一帧数据的时候,“状态寄存器 SR”中的“TXE 标志位”会被置 1,表示传输完一帧,发送缓冲区已空;类似地,当接收完一帧数据的时候,“RXNE标志位”会被置 1,表示传输完一帧,接收缓冲区非空;
(5) 等待到“TXE标志位”为 1时,若还要继续发送数据,则再次往“数据寄存器 DR”写入数据即可;等待到“RXNE 标志位”为 1 时,通过读取“数据寄存器 DR”可以获取接收缓冲区中的内容。

三.使用0.96寸OLED显示屏显示数据

1.0.96寸OLED显示屏相关介绍

参考下面链接:
http://www.lcdwiki.com/zh/0.96inch_SPI_OLED_Module

2.运行厂家给出的Demo程序

程序下载链接:
http://www.lcdwiki.com/res/Program/OLED/0.96inch/SPI_SSD1306_MSP096X_V1.0/0.96inch_SPI_OLED_Module_SSD1306_MSP096X_V1.0.zip

3.姓名学号显示

1.修改代码

下载资料包之后打开其中的“0.96inch_SPI_OLED_Module_SSD1306_MSP096X_V1.0\1-Demo\Demo_STM32\0.96inch_OLED_Demo_STM32F103RCT6_Software_4-wire_SPI”。

1.添加字模

字模提取
利用下面所给软件生成字模

http://www.lcdwiki.com/zh/0.96inch_SPI_OLED_Module

在这里插入图片描述
点击选项修改参数
在这里插入图片描述

按照下图修改
在这里插入图片描述
生成结果如下图为例
在这里插入图片描述
字模添加
1.打开上面下载的工程文件“0.96inch_OLED_Demo_STM32F103RCT6_Software_4-wire_SPI\PROJECT\OLED.uvprojx”

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

void TEST_MainPage(void)
{	
	//主界面显示测试
//GUI_ShowString(28,0,"OLED TEST",16,1);
	//GUI_ShowString(12,16,"0.96\" SSD1306",16,1);
	//GUI_ShowString(40,32,"64X128",16,1);
	//GUI_ShowString(4,48,"www.lcdwiki.com",16,1);
	GUI_ShowCHinese(45,18,16,"独家记忆",1);
	GUI_ShowString(18,40,"1234567890",16,1);
	delay_ms(1500);		
	delay_ms(1500);
}

在这里插入图片描述

函数说明:
GUI_ShowString()
函数各参数分别对应: X 坐标、Y 坐标、字符串(ASCLL码中的)、bit(表示字符显示格式,这里我用的 16 ,和汉字一样高)、显示样式(1:白字黑底;0:黑字白底)。
GUI_ShowChinese()
函数各参数分别对应: X 坐标、Y 坐标、汉字点阵大小(这里使用的是 16×16 的,参数应该是16)、要显示的汉字、显示样式(1:白字黑底;0:黑字白底)。

int main(void)
{	
	delay_init();	    	       //延时函数初始化	  
	OLED_Init();			         //初始化OLED  
	OLED_Clear(0);             //清屏(全黑)
	while(1) 
	{	
		TEST_MainPage();         //界面显示
	}
}

2.编译烧录

在这里插入图片描述

3.结果展示

在这里插入图片描述

4.温湿度采集显示

1 .添加字模

和上述方法一样,这里不再赘述

2.修改代码

1)移植 AHT20 温湿度采集代码
从上文使用的工程文件里面移植下面 4 个文件:
bsp_i2c.h、bsp_i2c.c、
sys.h(移植后更改了名称为 AHT20_sys.h,不然会重名)、
sys.c(移植后更改了名称为 AHT20_sys.c,不然会重名);
并将bsp_i2c.c文件中的串口发送改为 OLED 显示 void Show_OLED(void) 即可。

void Show_OLED(void)
{
    GUI_ShowCHinese(20,32,16,"温度:",1);
	GUI_ShowString(60,32,strTemp1,16,1);
	GUI_ShowString(68,32,strTemp2,16,1);
	GUI_ShowString(76,32,".",16,1);
	GUI_ShowString(84,32,strTemp3,16,1);
	GUI_ShowCHinese(92,32,16,"℃",1);
    GUI_ShowCHinese(20,48,16,"湿度:",1);
	GUI_ShowString(60,48,strHumi1,16,1);
	GUI_ShowString(68,48,strHumi2,16,1);
	GUI_ShowString(76,48,".",16,1);
	GUI_ShowString(84,48,strHumi3,16,1);
	GUI_ShowCHinese(92,48,16,"%",1);
}

2)修改主函数
将 main.c 代码中不用的函数注释掉,再修改代码,之后的结果如下

#include "bsp_i2c.h"  //注意添加头文件
int main(void)
{	
	delay_init();	    	       //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	OLED_Init();			         //初始化OLED
	IIC_Init();                //初始化IIC
	OLED_Clear(0);             //清屏(全黑)
	while(1) 
	{
		read_AHT20_once();         //读取温度并显示
		OLED_Clear(0);             //清屏(全黑)		
		delay_ms(1500);
	}

3.结果显示

温湿度显示

3.长字符滑动显示

1.提取字模

在这里插入图片描述

在这里插入图片描述

2 .修改代码

1)修改显示函数
同上,在 test.c 里 void TEST_MainPage(void) 函数中不用的语句注释掉,添加自己的想要显示的字符,如下:

在这里插入图片描述
2)修改主函数
将 main.c 代码中的 while 函数注释掉,再添加如下代码:

//从左到右滑动( OLED 屏的滚屏命令)
	OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动
    OLED_WR_Byte(0x27,OLED_CMD);        //水平向左或者右滚动 26/27
    OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
	OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0
	OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔
	OLED_WR_Byte(0x07,OLED_CMD);        //终止页 7
	OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
	OLED_WR_Byte(0xFF,OLED_CMD);        //虚拟字节
	TEST_MainPage();
	OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动

在这里插入图片描述

3.编译烧录及结果展示

在这里插入图片描述

字符滑动显示

四.总结

在这次实验当中,我简单了解了SPI协议的具体内容,并把它应用到实验当中来,同时学会了屏显的使用,虽然很小,但是通过它我们也能够联想到日常生活中的大屏滚动也是基于这个原理的,联系了生活,在实验过程中,同时使用了AHT20温湿度采集和OLED屏显两个设备,还是需要对这个工作流程比较了解的,通过自己的动手实现一个显示的效果,还是很神奇的。

五.参考资料

https://blog.csdn.net/qq_43279579/article/details/111414037
https://blog.csdn.net/qq_48273416/article/details/121566802
https://blog.csdn.net/qq_46467126/article/details/121439142?spm=1001.2014.3001.5501

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值