使用LCD12864播放BadApple

近日购得一块1.8寸带背景的屏幕,接线容易,资料齐全,驱动器也是常见的ST7565,最主要的是价格只要一块多,遂买回来十块细细研究。无奈自己焊工不了得,那么细的引脚还是没法直接飞线。一不做二不休,画了屏幕几倍的价钱打样了屏幕的转接板(转接板文件后面提供),回来把屏幕焊上,一次成功。

转接板正面+屏幕
转接板背面
点亮效果

QFG12864底板PCB文件下载

这么好的一块屏幕,如果只拿来显示个字就太浪费了。俗话说的好,有屏幕的地方就有BadApple。那我们也来用这块一块钱的屏幕播放BadApple。
首先是硬件部分。显示部分不用多说,就是我们今天的主角——QFG12864。单片机也是我们的老朋友——STM32。使用单片机播放视频,首先视频需要有一个存储的地方,这里我们没有选用大家常用的SPI Flash,也没有使用某些同学使用的串口实时发送这种方式。由于我们使用的STM32速度足够快,并且有硬件的SPI接口,因此我们直接使用SD卡作为存储介质,使用fatfs文件系统,从SD卡里面直接读取数据。这样还可以省去一个编程器,直接用电脑往SD卡里面复制数据即可。
硬件没啥好说的,就是一个单片机,一个SD卡和一个屏幕。SD卡使用的是硬件SPI1,屏幕是软件IO模拟的。感兴趣的,程序里面都有定义,保证一看就会。
说到主程序,想想也简单。移植好了屏幕和SD卡的驱动,再调试好fatfs,主程序无非就是初始化以后读取一帧的数据,送显示这么无限循环而已。这里对程序不做过多说明,仅贴出来一部分核心代码,感兴趣的直接下载附件即可。需要注意的是,我的驱动为了直接兼容之前的OLED驱动,用的函数名与OLED驱动中的相同,所以代码里出现OLED是正常现象。

void PlayBadApple(void)
{
  unsigned int i,j;
  FIL file;
  OLED_clear();
  
  f_open(&file,"BadApple.bin",FA_READ);
  
  TIM3_Init(1000000 / FrameRate,71);//1us * 33333= 33.3ms
  
  for(i = 0;i < FrameCount;i ++)
  {
    f_lseek(&file,FrameSize*i);
    f_read(&file,DisBuf,FrameSize,&j);
    OLED_bmp((128-FrameXSize)/2,0,FrameXSize,FrameYSize,DisBuf);
    
    while(!Next_Frame);
    Next_Frame = 0;
  }
  OLED_clear();
  f_close(&file);
}
int main(void)
{
  delay_init();
  SetRemap();
  
  OLED_Init();
  OLED_8_16(0,0,"Hello World!");
  
  SD_HW_Config();
  while(SD_Init() != 0);
  
  f_mount(&fatfs,"",0);//挂载文件系统
  while(1)
  {
    PlayBadApple();
  }
}

Keil工程下载

下面我们重点说一下怎么获取这个视频文件。视频文件是一帧一帧的,我们只需要将这一帧一帧截取出来,转换成单片机可以读取的01二进制格式,存到单片机的存储器即可。首先,我们得到BadApple的视频文件,这个就不提供了,网上一搜一大堆。

视频信息

我使用的是PotPlayer,这款播放器的功能非常强大,其中就有我们需要的视频逐帧截图功能。我们在视频->图像截取->连续截图中,设置截取图像的格式为BMP(这样后面取模软件的速度会快不少,毕竟六千多个文件),分辨率为86*64(固定纵向分辨率为64,横向分辨率根据视频分辨率可以计算为86),截图设置为按帧间距1帧截图(这样一帧就是1张图),采集数量设为9999,然后将视频进度条拖到最开始,点击开始截图后播放完一遍视频即可获得一堆图片文件。注意这个过程对电脑要求还挺高的,配置不好的会卡,什么都别做就等他放完就好了。

连续截图

然后我们就得到了这个文件夹。

截图文件夹

接下来我们就用到了另一个工具——Image2LCD这款取模工具。最新版的这个工具提供了一个批量取模的功能,我们只需要设置好,打开第一张图片,它就会把这个文件夹下面的所有文件都自动批处理,非常方便。这里的取模方式和OLED一样,就不赘述了。

image2LCD

点击批量转换,即可生成一堆bin文件。

转换完成后的文件

使用随便一个二进制编辑器,就可以将它们合成一个bin文件。这个就是我们需要播放的文件了,我们只需要在程序里声明一些必要的数值即可,其中包括视频的宽、高、帧率、总帧数等。

#define FrameXSize 86
#define FrameYSize 64/8
#define FrameSize FrameXSize*FrameYSize
#define FrameCount 6567
#define FrameRate 30

最终播放效果如视频所展示。

 

 

下面提供一个我已经写好的bin文件,这个文件是与程序中的参数配套的,大家可以直接拿来用。

BadApple.bin

0

留下评论