STM32基于SPI的显示(OLED)

文章目录

  • 前言
  • OLED 屏幕
  • 实验目标
    • 代码分析1
    • 代码分析2
  • 主函数
  • 实验结果
  • 总结


前言

本文使用SPI 通信的OLED屏幕,芯片使用的是STM32F103ZET6。OLED模块整体来说比较简单,就是加字模,调函数的过程。初学者可以好好看看里面包含的函数,还是很有趣的。

OLED 屏幕

OLED,即有机发光二极管。OLED由于同时具备自发光,不需要光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示技术。

LCD都需要背光,而 OLED 不需要,因为它是自发光的。这样同样的显示, OLED 效果要
来得好一些。 以目前的技术, OLED 的尺寸 还难以大型化,但是分辨率确可以做 到很高。在本章中 ,我们使用的是 ALINETEK 的 OLED 显示模块;

该模块有以下特点:

  1. 模块有单色和双色两种可选,单色为 纯蓝色 ,而双色则为黄蓝双色。
  2. 尺寸小,显示尺寸为 0.96 寸,而模块的尺寸仅为 27mm*26mm 大小。
  3. 高分辨率,该模块的分辨率为 128*64 。
  4. 多种接口方式,该模块提供了总共 5 种接口包括: 6800 、 8080 两种并行接口方式、3
    线或 4 线的穿行 SPI 接口方式, IIC 接口方式(只需要 2 根线就可以控制 OLED 了!)。
  5. 不需要高压,直接接 3.3V 就可以工作了。
  • 本文使用的是7线0.96寸SPI的OLED模块。
  • 芯片:STM32F103ZET6(正点原子)

STM32基于SPI的显示(OLED)_第1张图片
图片来自网络(如果侵权,请联系删除)。
引脚连接:

OLED STM32
VCC 3V3 或 5V
D0 PD6(SCL)
D1 PD7(SDA)
RES PD4
DC PD5
CS PD3

其中,CS 可以不用连接。

实验目标

  • 显示自己的学号和姓名
  • 显示AHT20的温度和湿度
  • 上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”

需要找一个OLED的例程,在例程里进行修改。(一般商家会提供例程)

学号显示可以使用显示字符串的函数,姓名则需要显示汉字的函数。
注意:显示汉字时,需要将汉字的点阵(利用软件生成点阵)放到存放点阵的文件中。
STM32基于SPI的显示(OLED)_第2张图片

代码分析1

显示字符串函数
void OLED_ShowString(u8 x,u8 y,u8 *chr)
{
	unsigned char j=0;
	while (chr[j]!='\0')
	{		OLED_ShowChar(x,y,chr[j]);
			x+=8;
		if(x>120){x=0;y+=2;}
			j++;
	}
}

例:OLED_ShowString(32,0,"********");
其中x,y是定义显示的位置,chr代表字符串。将收到的字符串存入字符数组中,按字符的方式输出。

显示汉字函数
void OLED_ShowCHinese(u8 x,u8 y,u8 no)
{      			    
	u8 t,adder=0;
	OLED_Set_Pos(x,y);	
    for(t=0;t<16;t++)
		{
				OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
				adder+=1;
     }	
		OLED_Set_Pos(x,y+1);	
    for(t=0;t<16;t++)
			{	
				OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
				adder+=1;
      }					
}

例:OLED_ShowCHinese(16,0,1);
其中的x,y依然定义显示的位置,后面的no表示你存入字模的数组下标。

用OLED 显示AHT20 测试的温湿度,就需要将AHT20 的模块加入到工程中。详细步骤参见链接。
然后,将AHT20中的主函数也移植到工程的主函数中,注意重定义问题
由于显示温湿度是使用的数字显示,所以就需要使用到显示数字的函数。

代码分析2

显示数字函数
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size)
{         	
	u8 t,temp;
	u8 enshow=0;						   
	for(t=0;t<len;t++)
	{
		temp=(num/oled_pow(10,len-t-1))%10;
		if(enshow==0&&t<(len-1))
		{
			if(temp==0)
			{
				OLED_ShowChar(x+(size/2)*t,y,' ');
				continue;
			}else enshow=1; 
		 	 
		}
	 	OLED_ShowChar(x+(size/2)*t,y,temp+'0'); 
	}
} 

例:OLED_ShowNum(48,2,c1,2,16);
其中x,y的含义和上面是相同的,num表示数字或者变量的值,len表示显示数字的位数,size表示显示数字的字体大小。
从函数中可以看出来,显示数字也是按照显示字符的方式来显示的。

添加所需要用到的字模到字模文件中去,依次调用其中的文字,然后利用编程进行循环显示即可。

主函数

#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "led.h"
#include "AHT20.h"
#include "myiic.h"
#include "usart.h"
int32_t main(void)
{
 uint32_t CT_data[2];
	volatile int  c1,t1;
	int i,j;
	SensorDelay_us(40000);//刚上电,延时40ms才可以读取状态
	delay_init();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    uart_init(115200);	 //串口初始化为115200
	delay_ms(40);//刚上电,延时40ms才可以读取状态
	if(!((AHT20_Read_Status()&0x08)==0x08))//首先发0x71读取状态字bit[3],如果=1,为校准输出,无须初始化!!!    正常情况下读回来的状态是0x1C或者是0x18,读回来是0x80表示忙状态;
	{
	AHT20_Init(); //初始化AHT20 
	}
	OLED_Init();			//初始化OLED  
	OLED_Clear(); 
	while(1)
	{
		OLED_ShowCHinese(0,0,0);
		OLED_ShowCHinese(16,0,1);
		OLED_ShowString(32,0,"********");
		delay_ms(5000);
	 AHT20_Read_CTdata(CT_data);       //不经过CRC校验,直接读取AHT20的温度和湿度数据    推荐每隔大于1S读一次
     c1 = CT_data[0]*100*10/1024/1024;  //计算得到湿度值(放大了10倍)
	 t1 = CT_data[1]*200*10/1024/1024-500;//计算得到温度值(放大了10倍)
		c1=c1/10;
		t1=t1/10;
		printf("湿度:%d",c1);
		printf("温度:%d\n",t1);
		delay_ms(5000);
		OLED_ShowCHinese(0,2,3);//湿
		OLED_ShowCHinese(16,2,4);//度
		OLED_ShowCHinese(32,2,5);//:
		OLED_ShowNum(48,2,c1,2,16);//温度显示
		OLED_ShowChar(62,2,'%');
		OLED_ShowCHinese(0,4,2);//温
		OLED_ShowCHinese(16,4,4);//度
		OLED_ShowCHinese(32,4,5);//:
		OLED_ShowNum(48,4,t1,2,16);//湿度显示
		OLED_ShowChar(62,4,'C');
		
		//你好,欢迎来到重庆交通大学物联网实验室
		for(i=0;i<12;i++)
		{
			OLED_ShowCHinese(0,6,6+i);//你
			OLED_ShowCHinese(16,6,7+i);//好
			OLED_ShowCHinese(32,6,8+i);//,
			OLED_ShowCHinese(48,6,9+i);//欢
			OLED_ShowCHinese(64,6,10+i);//迎
			OLED_ShowCHinese(80,6,11+i);//来
			OLED_ShowCHinese(96,6,12+i);//到
			OLED_ShowCHinese(112,6,13+i);//重
			if(i==11)
			{
				i=0;
				delay_ms(5000);
				for(j=0;j<8;j++)
				{
					OLED_ShowCHinese(112,6,6+j);
					OLED_ShowCHinese(112,6,7+j);
					OLED_ShowCHinese(112,6,8+j);
					OLED_ShowCHinese(112,6,9+j);
					OLED_ShowCHinese(112,6,10+j);
					OLED_ShowCHinese(112,6,11+j);
					OLED_ShowCHinese(112,6,12+j);
					OLED_ShowCHinese(112,6,13+j);
				}
			}
			delay_ms(5000);
		}
	 }
 }

实验结果

总结

OLED显示就是调用OLED里面的函数,然后在屏幕中进行显示的过程。一般用来显示字符、字符串、汉字以及一些小一点的图片也是能显示的。文字的显示都是有对应的点阵的,才能够进行显示。
了解OLED的使用就是对OLED调用函数的了解,请大佬指导纠错。

你可能感兴趣的:(嵌入式,stm32,spi)