感谢:

STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili

STM32+OLED播放鸡你太美_stm32 gif-CSDN博客

本项目已开源至

https://github.com/WeiLai0415/iKun_on_OLED

OLED基本显示

函数来源

Hardware中添加OLED.hOLED.cOLED_Font.hOLED.h用于存放OLED显示函数的声明,OLED.c用于存放OLED显示函数的声明,OLED.c用于存放OLED显示函数的定义,OLED_Font.h用于存放OLED显示用到的字库(数组)。

本项目中的这三个文件都是在江科协的基础上改动的,再次感谢!

在这里给出江科协源代码的夸克网盘链接,.zip文件解压密码为32:

我用夸克网盘分享了「程序源码.zip」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。 链接:https://pan.quark.cn/s/a12e6de8f538

由于OLED_Font.h的内容太多,这里就不放出其完整内容了,有需要请移步

https://github.com/WeiLai0415/iKun_on_OLED/blob/master/Hardware/OLED_Font.h

main.c主要包含显示中文“坤”和英文“iKun”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"

uint8_t KeyNum;

int main(void)
{
OLED_Init();
OLED_Clear();

OLED_ShowCHNChar(3, 1, 0); // 0 for Chinese Character KUN
Delay_ms(1000);

uint8_t i;
while (1)
{
OLED_Clear();
OLED_ShowString(3, 1, "iKUN");
}
}

对中文取模

由于中文显示较为复杂,这里使用PCtoLCD工具取模,

注意,我们要在“选项”卡片中,使用C51格式,并把每行显示的数据-点阵调得越大越好。

字模2.png
字模1.png

使用字模

“生成字模”后,复制到OLED_Font.h的数组中:

1
2
3
4
5
6
7
const uint8_t OLED_F8x16_CHNChar[][32]=
{
{0x20,0x20,0x20,0xFF,0x20,0x20,0x00,0xF8,
0x88,0x88,0xFF,0x88,0x88,0xF8,0x00,0x00,
0x10,0x30,0x10,0x0F,0x08,0x08,0x00,0x1F,
0x08,0x08,0xFF,0x08,0x08,0x1F,0x00,0x00},/*"坤",0*/
};

来到OLED.c中,仿照江科协给出的OLED_ShowChar()函数,写函数OLED_ShowCHNChar()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void OLED_ShowCHNChar(uint8_t Line, uint8_t Column, uint8_t index)
{
uint8_t i;
OLED_SetCursor((Line - 1) * 2, (Column - 1) * 8); //设置光标位置在上半部分
for (i = 0; i < 16; i++)
{
OLED_WriteData(OLED_F8x16_CHNChar[index][i]); //显示上半部分内容
}
OLED_SetCursor((Line - 1) * 2 + 1, (Column - 1) * 8); //设置光标位置在下半部分
for (i = 0; i < 16; i++)
{
OLED_WriteData(OLED_F8x16_CHNChar[index][i + 16]); //显示下半部分内容
}
}

函数中,由于汉字的大小为16 * 16 (pits),我们需要每输出16个像素就换一次行。

还有,别忘了在OLED.h中声明新建的函数OLED_ShowCHNChar()

播放“视频”

准备64 * 128的.gif文件

如果没有大小合适的,推荐使用GIF Movie Gear改变原文件大小。

对GIF二值化

推荐线上工具阈值图像(用黑色或白色像素替换每个像素)- 免费在线工具 (imageonline.co)

效果如下:

二值化.png

分离帧

使用Gifsplitter将动图转化为图片。

分离帧.png

位图取模

步骤与汉字取模相同(改为位图模式),不再赘述。

放入OLED_Font.h中,步骤相同,这次我们将数组命名为OLED_F8x16_Kun[][128 * 64]

显示图片

来到OLED.c中,写函数OLED_ShowKun(),我们将唯一的参数index定义为OLED_F8x16_Kun[][128 * 32]中的OLED_F8x16_Kun[index]数组,即第index帧。

由于数组较长,我们改变策略,采用循环,用于0.96吋OLED屏幕分辨率为64 * 128。写入每128个字符即换一行。

1
2
3
4
5
6
7
8
9
10
11
12
13
void OLED_ShowKun(uint8_t index)
{
uint8_t i;
uint8_t j;
for (i = 0; i < 64; i++)
{
OLED_SetCursor(i, 0);
for (j = 0; j < 128; j++)
{
OLED_WriteData(OLED_F8x16_Kun[index][j + 128 * i]);
}
}
}

同样,别忘了在OLED.h中声明新建的函数OLED_ShowKun()

连续显示图片

接着,我们只需要把15帧连续播放就可以模仿视频的效果了。

main.c函数中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
// #include "CHNChar.h"


uint8_t KeyNum;

int main(void)
{
OLED_Init();
OLED_Clear();

OLED_ShowCHNChar(3, 1, 0); // 0 for Chinese Character KUN
Delay_ms(1000);

uint8_t i;
for (i = 0; i < 15; i++)
{
OLED_ShowKun(i);
Delay_ms(41);
}
Delay_ms(600);
while (1)
{
OLED_Clear();
OLED_ShowString(3, 1, "iKUN");
}
}

效果图.bmp

终于,哥哥动起来了!

一些有待改进的地方

  • 刷新时图片会频闪,拟优化改进程序,使程序只刷新改变值的像素点。

  • 手动取模太过麻烦,听说Python可以实现自动取模,拟编写Python程序实现自动取模并写入OLED_Font.h