嵌入式实验(三):基于STM32的0.96OLED基本显示

0 实验要求

理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能:

  1. 显示自己的学号和姓名;

  2. 显示AHT20的温度和湿度;

  3. 上下或左右的滑动显示长字符,比如“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共同完成一个功能。

  • 4
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值