基于SPI/IIC接口的OLED数据显示

学习任务

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

  1. 显示自己的学号和姓名;
  2. 显示AHT20的温度和湿度;
  3. 上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”或者歌词、诗词。(最好使用硬件刷屏模式)

学习内容

所需文件

1. 获取字幕编码

打开PCtolCD2002.具体路径如下:
在这里插入图片描述
选择选项将格式改为c51格式,模式改为字符模式。
在这里插入图片描述
输入名字,点击生成字模得到字幕编码。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201227145543518.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhd2VpOTM5,size_16,color_FFFFFF,t_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的温度和湿度:在这里插入图片描述
上下或左右的滑动显示长字符:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值