STM32 OLED显示汉字及屏幕滚动(I2C协议) 您所在的位置:网站首页 用oled显示汉字 STM32 OLED显示汉字及屏幕滚动(I2C协议)

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

2024-07-08 10:51| 来源: 网络整理| 查看: 265

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

一、任务目标

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

显示自己的学号和姓名;

显示AHT20的温度和湿度;

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

二、材料准备 硬件: 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 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 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显示变量值操作详细解析



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有