基于STM32的0.96寸OLED显示屏显示数据


实验环境

软件:
STM32CubeMX
KEIL5
mcuisp
串口通信助手
硬件:
STM32F103C8Tx
0.96寸OLED屏
杜邦线,面包板,USB转TTL

一、了解SPI(串行外设接口)

1. SPI 协议简介

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

学习本章时,可与 I2C 章节对比阅读,体会两种通讯总线的差异以及 EEPROM 存储器
与 FLASH 存储器的区别。下面我们分别对 SPI 协议的物理层及协议层进行讲解。

(1)SPI 物理层
SPI 通讯设备之间的常用连接方式见下图
在这里插入图片描述

SPI 通讯使用 3 条总线及片选线,3 条总线分别为 SCK、MOSI、MISO,片选线为
— —
S S ,它们的作用介绍如下:
— —
① S S ( 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)协议层
与 I2C 的类似,SPI 协议定义了通讯的起始和停止信号、数据有效性、时钟同步等环节。

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

2.STM32 的 SPI 外设简介

STM32 的 SPI 外设可用作通讯的主机及从机,支持最高的 SCK 时钟频率为 fpclk/2 (STM32F103 型号的芯片默认 fpclk1为 72MHz,fpclk2为 36MHz),完全支持 SPI 协议的 4 种模式,数据帧长度可设置为 8 位或 16 位,可设置数据 MSB 先行或 LSB 先行。它还支持双线全双工(前面小节说明的都是这种模式)、双线单向以及单线模式。其中双线单向模式可以同时使用 MOSI 及 MISO 数据线向一个方向传输数据,可以加快一倍的传输速度。而单线模式则可以减少硬件接线,当然这样速率会受到影响。我们只讲解双线全双工模式。

STM32 的 SPI 架构剖析如图:
在这里插入图片描述

二、线路连接

在这里插入图片描述

三、移植官方demo

官方已经给出了demo项目:
链接:https://pan.baidu.com/s/14wrQScC893tj-PYDEi-aCA?pwd=8888
提取码:8888

1.使用keil打开官方demo项目
在这里插入图片描述

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

3.查看烧录运行结果
在这里插入图片描述

四、OLED显示学号姓名

因为需要显示中文,所以需要添加字模

字模软件下载地址:
链接:https://pan.baidu.com/s/1ayREvio55j0QP8mCVi7fWw?pwd=8888
提取码:8888

1.首先更改字模软件的设置
取模方式:逐行式 取模走向:顺向
在这里插入图片描述

2.输入想要生成的字模
在这里插入图片描述

3.将姓名的字模添加进oledfont.h文件中cfont16[]数组
在这里插入图片描述

4.main函数中添加的代码

int main(void)
{	
	delay_init();	    	       //延时函数初始化	  
	NVIC_Configuration(); 	   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 	
	OLED_Init();			         //初始化OLED  
	OLED_Clear(0);             //清屏(全黑)
	while(1) 
	{	
		GUI_ShowCHinese(0,0,16,"姓名",1);
		GUI_ShowString(0,20,"632007060505",16,1);
	}
}

5.查看烧录运行结果
在这里插入图片描述

五、OLED显示温度

使用DHT20温湿度传感器测量温湿度已经在之前博客讲到了,详情请见:
https://blog.csdn.net/qq_52187415/article/details/127913731

1.将相关OLED显示文件移植到温度测量项目USER中,进行温湿度显示
在这里插入图片描述
2.打开温湿度项目双击USER将上面对应文件进行添加
在这里插入图片描述
3.修改main.c中的内容

#include "stm32f10x.h"                  // Device header
#include "AHT20-21_DEMO_V1_3.h"
//#include "Serial.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "delay.h"

int main(void)
{
    uint32_t CT_data[2];
	volatile int  c1,t1;
	float c,t;
	/***********************************************************************************/
	/**///上电初始化SDA,SCL的IO口
	/***********************************************************************************/
	Init_I2C_Sensor_Port();
	/***********************************************************************************/
	/**///①刚上电,产品芯片内部就绪需要时间,延时100~500ms,建议500ms
	/***********************************************************************************/
	Delay_1ms(500);
	/***********************************************************************************/
	/**///②上电第一次发0x71读取状态字,判断状态字是否为0x18,如果不是0x18,进行寄存器初始化
	/***********************************************************************************/
	if((AHT20_Read_Status()&0x18)!=0x18)
	{
	AHT20_Start_Init(); //重新初始化寄存器
	Delay_1ms(10);
	}
//	Serial_Init();
	delay_init();	    	       //延时函数初始化	  
	NVIC_Configuration(); 	   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 	
	OLED_Init();			         //初始化OLED  
	OLED_Clear(0);             //清屏(全黑)
	/***********************************************************************************/
	/**///③根据客户自己需求发测量命令读取温湿度数据,当前while(1)循环发测量命令读取温湿度数据,仅供参考
	/***********************************************************************************/
	while(1)
	{
		// AHT20_Read_CTdata(CT_data);       //不经过CRC校验,直接读取AHT20的温度和湿度数据    推荐每隔大于1S读一次
		AHT20_Read_CTdata_crc(CT_data);  //crc校验后,读取AHT20的温度和湿度数据 
		

		 c1 = CT_data[0]*100*10/1024/1024;  //计算得到湿度值c1(放大了10倍)
		 t1 = CT_data[1]*200*10/1024/1024-500;//计算得到温度值t1(放大了10倍)
		 c=c1/10.0;
		 t=t1/10.0;
		
		下一步客户处理显示数据,
		/***********************************************************************************/
		
		GUI_ShowCHinese(0,0,16,"温度:",1);
		GUI_ShowNum(40,0,t1/10,2,16,1);
		GUI_ShowString(57,0,".",16,1);
		GUI_ShowNum(60,0,t1%10,1,16,1);
		GUI_ShowCHinese(0,16,16,"湿度:",1);
		GUI_ShowNum(40,16,c1/10,2,16,1);
		GUI_ShowString(57,16,".",16,1);
		GUI_ShowNum(60,16,c1%10,1,16,1);
		
		
	 }

 }	

4.烧录查看结果
在这里插入图片描述

六、OLED滚动显示诗句

官方demo项目已经给了滑动显示的函数

1.在OLED官方demo项目下添加诗句字模,修改main代码
在这里插入图片描述

delay_init();	    	       //延时函数初始化	  
	NVIC_Configuration(); 	   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 	
	OLED_Init();			         //初始化OLED  
	OLED_Clear(0);             //清屏(全黑)
	OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动
    OLED_WR_Byte(0x26,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);        //虚拟字节
	GUI_ShowCHinese(0,20,16,"青青子衿,悠悠我心。",1);
	delay_ms(1500);		
	delay_ms(1500);
	OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动

2.烧录查看运行结果
在这里插入图片描述

七、总结

学会使用OLED显示各种数据,主要目的是为了熟悉spi协议,学会使用spi协议进行数据交换。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值