STM32开发基于SPI接口的OLED数据显示

一、SPI简介

SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。

更多可参考SPI详解

二、0.96inch SPI OLED 介绍

  1. 图片展示
    在这里插入图片描述
序号模块引脚引脚说明
1GND电源地
2OLED电源正(3.3V~5V)
3D0SPI和IIC总线时钟信号
4D1OLED SPI和IIC总线数据信号
5RESOLED复位信号,低电平复位(选择IIC总线时,该引脚需要接高电平(可以接VCC))
6DCOLED命令/数据输入选择信号,高电平:数据,低电平:命令选择(3线制SPI总线时,该引脚不需要使用(可以不接);选择IIC总线时,该引脚需要接电源地)
7CSOLED片选信号,低电平使能(选择IIC总线时,该引脚需要接电源地)

更多信息0.96inch SPI OLED Module

三、实验内容及结果

1. 任务要求

  1. 显示自己的学号和姓名;

  2. 显示AHT20的温度和湿度;

  3. 上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”或者一段歌词或诗词(最好使用硬件刷屏模式)。

2. 准备工作

  1. SPI_PLED模块demo程序下载
  2. 提取链接中文点阵字库及显示工具程序
    提取码:xfut
    复制这段内容后打开百度网盘手机App,操作更方便哦

3. 演示如下

当下载上面的demo程序后用keil打开,即可在main.c中编写以下代码

  1. 先显示姓名及学号
    显示汉字需要用上面的工具提取相应的字模,使用教程也在其中
    添加到oledfont.h中,如下
    在这里插入图片描述
void TEST_MainPage1()
{	
		
	  GUI_ShowCHinese(30,0,16,"木子曦",1);//中文姓名
	  GUI_ShowString(5,15,"631907060517",16,1);//学号
	  Delay_1ms(1000);
}
int main(void)
{	
	delay_init();	    	       //延时函数初始化	
	OLED_Init();			         //初始化OLED  
	OLED_Clear(0);             //清屏(全黑)
	
	/***********************************************************************************/
	/**///①刚上电,产品芯片内部就绪需要时间,延时100~500ms,建议500ms
	/***********************************************************************************/
/***********************************************************************************/
	/**///②上电第一次发0x71读取状态字,判断状态字是否为0x18,如果不是0x18,进行寄存器初始化
	/***********************************************************************************/
 
   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(0x01,OLED_CMD); //终止页 2

	OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节

	OLED_WR_Byte(0xFF,OLED_CMD); //虚拟字节
	while(1) 
	{			
		TEST_MainPage1();         //界面显示
		OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动
	    Delay_1ms(2000);

	}
}
  1. 效果

在这里插入图片描述

  1. 将温湿度的数据显示在屏幕上
    基于I2C协议的AHT20温湿度数据收集参考我之间写的基于I2C协议的AHT20温湿度传感器的数据采集

main.c代码:

#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
#include "AHT20-21_DEMO_V1_3.h" 
void TEST_MainPage1(int c1,int t1)
{	
		
	GUI_ShowCHinese(30,0,16,"木子曦",1);//中文姓名
	GUI_ShowString(5,15,"631907060517",16,1);//数字详细
    GUI_ShowCHinese(5,30,16,"湿度",1);
    GUI_ShowCHinese(5,45,16,"温度",1);
	GUI_ShowNum(35,30,c1/10,4,16,1);
	GUI_ShowCHinese(80,30,16,"%",1);
	GUI_ShowNum(35,45,t1/10,4,16,1);
	GUI_ShowCHinese(80,45,16,"℃",1);
	Delay_1ms(1000);
}
volatile int  c1,t1;
uint32_t CT_data[2]={0,0};
u8 temp[10];  
u8 hum[10];
int main(void)
{	
	delay_init();	    	       //延时函数初始化	
	OLED_Init();			         //初始化OLED  
	OLED_Clear(0);             //清屏(全黑)
	
	/***********************************************************************************/
	/**///①刚上电,产品芯片内部就绪需要时间,延时100~500ms,建议500ms
	/***********************************************************************************/
	AHT20_Init();
	Delay_1ms(500);
	/***********************************************************************************/
	/**///②上电第一次发0x71读取状态字,判断状态字是否为0x18,如果不是0x18,进行寄存器初始化
	/***********************************************************************************/
  
	if((AHT20_Read_Status()&0x18)!=0x18)
	{
		AHT20_Start_Init(); //重新初始化寄存器
		Delay_1ms(10);
	}
	
	  
	//NVIC_Configuration(); 	   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 	
   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(0x01,OLED_CMD); //终止页 2

	OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节

	OLED_WR_Byte(0xFF,OLED_CMD); //虚拟字节
	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倍)	
		TEST_MainPage1(c1,t1);         //界面显示
		OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动
	  Delay_1ms(2000);

	}
}

在这里插入图片描述

四、参考

完整代码github
0.96inch SPI OLED Module

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显示效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值