一、实验目的
理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能:
1、显示自己的学号和姓名;
2、显示AHT20的温度和湿度;
3、上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”或者歌词、诗词。
二、准备工作
1、stm32mini开发板
2、AHT20温度传感器
3、下载线
4、0.96OLED
5、例程下载:https://detail.tmall.com/item.htm?spm=a1z0d.6639537.1997196601.80.201d74841fbMPw&id=556732249552
三、理论基础
1、0.96OLED简介
- OLED即有机发光二级管(Organic Light-Emitting Diode,OLED)。OLED显示技术具有自发光、广视角、几乎无穷高的对比度、较低耗电、极高反应速度、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优点,被认为是下一代的平面显示器新兴应用技术。
- OLED 显示和传统的LCD显示不同,其可以自发光,所以不需要背光灯,这使得OLED 显示屏相对于LCD显示屏尺寸更薄,同时显示效果更优
2、接线说明
针对七孔0.96OLED对MINIstm32开发板的连接
四、实验步骤
1、显示自己的学号和姓名
步骤1:打开例程进入如下画面
发现main函数中有很多测试函数。
这里我只保留了主界面显示测试,其他测试都注释掉了,保留的测试用于显示学号和姓名。
步骤2:进入主界面显示测试函数,右击函数,选择Go To Definition Of 'TEST_MainPage’进入该函数。
进入后修改函数类容,添加两个函数如下,进行学号和姓名的显示,原来该函数内的内容可以删掉或注释掉
这两个函数是以及写好了的,可供调试的函数
步骤3:分别进行用于显示学号和姓名的两个函数,步骤如步骤2所示
GUI_ShowString()这个函数用于显示学号
GUI_ShowCHinese()这个函数用于显示姓名
步骤4:在显示姓名的函数中,我们要进行数组内容的修改。
最后会进入如下界面:
图中相应部分我已进行修改,就是通过修改cfont16[]这个数组内容进行不同的汉字输出的
步骤5:汉字生成。打开汉字生成软件
打开后进行如下设置:
输入要生成的汉字,生成字模
将生成的字模复制,粘贴至cfont16[]数组内:
步骤6:全部修改完毕后,编译烧录进ministm32开发板,查看效果
2、显示AHT20的温度和湿度
步骤1:将读取温度的实验代码添加到本次实验的工程中
步骤2:修改部分代码(main函数部分代码内容)
float P,T,ALT;
uint32_t CT_data[2];
int c1,t1;
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 LED_Init(); //LED端口初始化
OLED_Init(); //初始化OLED
OLED_Clear(0) ;
RCC_Configuration(); //设置系统时钟
GPIO_Configuration(); //IO口设
I2C_Bus_Init();
ret = ATH20_Init();
if(ret == 0)
while(1)
{ OLED_Clear(0);
OLED_ShowString(0,11,"631807030616",16);
delay_ms(2500);
printf("ATH20传感器初始化错误\n");
}
步骤3:编译烧录,查看效果
3、上下或左右的滑动显示长字符
步骤1:设置水平左右移
OLED_WR_Byte(0x2E,OLED_CMD); //关闭滚动
OLED_WR_Byte(0x26,OLED_CMD); //水平向左或者右滚动 26/27
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0x00,OLED_CMD); //起始页 0
OLED_WR_Byte(0x07,OLED_CMD); //滚动时间间隔
OLED_WR_Byte(0x07,OLED_CMD); //终止页 7
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0xFF,OLED_CMD); //虚拟字节
OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动
步骤2:设置垂直和水平滚动
OLED_WR_Byte(0x2e,OLED_CMD); //关闭滚动
OLED_WR_Byte(0x29,OLED_CMD); //水平垂直和水平滚动左右 29/2a
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0x00,OLED_CMD); //起始页 0
OLED_WR_Byte(0x07,OLED_CMD); //滚动时间间隔
OLED_WR_Byte(0x07,OLED_CMD); //终止页 1
OLED_WR_Byte(0x01,OLED_CMD); //垂直滚动偏移量
OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动
步骤3:设置滚动区域
OLED_WR_Byte(0x2e,OLED_CMD); //关闭滚动
OLED_WR_Byte(0x29,OLED_CMD); //水平垂直和水平滚动左右 29/2a
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0x00,OLED_CMD); //起始页 0
OLED_WR_Byte(0x07,OLED_CMD); //滚动时间间隔
OLED_WR_Byte(0x07,OLED_CMD); //终止页 1
OLED_WR_Byte(0x01,OLED_CMD); //垂直滚动偏移量
步骤4:设置滚动的开始
OLED_WR_Byte(0xA3,OLED_CMD); //开启滚动
OLED_WR_Byte(16,OLED_CMD); //开启滚动
OLED_WR_Byte(8,OLED_CMD); //开启滚动
OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动
步骤5:主函数
delay_init(); //???????
NVIC_Configuration(); //??NVIC????2:2??????,2??????
OLED_Init(); //???OLED
OLED_Clear(0); //??(??)
OLED_WR_Byte(0x2E,OLED_CMD); //????
OLED_WR_Byte(0x27,OLED_CMD); //????????? 26/27
OLED_WR_Byte(0x00,OLED_CMD); //????
OLED_WR_Byte(0x00,OLED_CMD); //??? 0
OLED_WR_Byte(0x07,OLED_CMD); //??????
OLED_WR_Byte(0x07,OLED_CMD); //??? 7
OLED_WR_Byte(0x00,OLED_CMD); //????
OLED_WR_Byte(0xFF,OLED_CMD); //????
OLED_ShowCHinese(6,0,24);
OLED_ShowCHinese(26,0,25);
OLED_ShowCHinese(46,0,21);
OLED_ShowCHinese(66,0,6);
OLED_ShowCHinese(86,0,7);
OLED_ShowCHinese(106,0,8);
OLED_ShowCHinese(6,3,22);
OLED_ShowCHinese(26,3,23);
OLED_ShowCHinese(46,3,21);
OLED_ShowString(0,6,"631807030433",16);
OLED_WR_Byte(0x2F,OLED_CMD);
步骤6:编译烧录,查看效果