学习任务
理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能:
- 显示自己的学号和姓名;
- 显示AHT20的温度和湿度;
- 上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”或者歌词、诗词。(最好使用硬件刷屏模式)
学习内容
1. 获取字幕编码
打开PCtolCD2002.具体路径如下:
选择选项将格式改为c51格式,模式改为字符模式。
输入名字,点击生成字模得到字幕编码。
1.2.keil文件路径如下:
2.2.把温湿度程序头文件与c文件添加进来(具体文件参考之前博客)
2.代码
2.1 显示自己的学号和姓名;
test.c中的TEST_MainPage函数改为
void TEST_MainPage(void)
{
TEST_Number_Character(); //数字和符号显示
TEST_Chinese();
}
void TEST_Number_Character(void)
{
GUI_ShowString(0,0,"631807060223",8,1); //输出学号
}
void TEST_Chinese(void)
{
GUI_ShowCHinese(16,20,16,"巴卫",1); //输出字符
delay_ms(1000);
}
主函数main.c改为
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
int main(void)
{
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
OLED_Init(); //初始化OLED
OLED_Clear(0); //清屏(全黑)
while(1)
{
TEST_MainPage(); //主界面显示测试
OLED_Clear(0);
}
}
将/gui.c/oledfont.h中将字幕程序得到的字幕编码添加进入16x16队列
DB 00H 00H 3FH F8H 21H 08H 21H 08H 21H 08H 21H 08H 21H 08H 3FH F8H;
DB 20H 08H 20H 00H 20H 00H 20H 02H 20H 02H 20H 02H 1FH FEH 00H 00H;"巴",0
DB 00H 00H 7FH F8H 02H 08H 02H 08H 02H 08H 02H 08H 02H 08H 02H 08H;
DB 02H 28H 02H 10H 02H 00H 02H 00H 02H 00H 02H 00H FFH FEH 00H 00H;"卫",1
DB 00H 00H 23H F8H 12H 08H 12H 08H 83H F8H 42H 08H 42H 08H 13H F8H;
DB 10H 00H 27H FCH E4H A4H 24H A4H 24H A4H 24H A4H 2FH FEH 00H 00H;"温",2
DB 00H 00H 27H F8H 14H 08H 14H 08H 87H F8H 44H 08H 44H 08H 17H F8H;
DB 11H 20H 21H 20H E9H 24H 25H 28H 23H 30H 21H 20H 2FH FEH 00H 00H;"湿",3
DB 01H 00H 00H 80H 3FH FEH 22H 20H 22H 20H 3FH FCH 22H 20H 22H 20H;
DB 23H E0H 20H 00H 2FH F0H 24H 10H 42H 20H 41H C0H 86H 30H 38H 0EH;"度",4
2.2 显示AHT20的温度和湿度
test.c中加入以下代码
//温度显示函数
void show_tem(int hem,int tem)
{
GUI_ShowString(8,32,"温度: ",16,1);//显示湿度
GUI_ShowNum(48,32,hem,2,16,1);
GUI_ShowString(64,32,"%",16,1);
GUI_ShowString(8,48,"湿度: ",16,1);//显示温度
GUI_ShowNum(48,48,tem,2,16,1);
GUI_ShowCHinese(64,48,16,"¡æ",1);
}
主函数main.c修改为:
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
#include "24cxx.h"
#include "AHT20.h"
struct m_AHT20 AHT20;
int main(void)
{
int hem,tem;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
IIC_Init();
AHT20.alive=!AHT20_Init();
OLED_Init();
OLED_Clear(0);
while(1)
{
show_my_num();
show_my_name();
if(AHT20.alive)
{
AHT20.flag = AHT20_ReadHT(AHT20.HT);
hem = AHT20.HT[0]*100*10/1024/1024/10;
tem = (AHT20.HT[1]*200*10/1024/1024-500)/10;
}
show_tem(hem,tem);
delay_ms(9000);
delay_ms(9000);
}
}
2.3 上下或左右的滑动显示长字符
在test.c中加入以下代码:
void Roll_display(void)
{
int i,j,m=112,n=0,k=0;
for(j=0;j<1;j++)
for(i=m;i>=-208;i-=1)
{
if(i<m&&i>n)
GUI_ShowFont16(i,22,"信",1);
if(i+16<m&&i+16>n)
GUI_ShowFont16(i+16,22,"息",1);
if(i+32<m&&i+32>n)
GUI_ShowFont16(i+32,22,"科",1);
if(i+48<m&&i+48>n)
GUI_ShowFont16(i+48,22,"学",1);
if(i+64<m&&i+64>n)
GUI_ShowFont16(i+64,22,"与",1);
if(i+80<m&&i+80>n)
GUI_ShowFont16(i+80,22,"工",1);
if(i+96<m&&i+96>n)
GUI_ShowFont16(i+96,22,"程",1);
if(i+112<m&&i+112>n)
GUI_ShowFont16(i+112,22,"学",1);
if(i+128<m&&i+128>n)
GUI_ShowFont16(i+128,22,"院",1);
if(i+144<m&&i+144>n)
GUI_ShowFont16(i+144,22,"物",1);
if(i+160<m&&i+160>n)
GUI_ShowFont16(i+160,22,"联",1);
delay_ms(42);
k++;
if(k==16)
{
OLED_Clear(0);
k=0;
}
}
}
编写roll函数:
void roll(void)
{
OLED_WR_Byte(0x2F, OLED_CMD);
OLED_WR_Byte(0x27, OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0x07,OLED_CMD);
OLED_WR_Byte(0x2E,OLED_CMD);
while(1);
}
显示函数:
void show_roll(void)
{
GUI_ShowCHinese(45,16,16,"信息科学与工程学院物联",1);
}
3.演示结果
显示自己的学号和姓名:
显示AHT20的温度和湿度:
上下或左右的滑动显示长字符: