找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4508|回复: 2
打印 上一主题 下一主题
收起左侧

ili9341 LCD软件处理图片数据,以少量图片(减少内存占用)实现动态背景和动态字体

[复制链接]
跳转到指定楼层
楼主
ID:209947 发表于 2018-7-15 10:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

本次工程基于stm32vet5,LCD是ili9341,在LCD的基础驱动上改编的代码。

工作中需要实现动态背景和动态字体。直接用截图来覆盖原有的图需要flash中保存截图,占用太大空间,所以需要尽可以的用软件来处理图片实现动态。我编写了实现透明图片,移动图片,嵌入图片,截图保存(flash中的)等函数来完成动态。这里带上视频和图片。

嵌入图片是去掉黑色部分,只显示其他颜色部分,即是把黑色当做了透明色。嵌入的图片最好是简单些的方便自己PS处理的图片。

视频:https://v.youku.com/v_show/id_XMzY0NzU3NjkzMg==.html

单片机源程序如下:
  1. /*
  2. * STM32F103VET6   
  3. * 内置flash      512K              缓存      64K
  4. * 已用flash 347.34K      已用缓存 34.89K
  5. */
  6. #include "led.h"
  7. #include "delay.h"
  8. #include <stdbool.h>
  9. #include <math.h>
  10. #include "sys.h"
  11. #include "stm32f10x.h"
  12. #include "Tim.h"
  13. #include "usart.h"
  14. #include "ili9341_lcd.h"
  15. #include "string.h"


  16. //图像
  17. extern const unsigned char Street[153600] ;
  18. extern const unsigned char Smoke[12][6264];
  19. extern const unsigned char Ear[2][1972];
  20. extern const unsigned char Bread[12][2310];
  21. extern const unsigned char Ping[12][3696];
  22. extern const unsigned char Fire[3][1156];
  23. extern const unsigned char NUM[10][560];
  24. extern const unsigned char Change9_8[9][560];
  25. extern const unsigned char Change8_7[9][560];

  26. extern const unsigned char BIG_CHAR[8][720];
  27. extern const unsigned char CubicM[720];
  28. extern const unsigned char FenHao[320];
  29. extern const unsigned char BaiFenHao[720];
  30. extern const unsigned char UG[720];
  31. extern const unsigned char SheShiDu[720];

  32. unsigned char save[1120];
  33. u8 data_wei = 0;

  34. u8 lu_wei = 0;
  35. u8 turnarround = 0;
  36. //硬盘
  37. #define countof(a)      (sizeof(a) / sizeof(*(a)))
  38. #define  BufferSize (countof(Tx_Buffer)-1)
  39. uint32_t count_i = 0;
  40. uint32_t   count_t;
  41. u8 count_k = 0;
  42. uint8_t Tx_Buffer[480] ;
  43. uint8_t Rx_Buffer[100];
  44. uint8_t Picture_Rx_Buffer[24000] ;//6分之一张图片大小
  45. //uint32_t Picture_F2D_Buffer[6000];//DMA从flash读取数据
  46. uint8_t Receive_Buffer; //串口接收图片数据的buff

  47. void LCD_Test(void)
  48. {
  49.         LCD_SetColors(WHITE,BLACK );
  50.         ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH);
  51.         Disd(0,0, 240, 320,Street);
  52. }

  53. int main(void)
  54. {
  55.         delay_init();
  56.         ILI9341_Init ();                                                //LCD屏幕初始化
  57.         ILI9341_GramScan ( 6 );                               //LCD背景色设置
  58.         LCD_LightDegree();
  59.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

  60.         USART_Config();
  61.         LCD_Test();                                                       //LCD初始化
  62.         
  63. while(1)        //浮动字体&动图&字体移动
  64. {
  65.         int cnt = 0,cnt2;
  66.         for(cnt = 11,cnt2 = 0;cnt >= 0;cnt2 ++,cnt --)
  67.         {
  68.                 Disd(58,61, 54, 58,Smoke[cnt2]);
  69.                 if(cnt2 == 5)Disd(49,127, 34, 29,Ear[1]);        
  70.                 else if(cnt2== 7)Disd(49,127, 34, 29,Ear[0]);
  71.                 else;//Ear
  72.                 Disd(86,157, 33, 35,Bread[cnt2]);
  73.                 Disd(152,121, 44, 42,Ping[cnt2]);
  74.                 if(cnt2 == 11)cnt2 = 0;
  75.                 //清理上次移动显示的残影
  76.                 ScreenShots( 30, 200, 18, 20,Street, 30, 200,240,320);
  77.                 ScreenShots( 48, 200, 18, 20,Street, 48, 200,240,320);
  78.                 ScreenShots( 68, 200, 18, 20,Street, 68, 200,240,320);
  79. //                ScreenShots( 30, 230, 18, 20,Street, 30, 230,240,320);
  80. //                ScreenShots( 48, 230, 18, 20,Street, 48, 230,240,320);
  81. //                ScreenShots( 68, 230, 18, 20,Street, 68, 230,240,320);
  82.                
  83.                 ScreenShotsSave(  18, 20,Street,30+10*cnt, 200,240,320,save);//截图保存
  84.                 ScreenShots( 40+10*cnt, 200, 18, 20,Street, 40+10*cnt, 200,240,320);
  85.                 FloatPictureStatic( 30+10*cnt,200, 18, 20,CHAR_T,cnt,save);
  86.                 ScreenShotsSave(  18, 20,Street,48+10*cnt, 200,240,320,save);//截图保存
  87.                 ScreenShots( 58+10*cnt, 200, 18, 20,Street, 58+10*cnt, 200,240,320);
  88.                 FloatPictureStatic( 48+10*cnt, 200, 18, 20,CHAR_E,cnt,save);
  89.                 ScreenShotsSave(  18, 20,Street,68+10*cnt, 200,240,320,save);//截图保存
  90.                 ScreenShots( 78+10*cnt, 200, 18, 20,Street, 78+10*cnt, 200,240,320);
  91.                 FloatPictureStatic( 68+10*cnt, 200, 18, 20,CHAR_M,cnt,save);
  92.                
  93.                
  94. //                ScreenShotsSave(  18, 20,Street,30+10*cnt, 230,240,320,save);//截图保存
  95. //                ScreenShots( 40+10*cnt, 230, 18, 20,Street, 40+10*cnt, 230,240,320);
  96. //                FloatPictureStatic( 30+10*cnt,230, 18, 20,CHAR_H,cnt,save);
  97. //                ScreenShotsSave(  18, 20,Street,48+10*cnt, 230,240,320,save);//截图保存
  98. //                ScreenShots( 58+10*cnt, 230, 18, 20,Street, 58+10*cnt, 230,240,320);
  99. //                FloatPictureStatic( 48+10*cnt, 230, 18, 20,CHAR_U,cnt,save);
  100. //                ScreenShotsSave(  18, 20,Street,68+10*cnt, 230,240,320,save);//截图保存
  101. //                ScreenShots( 78+10*cnt, 230, 18, 20,Street, 78+10*cnt, 230,240,320);
  102. //                FloatPictureStatic( 68+10*cnt, 230, 18, 20,CHAR_M,cnt,save);
  103.                 ScreenShotsSave(18, 20,Street,30, 230,240,320,save);//截图保存
  104.                 FloatPictureStatic( 30,230, 18, 20,CHAR_H,cnt,save);
  105.                 ScreenShotsSave(  18, 20,Street,48, 230,240,320,save);//截图保存
  106.                 FloatPictureStatic( 48, 230, 18, 20,CHAR_U,cnt,save);
  107.                 ScreenShotsSave(18, 20,Street,68, 230,240,320,save);//截图保存
  108.                 FloatPictureStatic( 68, 230, 18, 20,CHAR_M,cnt,save);
  109.                
  110.                 delay_ms(80);        
  111.         }

  112.         for(cnt = 11,cnt2 = 0;cnt >= 0;cnt2 ++,cnt --)
  113.         {
  114.                 Disd(58,61, 54, 58,Smoke[cnt2]);
  115.                 if(cnt2 == 5)Disd(49,127, 34, 29,Ear[1]);        
  116.                 else if(cnt2 == 7)Disd(49,127, 34, 29,Ear[0]);
  117.                 else;//Ear
  118.                 Disd(86,157, 33, 35,Bread[cnt2]);
  119.                 Disd(152,121, 44, 42,Ping[cnt2]);
  120.                 if(cnt2 == 11)cnt2 = 0;
  121.                
  122.                 ScreenShotsSave(  18, 20,Street,30, 200,240,320,save);//截图保存
  123.                 FloatPicture( 30,200, 18, 20,save,cnt);        
  124.                 ScreenShotsSave(  18, 20,Street,48, 200,240,320,save);//截图保存
  125.                 FloatPicture( 48, 200, 18, 20,save,cnt);
  126.                 ScreenShotsSave(  18, 20,Street,68, 200,240,320,save);//截图保存
  127.                 FloatPicture( 68, 200, 18, 20,save,cnt);
  128.                
  129.                 ScreenShotsSave( 18, 20,Street,30, 230,240,320,save);//截图保存
  130.                 FloatPicture( 30,230, 18, 20,save,cnt);
  131.                 ScreenShotsSave( 18, 20,Street,48, 230,240,320,save);//截图保存
  132.                 FloatPicture( 48, 230, 18, 20,save,cnt);
  133.                 ScreenShotsSave(  18, 20,Street,68, 230,240,320,save);//截图保存
  134.                 FloatPicture( 68, 230, 18, 20,save,cnt);
  135.                
  136.                 delay_ms(80);        
  137.         }
  138. }


  139. while(1)        //浮动字体&动图
  140. {
  141.         int cnt = 0;
  142.         for(cnt = 11;cnt >= 0;cnt --)
  143.         {
  144.                 Disd(58,61, 54, 58,Smoke[cnt]);
  145.                 if(cnt == 5)Disd(49,127, 34, 29,Ear[1]);        
  146.                 else if(cnt== 7)Disd(49,127, 34, 29,Ear[0]);
  147.                 else;//Ear
  148.                 Disd(86,157, 33, 35,Bread[cnt]);
  149.                 Disd(152,121, 44, 42,Ping[cnt]);
  150.                         
  151.                 ScreenShotsSave( 18, 20,Street,30, 200,240,320,save);//截图保存
  152.                 FloatPictureStatic( 30,200, 18, 20,CHAR_T,cnt,save);
  153.                 ScreenShotsSave(18, 20,Street,48, 200,240,320,save);//截图保存
  154.                 FloatPictureStatic( 48, 200, 18, 20,CHAR_E,cnt,save);
  155.                 ScreenShotsSave( 18, 20,Street,68, 200,240,320,save);//截图保存
  156.                 FloatPictureStatic( 68, 200, 18, 20,CHAR_M,cnt,save);
  157.                
  158.                 ScreenShotsSave(18, 20,Street,30, 230,240,320,save);//截图保存
  159.                 FloatPictureStatic( 30,230, 18, 20,CHAR_H,cnt,save);
  160.                 ScreenShotsSave(  18, 20,Street,48, 230,240,320,save);//截图保存
  161.                 FloatPictureStatic( 48, 230, 18, 20,CHAR_U,cnt,save);
  162.                 ScreenShotsSave(18, 20,Street,68, 230,240,320,save);//截图保存
  163.                 FloatPictureStatic( 68, 230, 18, 20,CHAR_M,cnt,save);
  164.                
  165.                 delay_ms(100);        
  166.         }
  167.         for(cnt = 11;cnt >= 0;cnt --)
  168.         {
  169.                 Disd(58,61, 54, 58,Smoke[cnt]);
  170.                 if(cnt == 5)Disd(49,127, 34, 29,Ear[1]);        
  171.                 else if(cnt == 7)Disd(49,127, 34, 29,Ear[0]);
  172.                 else;//Ear
  173.                 Disd(86,157, 33, 35,Bread[cnt]);
  174.                 Disd(152,121, 44, 42,Ping[cnt]);
  175.                
  176.                 ScreenShotsSave(  18, 20,Street,30, 200,240,320,save);//截图保存
  177.                 FloatPicture( 30,200, 18, 20,save,cnt);        
  178.                 ScreenShotsSave( 18, 20,Street,48, 200,240,320,save);//截图保存
  179.                 FloatPicture( 48, 200, 18, 20,save,cnt);
  180.                 ScreenShotsSave( 218, 20,Street,68, 200,240,320,save);//截图保存
  181.                 FloatPicture( 68, 200, 18, 20,save,cnt);
  182.                
  183.                 ScreenShotsSave(  18, 20,Street,30, 230,240,320,save);//截图保存
  184.                 FloatPicture( 30,230, 18, 20,save,cnt);
  185.                 ScreenShotsSave(  18, 20,Street,48, 230,240,320,save);//截图保存
  186.                 FloatPicture( 48, 230, 18, 20,save,cnt);
  187.                 ScreenShotsSave(  18, 20,Street,68, 230,240,320,save);//截图保存
  188.                 FloatPicture( 68, 230, 18, 20,save,cnt);
  189.                
  190.                 delay_ms(100);        
  191.         }
  192. }




  193. while(1)//动图
  194. {
  195.         u8 j = 0;
  196.         for(count_i = 0;count_i < 12;count_i ++)
  197.         {
  198.                 delay_ms(100);        
  199.                 Disd(58,61, 54, 58,Smoke[count_i]);
  200.                 if(count_i == 5)Disd(49,127, 34, 29,Ear[1]);        
  201.                 else if(count_i == 7)Disd(49,127, 34, 29,Ear[0]);
  202.                 else;//Ear
  203.                 Disd(86,157, 33, 35,Bread[count_i]);
  204.                 Disd(152,121, 44, 42,Ping[count_i]);
  205. //                if(count_i == 1 || count_i == 8 )Disd(70,208, 17, 34,Fire[1]);        
  206. //                else if(count_i == 3  || count_i == 5  || count_i == 10)Disd(70,208, 17, 34,Fire[2]);               
  207. //                else Disd(70,208, 17, 34,Fire[0]);//Fire
  208.         }
  209. }
  210. }//main函数
复制代码

所有资料51hei提供下载:
自己的函数 LCD嵌入透明截图合成单图等函数.rar (2.91 MB, 下载次数: 60)





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:454393 发表于 2020-4-13 14:18 | 只看该作者
视频为啥是足球
回复

使用道具 举报

板凳
ID:429780 发表于 2021-6-1 11:25 | 只看该作者
可能这兄弟半夜写完程序后,看世界杯,然后分享时把世界杯的链接当成设计视频发上去了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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