由于需要用到液晶屏(320*240)显示图片,而且图片的数量比较多(好几百张),并且图片要求保存到16M的SPI FLASH里面,显然如果不处理 16M的FLASH明显是放不下去。后来同事说可以用压缩算法RLE,并且用C#给我做了个小的软件,压缩图片得到RLE压缩后的数据。

点击打开链接  ---------- 详细的RLE算法可以参考次连接http://blog.csdn.net/orbit/article/details/7062218

这个算法的缺点是  如果图片颜色复杂就不好,所以颜色尽量单调些。

1、RLE算法小工具的使用

2、我使用的RLE和上面连接的区别(改进)

3、单片机里面实现的方法

1、RLE算法小工具的使用点击打开链接

这里是小工具的下载地址   http://download.csdn.net/detail/chen244798611/9696253

使用:使用也非常简单 下载下来 RLETest.exe,点击打开 --》界面就一个按钮 “压缩”---》点击选择图片 自动压缩

提示完成可以看见生成

第一个里面有压缩前和压缩后的文件大小对比

最后一个.c文件压缩后得到一个数据,可以保存到spi flash里面

2、我使用的RLE和上面连接的区别(改进)

由于采用的液晶屏是16位的数据,那么比较可定应该是按照2字节 一个数据的比较,不能采用上面那种1个字节的比较。所以这里做了改进,其他都和上面那篇文章介绍一样。并且采用的是上面文章介绍的最后一个改进算法,如下

详细介绍 还是去看看那个文章。

225 int Rle_Decode_O(unsigned char *inbuf, int inSize, unsigned char *outbuf, intonuBufSize)

226 {

227     unsigned char *src = inbuf;

228     int i;

229     int decSize = 0;

230     int count = 0;

231

232     while(src < (inbuf + inSize))

233     {

234         unsigned char sign = *src++;

235         int count = sign & 0x3F;

236         if((decSize + count) > onuBufSize) /*输出缓冲区空间不够了*/

237         {

238             return -1;

239         }

240         if((sign & 0x80) == 0x80) /*连续重复数据标志*/

241         {

242             for(i = 0; i < count; i++)

243             {

244                 outbuf[decSize++] = *src;

245             }

246             src++;

247         }

248         else

249         {

250             for(i = 0; i < count; i++)

251             {

252                 outbuf[decSize++] = *src++;

253             }

254         }

255     }

256

257     return decSize;

258 }

3、单片机里面实现的方法

下面是在单片机里面实现的代码,不过这里一个问题频繁读取 刷屏速度比较慢 测试发现要100多MS,后面改进了算法 ,并且采用FATFS管理SPI FLASH 测试发现28ms可以显示一张图片(不过颜色不是很复杂 复杂时间会更长)

void lcd_display_image(uint32_t epromoffset)//保存在flsah中的地址
{
uint8_t buf[1024] = {0};//定义缓冲区大小
uint32_t totlelen = 0;//用于保存数据总长度
uint32_t index = 0;//索引
uint8_t temp = 0;//临时存放数据
uint8_t count = 0;//连续数据个数
uint16_t colour = 0;//保存颜色用如液晶显示
uint8_t i = 0;
SPI_FLASH_ReadBuffer(buf,epromoffset, 3);//前3个字节保存数据的总长度
epromoffset = epromoffset + 3;//flash 地址偏移3
totlelen = buf[0] << 16 | buf[1] << 8 | buf[2];//计算得到总长度
LCD_SetWindows(0,319,0,239);//320 240 设置LCD显示区域
while(index < totlelen)//判断 索引和文件总长度 退出的条件
{
     SPI_FLASH_ReadBuffer(buf,epromoffset, 1);//读数据
    epromoffset++;//flash 地址自加
    temp = buf[0];//得到读取的数据
    index++;//索引自加
    count = temp & 0x7f;//得到连续的个数
     if((temp & 0x80) == 0x80)//判断是否是相同 还是不同的 连续
     {
         SPI_FLASH_ReadBuffer(buf,epromoffset, 2);//相同连续 读取两个字节 
          epromoffset = epromoffset + 2;
         index = index + 2;
         colour = buf[0] << 8 | buf[1];//组合成颜色 RGB 565
         for(i = 0;i < count;i++)
        {
               LCD_RAM = colour;//显示  FSMC
           }
     }
     else//不相同 连续
      {
           //SPI_FLASH_ReadBuffer(buf,epromoffset, count *2);
           //读取 count*2个数据  2个数据组成一个颜色数据  count 个颜色数据 所以要*2
          SPI_DMA_FLASH_ReadBuffer_1(epromoffset,buf,count *2);
          epromoffset = epromoffset + count * 2;//地址偏移
          index = index + count * 2;
         for(i = 0; i < count * 2;i= i+2)
         {
              LCD_RAM  = buf[i] << 8 | buf[i+1];//显示
         }
     }
  }
index = 0;
}

改进后的单片机程序

void SPI_Flash_lcd_Fatfs_image(const char *filename)//文件名
{
uint8_t buf[piece_size] = {0};//开辟一个大的缓冲区

uint32_t epromoffset = 0;
uint32_t totlelen = 0;
uint32_t index = 0;
uint8_t temp = 0;
uint32_t num = 0;
uint8_t count = 0;
uint16_t colour = 0;
uint8_t i = 0,j = 0;
uint16_t write_buf = 0;
uint16_t read_buf = 0;

SPI_Flash_ReadFileData_add(filename,buf,epromoffset,3,&num);//读取总长度 采用FATFA
epromoffset = epromoffset + 3;
totlelen = buf[0] << 16 | buf[1] << 8 | buf[2];
LCD_SetWindows(0,319,0,239);//320 240

while(index < totlelen)
{
     if(totlelen - index > piece_size)
   {

SPI_Flash_ReadFileData_add(filename,buf,epromoffset,piece_size,&num);//读取数据保存到缓冲区
    epromoffset = epromoffset + piece_size;
    read_buf = piece_size;
    index = index + piece_size;
   }
  else
 {
     SPI_Flash_ReadFileData_add(filename,buf,epromoffset,totlelen - index,&num);
     epromoffset = epromoffset + totlelen - index;
     read_buf = totlelen - index;
     index = totlelen;
  }
   while(write_buf < read_buf)
  {
     temp = buf[write_buf];
    write_buf++;
     count = temp & 0x7f;
     if((temp & 0x80) == 0x80)
    {
        if((read_buf- write_buf) > 2)
       {
             colour = buf[write_buf] << 8 | buf[write_buf+1];
               write_buf = write_buf + 2;
        }
       else
       {
          write_buf = write_buf + 2;
       }
       for(i = 0;i < count;i++)
        {
            LCD_RAM = colour;
        }
   }
  else
 {
     count = count *2;
     j = 0;
     for(i = 0; i < count ;i= i+2)
    {
         if((read_buf - write_buf) > 2)
        {
            colour = buf[write_buf] << 8 | buf[write_buf+1];
              LCD_RAM  = colour;
             write_buf = write_buf +2;
         }
        else
         {
             SPI_Flash_ReadFileData_add(filename,buf,epromoffset + j,2,&num);//这里有点问题 需要改进 假如缓冲区数据读完 就会出现点问题
             j = j + 2;
             LCD_RAM  =buf[0] << 8 | buf[1];
            write_buf = write_buf +2;
         }
     }
   }
 }
 write_buf= write_buf %piece_size;
}

}

这个程序还有点小问题 ,不过也可以使用 ,有时间我再改进下

单片机采用RLE算法实现液晶屏显示图片相关推荐

  1. 树莓派GPIO驱动ST7735S主控TFT液晶屏显示图片和文字

    本文使用1.8''128*160RGB_TFT ST7735S主控的液晶屏来操作 参考blog:http://blog.mangolovecarrot.net/2017/03/05/raspi-stu ...

  2. c语言52单片机液晶屏显示,[手把手教你学51单片机C语言教程]22 LCD12864液晶屏显示.pdf...

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspC/C++资料 [手把手教你学51单片机C语言教程]22 LCD ...

  3. 汉字点阵与图形点阵提取方法及在LCD图形点阵液晶屏显示

    在单片机驱动LCD点阵小液晶屏应用中,除了显示英文字母外,还需要显示汉字或图形,以丰富显示内容,在单色LCD点阵小液晶屏中,英文字母.汉字.图形均是以亮点暗点不同的组合来显示不同的内容,由于在单片机类 ...

  4. 超声波传感器与液晶屏显示实验

    实验二  超声波传感器与液晶屏显示实验 一.实验目的 了解液晶屏显示的基本原理以及电路连接. 二.实验内容  了解液晶屏的工作原理和工作情况. 三.实验仪器 导线若干,1602液晶显示屏,LY-F2 ...

  5. nokia5110液晶屏显示汉字,图形,…

    nokia5110液晶屏显示汉字,图形,字符,字符串 从网上看到的文章,感觉很好,顾转载收藏啦 #include #include #define uchar unsigned char #defin ...

  6. 液晶屏显示的对讲机?还是手咪?

    美国大片中经常看到警车里面出现这样的场景:某一辆警车发现犯罪嫌疑人,警察拿起一个类似话筒的玩意儿,呼叫指挥中心,以便其余警车的人可以知道.包括现在国产电影也会经常出现警察随身携带这类产品呼叫中心的画面 ...

  7. Wemos D1 R32 ESP32开发板OLED液晶屏显示

    目录 一.实验准备 二.实验代码 1.OLED液晶屏显示"Hello World" 2. OLED液晶满屏显示字符 3.OLED屏显示时钟 4.OLED屏显示矢量图片 5 OLED ...

  8. Arduino配合电位计和oled液晶屏显示波形 Processing联动

    Arduino配合电位计和oled液晶屏显示波形 Processing联动 公众号:STCode Arduino配合电位计和oled液晶屏显示波形 Processing联动 1)描述 本作品使用Ard ...

  9. 用mixly软件解决esp8366,OLED液晶屏显示网络时钟的只显示个位数的问题

    有些朋友在编程的时候在用液晶屏显示网络时钟的时候可能会遇到一个小问题,就是时钟在个位数的时候,屏幕也只显示个位,这样屏幕上就会出现有个位数和双位数同时出现的情况,这样整个界面就不太美观,用mixly可 ...

最新文章

  1. 64位win7安装vs2010出现“组件安装失败...”等问题的解决方法
  2. 谷歌论文:使用深度强化学习的芯片布局
  3. git-【五】远程仓库
  4. flutter字体不跟随系统_flutter 禁止字体大小跟随系统字体改变大小
  5. 面试官:你对Kafka比较熟? 那说说kafka日志段如何读写的吧?
  6. 票务系统思维导图_最全思维导图分享,告诉你如何系统的学好软件测试。
  7. Java阶段性测试--第二三大题参考代码
  8. golang之iota
  9. go语言的range使用
  10. python list索引遍历_在python中遍历dict和list
  11. 无线SD-WAN提供商Cradlepoint完成C轮融资8900万美元
  12. 中小型企业网络IP地址规划案例-1
  13. 手机玩exe游戏的模拟器_手机就能玩Switch游戏,蛋蛋模拟器+盖世小鸡X2手柄体验...
  14. JavaWeb登陆界面
  15. 转:瑞利信道,莱斯信道和高斯信道模型
  16. 用生物知识解读“新冠病毒”,生物竞赛、高考考点,先马后看!
  17. 微信开发者工具 复制粘贴一行 快捷键
  18. 2021-06-22Android模拟器
  19. 多元线性回归之Spss实现
  20. 如何下载蓟州区卫星地图高清版大图

热门文章

  1. matlab二维平面波场绘制
  2. 关于怎样把普通usb摄像头图像发布到ros的topic
  3. MongoDB——单一作用聚合
  4. 2018年新春报喜!热烈祝贺王家林大咖大数据经典传奇著作《SPARK大数据商业实战三部曲》 畅销书籍 清华大学出版社发行上市!
  5. matlab匿名函数解方程,matlab 数学建模 匿名函数@
  6. 【AI分析】终于有人把云计算、大数据和人工智能讲明白了!
  7. 公司党建在线视频学习
  8. 疫情期间,方舱医院的污水处理如何做?
  9. 植物配景后期素材素材推荐 精品 小众
  10. 字节跳动测试岗,3面都过了,HR告诉我这个原因被刷了...