0 实验要求
理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能:
显示自己的学号和姓名;
显示AHT20的温度和湿度;
上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”或者歌词、诗词。(最好使用硬件刷屏模式)
1 0.96OLED简介
(1)OLED
- OLED即有机发光二级管(Organic Light-Emitting Diode,OLED)。OLED显示技术具有自发光、广视角、几乎无穷高的对比度、较低耗电、极高反应速度、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优点,被认为是下一代的平面显示器新兴应用技术。
- OLED 显示和传统的LCD显示不同,其可以自发光,所以不需要背光灯,这使得OLED 显示屏相对于LCD显示屏尺寸更薄,同时显示效果更优。
(2)接线说明
2 显示学号和姓名
(1)下载例程
本实验使用的0.96OLED,提供了详细的例程,很适合初学者学习。Arduino、C51、STM32等常见平台的例程都很完善。链接
- 下载解压后如下:
1是例程文件,7是生成汉字代码需要的工具。
(2)学习例程 - 打开keil工程文件
如图,在main.c函数中,已经有一长串测试代码,可以显示各种文字、符号、图形。
在这里,我们需要用到的只有数字显示和中文显示,所以主要就看TEST_Number_Character();和TEST_Chinese();两个函数;
他们都在test.c这个函数中。 - TEST_Number_Character();
void TEST_Number_Character(void)
{
GUI_Fill(0,0,WIDTH-1,HEIGHT/2-1,0);
GUI_ShowString(0,0,"6x8:!\"#$%&'()*+,-./:;<=>?@[]\\^_`~{}|",8,1);
GUI_ShowNum(30,16,1234567890,10,8,1);
delay_ms(1000);
OLED_Clear(0);
GUI_ShowString(0,0,"8x16:!\"#$%&'()*+,-./:;<=>?@[]\\^_`~{}|",16,1);
GUI_ShowNum(40,32,1234567890,10,16,1);
delay_ms(1500);
OLED_Clear(0);
}
- TEST_Chinese();
void TEST_Chinese(void)
{
GUI_ShowString(45,0,"16x16",8,1);
GUI_ShowCHinese(16,20,16,"È«¶¯µç×Ó¼¼Êõ",1);
delay_ms(1000);
OLED_Clear(0);
GUI_ShowString(45,0,"24x24",8,1);
GUI_ShowCHinese(16,20,24,"È«¶¯µç×Ó",1);
delay_ms(1000);
OLED_Clear(0);
GUI_ShowString(45,0,"32x32",8,1);
GUI_ShowCHinese(0,20,32,"È«¶¯µç×Ó",1);
delay_ms(1000);
OLED_Clear(0);
}
由以上两个代码,可以看出,他们都是调用GUI的函数来实现功能的。
- 右键点击函数名,查看函数是怎么实现的
最后可以发现,函数是通过储存汉字对应的数组,然后判断OLED的哪些点亮,哪些点不亮。所以我们只需要在oledfont.h中,按照格式添加我们需要的字,并修改GUI显示函数,即可实现我们的第一个目标。
(3)修改例程
- 修改main.c
int main(void)
{
delay_init();
NVIC_Configuration();
OLED_Init();
OLED_Clear(0);
while(1)
{
TEST_MainPage();
OLED_Clear(0);
}
}
由于需要实现的功能很少,就只留下一个显示函数;
- 修改test.c
void TEST_MainPage(void)
{
GUI_ShowCHinese(28,20,16,"张同学",1);
GUI_ShowString(4,48,"631807030433",16,1);
delay_ms(1500);
delay_ms(1500);
}
- 在oledfont.h中,添加汉字
打开汉字生成软件
将字模按格式复制到keil中
(4)连接硬件,将程序烧录进程序,实验完成。
3 温湿度显示
(1)模拟IIC实现温湿度显示
前面的实验中,已经完成率基于模拟IIC的温湿度显示(stm32核心版)。
(2)在温湿度检测代码的基础上添加OLED的代码
(也可以在OLED的基础上添加温湿度代码,没有影响)
以上文件都需要添加到温湿度工程中(包括.h文件),不过需要注意,需要在用到这些函数的文件前进行声明。
- 添加需要的字模
"温",0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,
0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00,/*"温",0*/
"湿",0x00,0x00,0x27,0xF8,0x14,0x08,0x14,0x08,0x87,0xF8,0x44,0x08,0x44,0x08,0x17,0xF8,
0x11,0x20,0x21,0x20,0xE9,0x24,0x25,0x28,0x23,0x30,0x21,0x20,0x2F,0xFE,0x00,0x00,/*"湿",0*/
"度",0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x22,0x20,
0x23,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x10,0x42,0x20,0x41,0xC0,0x86,0x30,0x38,0x0E,/*"度",0*/
(3)硬件连接
硬件使用的是stm32核心板,OLED scl连 pb13,sda 连pb14
(4)温湿度显示
下图是将温度传感器靠近热水时的变化:
4 滑动显示长字符
(1)OLED屏的滚屏命令
(以下内容转载至链接)
- 设置水平左右移步骤:
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); //开启滚动
这里需要注意的是 设置前要先关闭 滚动 还有的是在写入终止页后需要写入 两个虚拟字节
- 设置垂直和水平滚动的(没有可用连续垂直滚动)步骤:
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); //开启滚动
注意:垂直滚动偏移量=0时,就只有水平左右移了。
通过设置起始页 终止页 被设置的区域就垂直和水平滚动,,其余的区域就只有垂直滚动
- 设置滚动区域:
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(0xA3,OLED_CMD); //开启滚动
OLED_WR_Byte(16,OLED_CMD); //开启滚动
OLED_WR_Byte(8,OLED_CMD); //开启滚动
OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动
(2)keil程序·
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);
在oledfont.h文件里添加我们需要的汉字
(3)烧录程序
(4)结果
5 总结
这次实验主要学会了OLED的一些操作,以及多个元件之间通过stm32共同完成一个功能。