STM32F4+OLED 显示汉字、图片和动态图
目录
- STM32F4+OLED 显示汉字、图片和动态图
- 一、导入.h和.c文件
- 导入 .h 文件
- 导入 .c 文件
- 二、显示数字
- 显示数字的函数
- 显示效果
- 三、显示汉字
- 汉字取模
- 显示汉字的函数
- 显示效果
- 四、显示图片
- 图片取模
- 显示图片的函数
- 显示效果
- 五、显示进度条
- 显示进度条函数
- 显示效果
- 附录
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等)
本项目源码