关于基于SPI接口的OLED数据显示

一、关于SPI

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

二、关于OLED

OLED即有机发光二级管(Organic Light-Emitting Diode,OLED)。OLED显示技术具有自发光、广视角、几乎无穷高的对比度、较低耗电、极高反应速度、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优点,被认为是下一代的平面显示器新兴应用技术。
OLED显示和传统的LCD 显示不同,其可以自发光,所以不需要背光灯,这使得 OLED 显示屏相对于LCD显示屏尺寸更薄,同时显示效果更优。

三、产品介绍及前期准备

该款OLED模块显示尺寸为0.96寸,拥有128x64分辨率。可以选择3线制、4线制SPI以及IIC三种通信方式,驱动IC为SSD1306。包含显示黑色、蓝色或者黄蓝双色三款模块。
我使用的是4线制SPI通信方式的黄蓝双色的模块

如何辨别自己的模块的类型可以参考下面的描述

  1. 本模块支持IIC、3线制SPI以及4线制SPI接口总线模式切换(如图2红框内所示),具体说明如下:
    A、使用4.7K电阻只焊接R3、R4,则选择4线制SPI总线接口(默认);
    B、使用4.7K电阻只焊接R2、R3,则选择3线制SPI总线接口;
    C、使用4.7K电阻只焊接R1、R4、R6、R7、R8,则选择IIC总线接口;
  2. 接口总线模式切换后,需要选择相应配套的软件和相应的接线引脚(如图1所示),模块才能正常运行。相应的接线引脚说明如下:
    A、选择4线制SPI总线接口,所有的引脚都需要使用;
    B、选择3线制SPI总线接口,只有DC引脚不需要使用(可以不接),其他引脚都需要使用;
    C、选择IIC总线接口,只需要使用GND、VCC、D0、D1这四个引脚,同时将RES接高电平(可以接VCC),DC和CS接电源地;

1.产品参数

在这里插入图片描述

2.OLED的连线

在本次操作中,我使用的是stm32的板子,所以我们在产品手册中找到stm32的接线说明
在这里插入图片描述
在这里插入图片描述

3.前期准备

在开始工作前,我们需要下载配套的资料包
下载链接:0.96寸SPI_OLED模块配套资料包
在下载的压缩包中找到下图中选中的文件夹
在这里插入图片描述
具体路径为
\0.96inch_SPI_OLED_Module_SSD1306_MSP096X_V1.0\1-Demo\Demo_STM32\0.96inch_OLED_Demo_STM32F103RCT6_Hardware_4-wire_SPI

四、所用代码

本次操作中有三个任务

  1. 显示自己的名字
  2. 显示AHT20采集的温度和湿度
  3. 上下或左右的滑动显示长字符(使用硬件刷屏模式)

1.主函数

int main(void)
{	
	int i;
	delay_init();	    	       	//初始化延时函数  
	NVIC_Configuration(); 	   		//设置NVIc中断分组2:2位抢占优先级,2位响应优先级
	OLED_Init();			        //初始化OLED  
	OLED_Clear(0);             		//ÇåÆÁ£¨È«ºÚ£©  
	delay_ms(40);					//上电后,延时40ms才能读取状态
 	AHT20_Init();     				//ATH20初始化 
	while(1) 
	{	
		//显示名字
		GUI_ShowString(0,0,"JustA-LoNg",16,1);
		GUI_ShowString(0,20,"Challenge Yourself",16,1);
		delay_ms(5000);
		OLED_Clear(0);				//清屏
		//显示AHT20采集的温湿度		
		for(i=0;i<=5;i++)
		{
			temandhum();			//采集温度
			delay_ms(5000);
			OLED_Clear(0);		
		}
		//滑动显示长字符
		gun();						//滚动文字
		GUI_ShowString(0,8,"That is not dead which can eternal lie.And with strange aeons even death may die.",8,1);
		for(i=0;i<=5;i++)
		{delay_ms(5000);}
		OLED_WR_Byte(0x2e,OLED_CMD);//停止滚动
		OLED_Clear(0);				
	}
}

2.显示名字

在下载的资料包里面,我们可以使用GUI_ShowString这个函数来显示(前提是你的名字是英文),因为隐私问题,我就用我的博客名进行代替

GUI_ShowString(0,0,"JustA-LoNg",16,1);
void GUI_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size,u8 mode)
{
	unsigned char j=0,csize;
	if(Char_Size == 16)
  {
	  csize = Char_Size/2;
	}
  else if(Char_Size == 8)
  {
	  csize = Char_Size/2+2;
	}
	else
	{
		return;
	}
	while (chr[j]!='\0')
	{		
		GUI_ShowChar(x,y,chr[j],Char_Size,mode);
		x+=csize;
		if(x>120)
		{
			x=0;
			y+=Char_Size;
		}
		j++;
	}
}

从上述代码,我们可以得知此函数的形参分别为x轴位置,y轴位置,输出的字符串,模式
所以我们只需要修改字符串就能显示自己想要的内容。
关于中文的输出我将在后面一节进行解释。

3.显示AHT20采集的温湿度

在我以前的博客中,我已经对AHT20采集温湿度进行了介绍,具体内容可以参照以下链接 关于基于I2C使用AHT21B模块及stm32核心板进行温湿度采集
之前是将采集的温度通过串口输出到电脑,这里就只需要将采集的结果通过OLED输出即可

for(i=0;i<=5;i++)
{
	temandhum();
	delay_ms(5000);
	OLED_Clear(0);		
}

这里是调用temandhum函数进行温湿度的采集,并使用for循环实现显示实时数据

下列函数就是采集温湿度的函数,在之前的博客中已有比较详细的介绍,在这里就不做展开

extern void temandhum(void)
{
		uint32_t CT_data[2]={0};
		volatile int  c1,t1;
		AHT20_Read_CTdata(CT_data);       
		c1 = CT_data[0]*100*10/1024/1024/10; 
		t1 = (CT_data[1]*200*10/1024/1024-500)/10;
		GUI_ShowCHinese(5,16,16,"温度",1);
		GUI_ShowNum(45,16,t1,3,16,1);
		GUI_ShowCHinese(70,16,16,"℃",1);
		GUI_ShowCHinese(5,40,16,"温度",1);
		GUI_ShowNum(45,40,c1,3,16,1);
		GUI_ShowString(70,40,"%",16,1);
}

在这个代码中,使用了GUI_ShowCHinese函数,此函数是用来显示中文的。想要显示自己想要的汉字,我们就需要使用到字模

字模的生成

在下载的资料包里面,我们可以找到生成字模的工具
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在使用此工具前,我们需要设置一下参数,下图是自带的教程在这里插入图片描述
在这里插入图片描述
设置完成后就可以开始生成字模
输入汉字,点击生成字模,就能在下面的窗口中看到其对应的字模
在这里插入图片描述
我们需要将生成的字模复制到工程文件夹中硬件文件夹下OLED的子文件夹中的一个头文件里去
在这里插入图片描述
找到此行,在最后面添加生成的字模即可
在这里插入图片描述
在这里插入图片描述

4.滑动显示长字符

显示长字符也是用的是GUI_ShowString这个函数,但为了让其滑动,就需要用到ssd1306的一些不常用到的命令,我们所使用的工程文件中就没有对应的命令,需要我们手动添加。

gun();		//滚动显示
GUI_ShowString(0,8,"That is not dead which can eternal lie.And with strange aeons even death may die.",8,1);
for(i=0;i<=5;i++)
	{delay_ms(5000);}
OLED_WR_Byte(0x2e,OLED_CMD);
OLED_Clear(0);		

我这里选择将这些命令单独放在一个函数里面,只让第三个任务进行滑动显示,还在for循环结束后使用关闭滚动的命令,用来表示此任务结束。

void gun(void)
{
    OLED_WR_Byte(0x2e,OLED_CMD);//关滚动
    OLED_WR_Byte(0x2a,OLED_CMD);//29向右,2a向左(垂直水平滚动)
    OLED_WR_Byte(0x00,OLED_CMD);//A:空字节
    OLED_WR_Byte(0x00,OLED_CMD);//B:水平起始页
    OLED_WR_Byte(0x00,OLED_CMD);//C:水平滚动速度
    OLED_WR_Byte(0x07,OLED_CMD);//D:水平结束页
    OLED_WR_Byte(0x01,OLED_CMD);//E:每次垂直滚动位移
	OLED_WR_Byte(0x2f,OLED_CMD);//开滚动
}

五、操作结果

1.显示名字

在这里插入图片描述

2.显示AHT20采集的温湿度

在这里插入图片描述

3.滑动显示长字符

在这里插入图片描述

六、参考资料

参考资料
0.96寸SPI 7针中文wiki
0.96寸SPI_OLED模块用户手册
0.96oled屏,驱动ssd1306 一些不常用的命令用法和效果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值