文章目录
- 一、任务目标
- 二、材料准备
- 硬件:
- 软件:
- 三、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 < 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显示变量值操作详细解析