STM32F4+OLED 显示汉字、图片和动态图

STM32F4+OLED 显示汉字、图片和动态图

OLED 是一种新型的显示技术,它具有低功耗、高对比度、自发光、可弯曲等优点。OLED 可以用于各种嵌入式系统,如 STM32F4 单片机。在本文中,我将分享我如何使用 STM32F4 单片机的 OLED 外设进行显示汉字、图片和动态图的项目,以及我在实现过程中遇到的一些问题和解决方法。
开发板:STM32F407ZGT6(正点原子探索者)
OLED:正点原子0.96’ OLED 显示器模块
软件:Keil MDK5

一、导入.h和.c文件

显示汉字和图片,需要先用取模软件得到二维数组,二维数组需要以 .h 文件形式导入 Keil 项目。还有其他地方能用到导入 .h 和 .c 文件。

下面以导入 BMP 文件(图片的二维数组)为例

导入 .h 文件

在这里插入图片描述

导入 .c 文件

在这里插入图片描述

二、显示数字

显示数字的函数

x, y : 起点坐标
len : 数字的位数
size : 字体太小
num : 数值 (0~4294967295)

void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size)
{         	
	u8 t,temp;
	u8 enshow=0;						   
	for(t=0;t<len;t++)
	{
		temp=(num/mypow(10,len-t-1))%10;
		if(enshow==0&&t<(len-1))
		{
			if(temp==0)
			{
				OLED_ShowChar(x+(size/2)*t,y,' ',size,1);
				continue;
			}else enshow=1; 
		 	 
		}
	 	OLED_ShowChar(x+(size/2)*t,y,temp+'0',size,1); 
	}
} 

以显示数字 13 为例

		OLED_ShowNum(48,24,13,3,24);	
		OLED_Refresh_Gram();
		delay_ms(500);		

显示效果

在这里插入图片描述

三、显示汉字

汉字取模

取模软件用的是 PCtoLCD 2002 完美版。设置如下:
在这里插入图片描述
取出后的二维数组,复制到 oledfont.h 头文件(需要自己创建和导入)中
在这里插入图片描述

显示汉字的函数

正点原子开发板没有显示汉字的函数,我从网上找到相关函数修改之后,复制到 oled.c 文件中,就可以在主程序中直接调用。

x 起始列 一个字体占 16 列
y 起始页 一个字体占两页
no 字体的序号
Ch[][n] 中文数组

void OLED_ShowCHinese(unsigned char x,unsigned char y,unsigned char no,unsigned char Chn[][16])
{      			    
	unsigned char t,adder=0;

	OLED_Set_Pos(x,y+1);	
    for(t=0;t<16;t++)
		{
			OLED_WR_Byte(Chn[2*no][t],1);
			adder+=1;
     	}	
		OLED_Set_Pos(x,y); 
    for(t=0;t<16;t++)
		{	
			OLED_WR_Byte(Chn[2*no+1][t],1);
			adder+=1;
        }					
}

以“重庆大学”四个字为例

	OLED_ShowCHinese(32,4,0,School);
	OLED_ShowCHinese(48,4,1,School);
	OLED_ShowCHinese(64,4,2,School);
	OLED_ShowCHinese(80,4,3,School);
	delay_ms(2000);		

显示效果

四、显示图片

图片取模

取模方式与显示中文一样,但是要转换成数组形式,就要变成单色(黑与白),而且大小应该在 128*64 以内,使用的软件是 Img2Lcd 。设置如下:
在这里插入图片描述
取出后的二维数组,复制到 bmp.c 文件(需要自己创建和导入)中

显示图片的函数

正点原子开发板没有显示图片的函数,我也是从网上找到相关函数修改之后,复制到 oled.c 文件中。

x0: 起始列地址
y0: 起始页地址
x1: 终止列地址
y1: 终止页地址
BMP[]: 存放图片代码的数组

void OLED_DrawBMP(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char BMP[])
{ 	
 	unsigned int j=0; 
 	unsigned char x,y;  
 	
 	if(y1%8==0) y=y1/8;   
 	 else y=y1/8+1;

		for(y=y0;y<y1;y++) 
		{
			OLED_Set_Pos(x0,y); 
   			for(x=x0;x<x1;x++)
	    		{
	    			OLED_WR_Byte(BMP[j++],OLED_DATA);	 	
	    		}
		}
} 

以重庆大学校徽为例

	OLED_DrawBMP(40,0,96,7,logo);
	delay_ms(1000);

显示效果

五、显示进度条

结合C语言编程实现显示进度条

显示进度条函数

void drawProgressBar(int t, int n)
{
	OLED_ShowString(0,0,"Progress:",16);
	int i =0;
	float f = 12.5 * t;
	char a[10];
	sprintf(a, "%.1f%%", f);
	OLED_ShowString(0,24,"[",12);
	for (; i < n; i++)
	{
		if (i < t)
		{
			OLED_ShowString(12 + i * 12,24,"*",12);	
		}
	}
	
	OLED_ShowString(112,24,"]",12);
	OLED_ShowString(88,48,a,12);
};
  int i = 0;
  while (i <= 8) 
  {
		drawProgressBar(i, 8);
		OLED_Refresh_Gram();
		delay_ms(500);
		i++;
  };

显示效果

OLED 屏幕显示进度条

附录

参考项目:用STM32玩OLED(显示文字、图片、动图gif等)
本项目源码

  • 5
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值