搜索
bottom↓
回复: 4

如何使用LCD实现鸿蒙开机页面—教学篇

[复制链接]

出0入234汤圆

发表于 2022-5-25 17:49:57 | 显示全部楼层 |阅读模式
以下文章来源于:公众号:开源电子网,读取更多技术文章,请扫码关注
讨论发帖图.png


     前言
       在前一篇推文(LCD实现鸿蒙开机页面-材料准备篇)已经说明了bin文件的由来,相信大家也掌握这个方法。
       本推文着重讲解如何实现读取bin文件的数据并在LCD上显示。LCD进行一张一张图片的显示,最终就像视频播放一样。这里我们将会以网上很火的鸿蒙开机视频为源文件,在正点原子的潘多拉开发板LCD上进行播放。
(关注公众号回复“鸿蒙”免费获取工程文件)




1.jpg


       正点原子潘多拉开发板是板载的LCD分辨率是240*240的,所以我们取模图片的尺寸也是240*240。一张RGB565的图片就需要占用115200字节(112.5KB)的缓存,而芯片自带的SRAM只有128KB,无法在MDK上编译通过的。鸿蒙开机播放视频有比较明显的特点,就是背景黑色,变化的地方基本上是图片的中间部分(中间80行),利用这个特点,我们只需要将每张图片的中间80行进行显示即可。


       接下来跟着我的脚步,按步骤实现鸿蒙开机视频播放。


     01

       第一步:将harmonyos.bin拷贝进SD卡VIDEO目录下,如下图所示:

2.png



(注意:这里我们需要记住存放位置,后面工程需要通过路径找到改文件)





     02

       第二步:打开潘多拉开发板FATFS例程,以该工程实现效果,直接在main.c中编写如下代码。

  1. <font size="2">/* 鸿蒙开机界面设置宏 */
  2. /* 一张RGB565图片占用的缓存大小 */
  3. #define PIC_SIZE 115200
  4. /* LCD显示的起始X坐标 */
  5. #define DISPLAY_START_X 0
  6. /* LCD显示的起始Y坐标 */
  7. #define DISPLAY_START_Y 80
  8. /* LCD宽度分辨率 */
  9. #define LCD_WIDTH   240
  10. /* LCD高度分辨率 */
  11. #define LCD_HEIGHT  80
  12. int sd_play_part_video(const char *path)
  13. {
  14.     FIL fd;         /* FatFs文件系统对象 */
  15.     FRESULT fd_ret;  /* FatFs函数返回值,管理出现的错误 */
  16.     UINT fd_num;    /* 文件成功读写数量 */
  17.     int offset;     /* 文件位置偏移 */
  18.     int file_size;   /* 文件大小 */
  19.     u8 *pic_buf;     /* bin文件的首地址 */
  20.    
  21.     /* 由于内存不够大,所以可以通过观察视频范围 */
  22.     pic_buf = mymalloc(SRAM1, LCD_WIDTH * LCD_HEIGHT * 2);   /* 只有3/1区域会变化*/
  23.    
  24.     /* 1.打开传进来的Fatfs文件路径: path */
  25.     fd_ret = f_open(&fd, path, FA_READ);
  26.     if(FR_OK != fd_ret)
  27.         return -1;
  28.     /* 2.计算这个文件的大小 */
  29.     file_size = f_size(&fd);
  30.    
  31.     /* 3.初始化偏移变量为0 */
  32.     offset = 0;
  33.    
  34.     /* 4.计算bin文件里一共包含多少张图片,然后不断的给LCD进行显示 */
  35.     for(int i = 0 ; i < file_size / PIC_SIZE ; i++)
  36.     {
  37.         /* 5.将偏移往后加,移到变化区域 */
  38.         offset += LCD_WIDTH * LCD_HEIGHT * 2;
  39.         fd_ret = f_lseek(&fd, offset);
  40.    
  41.         /* 6.读取一张图片,一张图片的大小是PIC_SIZE,将读取出来的图片数据的首地址赋值给pic_buf */
  42.         fd_ret = f_read(&fd, pic_buf, LCD_WIDTH * LCD_HEIGHT * 2, &fd_num);
  43.         if(FR_OK != fd_ret)
  44.             return -2;
  45.         /* 6.将整个数组赋值给显示接口,显示图片 */
  46.         LCD_Show_Image(DISPLAY_START_X, DISPLAY_START_Y, LCD_WIDTH, LCD_HEIGHT, (uint8_t *)pic_buf);
  47.       
  48.         /* 7.将偏移往后加,就到了下一张图片 */
  49.         offset += (PIC_SIZE - LCD_WIDTH * LCD_HEIGHT * 2);
  50.         fd_ret = f_lseek(&fd, offset);
  51.       
  52.         if(FR_OK != fd_ret)
  53.             return -3;
  54.     }
  55.     /* 8.关闭文件描述符 */
  56.     fd_ret = f_close(&fd);
  57.     if(FR_OK != fd_ret)
  58.         return -4;
  59.       
  60.     myfree(SRAM1, pic_buf); /* 释放内存 */
  61.    
  62.     return 0 ;
  63. }</font>
复制代码
       这个代码思路借鉴嵌入式应用研究院公众号博主杨工的。

       该函数里面的实现逻辑跟前面坏苹果推文里面是很相似的,就是“指针偏移?数据读取?指针偏移?数据读取?…”直到数据读取完成。通过f_size函数去获取文件大小,然后与一张图片的大小(240*240*2)去运算得到这个bin文件中有多少张图片,也就是要刷新多少次。前面也提到,我们只刷新一部分即中间80行,所以需要先计算偏移然后通过f_lseek函数进行指针偏移,再通过f_read函数读取80行数据进行LCD显示。显示完成之后,还得进行偏移,把指针偏移到下一张图片。


       注意:使用了mymalloc申请了内存,用完之后要myfree释放。同时操作完文件后,还要f_close继续关闭。

      上面函数用到的FatFs文件系统的API函数,这里我们也列出它们的一些说明:

f_open函数

      功能:用来打开/创建一个文件,

      原型:FRESULT f_open(FIL* fp, const TCHAR* path, BYTE mode)

      参数:fp:指向空白文件对象结构的指针

                path:指向以null结尾的字符串的指针,该字符串指定要打开或者创建的文件名

                mode:指定文件的访问类型和打开方法的模式标志

f_close函数


      功能:用来关闭打开的文件

      原型:FRESULT f_close(FIL* fp)

      参数:fp:指向要关闭的打开的文件对象结构的指针

f_read函数

      功能:从文件中读取数据

      原型:FRESULT f_read(FIL* fp, void* buff, UINT btr, UINT *br)

      参数:fp:指向空白文件对象结构的指针

      buff:指向缓冲区以存储读取数据的指针

      btr:在UINT类型范围内要读取的字节数

      br:指向读取字节数的指针

f_lseek函数

      功能:对文件的读写位置进行设置

      原型:FRESULT f_lseek(FIL* fp, FSIZE_t ofs)

      参数:fp:指向打开的文件对象的指针

      oft:距离文件顶部的字节偏移量,用于设置读/写指针

      其他的API函数可以通过以下网址进行查阅:http://elm-chan.org/fsw/ff/00index_e.html

      在while(1)循环里直接调用:

  1. <font size="2">while (1)
  2. {
  3. sd_play_part_video("0:/VIDEO/harmonyos.bin");
  4. }</font>
复制代码

      03

        第三步,编译下载。

        当然你还可以使用其他开发板进行视频播放,例如我们的战舰版,由于有外扩的1M大小的SRAM,所以可以直接一张一张图片读取刷新,效果如下:

        掌握了这种方法,就可以播放喜欢的视频啦!


         注:关注公众号开源电子网即可观看视频演示及项目工程

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2022-5-26 08:11:22 来自手机 | 显示全部楼层
可以安装apk吗

出0入4汤圆

发表于 2022-5-26 21:16:18 | 显示全部楼层
Eworm001 发表于 2022-5-26 08:11
可以安装apk吗
(引用自2楼)

只是显示开机LOGO,不是移植了鸿蒙。。。

出0入0汤圆

发表于 2022-5-27 12:32:30 | 显示全部楼层
suebillt 发表于 2022-5-26 21:16
只是显示开机LOGO,不是移植了鸿蒙。。。
(引用自3楼)

哦,可以依葫芦葫芦画瓢搞个“如何使用LCD实现 Window100 开机页面—教学篇”

出0入59汤圆

发表于 2022-5-27 13:00:46 | 显示全部楼层
万物互联   
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 16:09

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表