目录
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 屏幕显示进度条