STM32通过I2C协议在OLED屏上显示汉字及实现屏幕滚动

文章目录

  • 一、任务目标
  • 二、材料准备
  • 硬件:
  • 软件:
  • 三、AHT20温湿度传感器的使用
  • 四、OLED的使用
  • 1.硬件
  • 2.字模
  • 汉字编码原理
  • 取字模
  • 3.工程
  • 4.电路连接
  • 5.实验效果
  • 五、总结
  • 六、参考资料
  • 一、任务目标

    理解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针脚屏)

    原本的字模库中已经有了数字和相关符号的字模,这里的10×16像素的字模库是刚才通过软件提取出来的,需要与数字的字模库分开定义,因为定义的像素并不一样。
    除此之外,自带的函数里面并没有输出中文的方法,需要我们自己定义。

    /**
      * @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显示变量值操作详细解析

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32通过I2C协议在OLED屏上显示汉字及实现屏幕滚动

    发表评论