STM32 OLED显示汉字及屏幕滚动(I2C协议)

一、任务目标

理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能:

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

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

  3. 上下或左右的滑动显示长字符。

二、材料准备

硬件:

  • STM32F103C8T6最小板
  • AHT20温湿度传感器
  • ST-LINK 仿真器
  • 4针脚使用I2C通信协议的OLED屏
  • 面包板
  • 杜邦线

软件:

  • KEIL 5
  • 字模软件

三、AHT20温湿度传感器的使用

可以看我上次写的文章:STM32 I2C协议读取温湿度传感器

四、OLED的使用

1.硬件

我这里使用的是4针脚的OLED屏,通信协议是I2C。
在这里插入图片描述

2.字模

汉字编码原理

  • 1、所有的汉字或者英文都是下面的原理:
    由左至右,每8个点占用一个字节,最后不足8个字节的占用一个字节,而且从最高位向最低位排列。

  • 2、生成的字库说明:(以12×12例子)
    一个汉字占用字节数:12÷8=1····4也就是占用了2×12=24个字节。
    编码排序A0A0→A0FEA1A0→A2FE依次排列。
    以12×12字库的“我”为例:“我”的编码为CED2,所以在汉字排在CEH-AOH=2EH区的D2H-A0H=32H个。所以在12×12字库的起始位置就是[{FE-A0}*2EH+32H]*24=104976开始的24个字节就是我的点阵模。

取字模

这里我使用的取字模软件为PCtoLCD2002,打开软件之后按下图进行设置
在这里插入图片描述
在这里插入图片描述
输入要得到的字模,点击生成字模,再把生成的字模的代码复制即可
在这里插入图片描述

3.工程

这里可以用上次的AHT20的工程,复制一个,再添加OLED相关文件即可。
或者也可以直接下载我的代码。(注意是I2C通信,4针脚屏)
在这里插入图片描述
原本的字模库中已经有了数字和相关符号的字模,这里的10x16像素的字模库是刚才通过软件提取出来的,需要与数字的字模库分开定义,因为定义的像素并不一样。
除此之外,自带的函数里面并没有输出中文的方法,需要我们自己定义。

/**
  * @brief  OLED初始化
  * @param  Line 起始行位置
  * @param  Column 起始列位置
  * @retval 无
  */
void OLED_ShowCHINESE(uint8_t Line, uint8_t Column, uint8_t Num)
{
    
    
	
	uint8_t i;
	uint8_t wide = 20;//字宽
	
	OLED_SetCursor(( Line - 1 ) * 2, ( Column - 1 )* wide);		//参数1:把光标设置在第几页. 参数2:把光标设置在第几列
	for (i = 0; i < wide; i++)
	{
    
    
		OLED_WriteData(OLED_F10x16[Num][i]);			//显示上半部分内容
	}
	
	OLED_SetCursor(( Line - 1 ) * 2 + 1,( Column - 1) * wide);		
	for (i = 0; i < wide ; i++)
	{
    
     
		OLED_WriteData(OLED_F10x16[Num][i+wide]);		//显示下半部分内容
	}

}

这之后要实现滚动效果,代码及功能如下:

				OLED_WriteCommand(0x2E); //关闭滚动
				OLED_WriteCommand(0x26); //向右滚动,27则向左
				OLED_WriteCommand(0x00); //虚拟字节
				OLED_WriteCommand(0x00); //起始页 这里为0
				OLED_WriteCommand(0x07); //滚动速度
				OLED_WriteCommand(0x03); //终止页 这里为3,也就是之后的姓名,学号
				OLED_WriteCommand(0x00); //虚拟字节
				OLED_WriteCommand(0xFF); //虚拟字节
				OLED_WriteCommand(0x2F); //开启滚动

然后是主函数main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "AHT20-21_DEMO_V1_3.h"
#include <stdio.h>


int main(void)
{
    
    
	
		Init_I2C_Sensor_Port();//初始化SDA,SCL的IO口的函数
		uint32_t CT_data[2];
		volatile int  c1,t1;
		Delay_1ms(500);
		OLED_Init();//初始化OLED
		if((AHT20_Read_Status()&0x18)!=0x18)
		{
    
    
			AHT20_Start_Init(); //重新初始化寄存器
			Delay_1ms(10);
		}


		OLED_ShowCHINESE(1,1,0); //第1行第1列调用字模库第0个字 陈
		OLED_ShowCHINESE(1,2,1); //第1行第2列调用字模库第1个字 爽
		OLED_ShowString(2,1,"632007060523"); //第二行第一列显示字符串
		OLED_ShowCHINESE(3,1,3);//第3行第1列调用字模库第3个字 湿
		OLED_ShowCHINESE(3,2,4);//第3行第2列调用字模库第4个字 度
		OLED_ShowString(3,6,":"); 
		OLED_ShowCHINESE(4,1,2);//第4行第2列调用字模库第2个字 温
		OLED_ShowCHINESE(4,2,4);//第3行第2列调用字模库第4个字 度
		OLED_ShowString(4,6,":"); 
		while(1)
		{
    
    
				OLED_WriteCommand(0x2E); //关闭滚动
				OLED_WriteCommand(0x26); //向右滚动,27则向左
				OLED_WriteCommand(0x00); //虚拟字节
				OLED_WriteCommand(0x00); //起始页 这里为0
				OLED_WriteCommand(0x07); //滚动速度
				OLED_WriteCommand(0x03); //终止页 这里为3,也就是之后的姓名,学号
				OLED_WriteCommand(0x00); //虚拟字节
				OLED_WriteCommand(0xFF); //虚拟字节
				OLED_WriteCommand(0x2F); //开启滚动
	
				//AHT20_Read_CTdata(CT_data);       
				AHT20_Read_CTdata_crc(CT_data);   //CRC校验
		
				while(CT_data[0]==0x00&&CT_data[1]==0x00) 
				{
    
    
					AHT20_Read_CTdata_crc(CT_data);//CRC校验后,读取数据
				}
				c1 = CT_data[0]*100*10/1024/1024;  
				t1 = CT_data[1]*200*10/1024/1024-500;
				
				下一步客户处理数据,我们这里用两个字符串来表示计算得到的值
				char str1[5];
				char str2[5];
				sprintf(str1,"%.2f",c1/10.0);
				sprintf(str2,"%.2f",t1/10.0);
				OLED_ShowString(3,7,str1);//把浮点数转为字符串显示在屏上
				OLED_ShowString(4,7,str2);
				Delay_1ms(2000);

	}

}

4.电路连接

B1接管脚2,B0接管脚4,其他的按图接即可,图二中有几根线多余,上面的两根红线和蓝线原本是连接LED灯的,下面的三根线(蓝、黄、绿)原本是连接CH340模块的,可以不用接,本次实验不需要。
在这里插入图片描述
在这里插入图片描述
图片来源:江科大自化协

5.实验效果

可以看到,输出了自己的学号姓名,显示了温湿度,且当手靠近传感器时,温湿度有变化,并实现了滚动效果。
在这里插入图片描述

五、总结

本次实验主要使用标准库导入了AHT20模块和OLED模块,实现了显示温湿度数据和学号姓名的滚动显示。OLED屏的使用比较方便,用来调试啥的也很不错。

六、参考资料

点阵汉字的字模读取与显示
基于STM32的0.96OLED基本显示学习,及 上下或左右的滑动显示长字符(使用硬件刷屏模式),OLED显示变量值操作详细解析

猜你喜欢

转载自blog.csdn.net/cjhz2333/article/details/128005612