基于SPI/IIC接口的OLED数据显示
任务
理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能:
- 显示自己的学号和姓名;
- 显示AHT20的温度和湿度;
- 上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”或者歌词、诗词。(最好使用硬件刷屏模式)
具体内容
1.字母编码
2.设置
字符模式
3.打开工程项目
连接硬件
显示学号及姓名
代码
void TEST_MainPage(void)
{
TEST_Number_Character(); //数字和符号显示
TEST_Chinese();
}
void TEST_Number_Character(void)
{
GUI_ShowString(0,0,"631807060225",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);
}
}
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);
}
}
字符滚动
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);
}
结果: