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

一、利用SPI串口在OLED屏幕上显示数据

1.什么是SPI

SPI(Serial Peripheral Interface)就是串行外围设备接口。

SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚。SPI 是一个环形总线结构,由 ss(cs)、sck、sdi、sdo 构成,时序主要是在 sck 的控制下,两个双向移位寄存器进行数据交换。

上升沿发送、下降沿接收、高位先发送。

上升沿到来的时候,sdo 上的电平将被发送到从设备的寄存器中。

下降沿到来的时候,sdi 上的电平将被接收到主设备的寄存器中。

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

本次使用的开发板为野火stm32指南者

利用OLED所带的官方代码进行改进

链接: 0.96寸SPI 7针中文wiki:

下载解压后,选择1-Demo->Demo_STM32->0.96inch_OLED_Demo_STM32F103RCT6_Hardware_4-wire_SPI->PROJECT里面找到工程文件
在这里插入图片描述具体连接方式入main函数的注释一样进行连接
在这里插入图片描述而此时将其烧录到板子中是他原厂的一些东西,不是我们想要的

要想输出我们想要的一些汉字,需要了解中文的点阵(16*16)

在这里插入图片描述
在此字库种找到那些我们需要的汉字或者数字等,然后使用他们的16进制码,才能显示我们想要的文字

这是我等下将要输入的汉字的代码

DB 04H 40H 3FH F8H 04H 40H 04H 40H FFH FEH 01H 00H 1FH F0H 11H 10H;
DB 11H 10H 1FH F0H 11H 10H 11H 10H 1FH F0H 04H 40H 08H 20H 10H 10H;"黄",0
DB 00H 40H 00H 40H 78H A0H 49H 10H 4AH 08H 4CH 06H 4BH F8H 48H 00H;
DB 48H 00H 4BH F8H 7AH 08H 4AH 08H 02H 08H 02H 08H 03H F8H 02H 08H;"哈",1
DB 00H 40H 00H 40H 78H A0H 49H 10H 4AH 08H 4CH 06H 4BH F8H 48H 00H;
DB 48H 00H 4BH F8H 7AH 08H 4AH 08H 02H 08H 02H 08H 03H F8H 02H 08H;"哈",2

实现显示代码

void TEST_MainPage(void)
{	
	GUI_ShowCHinese(20,20,16,"黄哈哈",1);//中文姓名
	GUI_ShowString(10,40,"631807030114",16,1);//数字详细
	delay_ms(1500);		
	delay_ms(1500);
}

主函数如下:

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

显示结果
在这里插入图片描述(眼睛看着没有帧变化,但手机照出来却有一闪一闪的)

二、显示AHT20的温度和湿度

1.实验代码

显示温湿度,需要将上述代码进行改变

添加bsp_i2c.c,bsp_i2c.,usart.c,usart.h文件到USER文件夹中

具体代码请移步:
链接: 利用ATH20连接stm32的温度采集

在这里插入图片描述并在工程文件的USER中进行添加
在这里插入图片描述然后向HARDWARE加入stm32f10x_usart.c,该文件在STM32F10x_FWLib\src中
在这里插入图片描述温湿度几个字和冒号的字模要添加到oledfont.h中

添加相应的点阵字

	"温",0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,
  0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00,/*"温",0*/
	"度",0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x22,0x20,
  0x23,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x10,0x42,0x20,0x41,0xC0,0x86,0x30,0x38,0x0E,/*"度",0*/
	"湿",0x00,0x00,0x27,0xF8,0x14,0x08,0x14,0x08,0x87,0xF8,0x44,0x08,0x44,0x08,0x17,0xF8,
  0x11,0x20,0x21,0x20,0xE9,0x24,0x25,0x28,0x23,0x30,0x21,0x20,0x2F,0xFE,0x00,0x00,/*"湿",0*/
	"显",0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,
  0x04,0x40,0x44,0x44,0x24,0x44,0x14,0x48,0x14,0x50,0x04,0x40,0xFF,0xFE,0x00,0x00,/*"显",0*/
	"示",0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x01,0x00,
  0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x41,0x02,0x81,0x02,0x05,0x00,0x02,0x00,/*"示",0*/

在这里插入图片描述
再修改主函数代码为

#include "delay.h"
#include "usart.h"
#include "bsp_i2c.h"
#include "sys.h"

#include "oled.h"
#include "gui.h"
#include "test.h"

int main(void)
{	
	delay_init();	    	       //延时函数初始化    	  
	uart_init(115200);	 
	IIC_Init();
		  
	NVIC_Configuration(); 	   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 	
	OLED_Init();			         //初始化OLED  
	OLED_Clear(0); 
	while(1)
	{
		//printf("温度湿度显示");
		read_AHT20_once();
		OLED_Clear(0); 
		delay_ms(1500);
  }
}

实验结果

显示屏上显示出AHT20测出的温湿度
在这里插入图片描述

三、上下的滑动显示长字符

OLED屏的滚屏命令有水平平移垂直和水平滚动两种方式
添加的两种代码如下:
水平左右

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);        //虚拟字节
OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动

垂直和水平滚动

OLED_WR_Byte(0x2e,OLED_CMD);        //关闭滚动
OLED_WR_Byte(0x29,OLED_CMD);        //水平垂直和水平滚动左右 29/2a
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);        //终止页 1
OLED_WR_Byte(0x01,OLED_CMD);        //垂直滚动偏移量
OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动

1.代码

采用最开始的工程文件,对其进行改造
把main.c改为如下(滑动字符根据自己的需要添加字模并改动)

#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
int main(void)
{	
	delay_init();	    	       
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 
	OLED_Init();			    
	OLED_Clear(0);             
	while(1) 
	{	
			GUI_ShowString(0,0,"HCC",8,1);
			delay_ms(50);
		  roll();
	}
}


在HARDWARE的oled.c文件下的末尾加入以下代码

void roll(void)
{
        OLED_WR_Byte(0x2e,OLED_CMD);       
        OLED_WR_Byte(0x29,OLED_CMD);       
        OLED_WR_Byte(0x00,OLED_CMD);       
        OLED_WR_Byte(0x00,OLED_CMD);        
        OLED_WR_Byte(0x07,OLED_CMD);        
        OLED_WR_Byte(0x07,OLED_CMD);        
        OLED_WR_Byte(0x01,OLED_CMD);       
        OLED_WR_Byte(0x2F,OLED_CMD); 
}       

实验结果

横屏
在这里插入图片描述
输入的数据“ HCC ”在显示屏上水平滑动

竖屏
在这里插入图片描述“欢迎来到重交大”,在显示屏上垂直滑动

四、心得体会

通过本次实验,实现了利用ISP传输数据到OLED上,还结合了之前的AHT20芯片,通过另一种方式显示了采集的数据。其中,滚动的方式实现参考了许多资料,最后终于做了出来。


版权声明:本文为ii231原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。