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

发布者:快乐家庭最新更新时间:2017-09-11 来源: eefocus关键字:单片机  RLE算法  液晶屏  显示图片 手机看文章 扫描二维码
随时随地手机看文章

由于需要用到液晶屏(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算法  液晶屏  显示图片 引用地址:单片机采用RLE算法实现液晶屏显示图片

上一篇:STM32F407的RTC时间
下一篇:STM32F407 RTC 配置理解与总结

推荐阅读最新更新时间:2024-03-16 15:36

入门单片机需要购买什么东西,学哪款单片机最好?
最近看到有些人说学单片机好烧钱,把我看懵了,我的第一感觉是这孩子到底有多穷。 我印象中,10年前我自学单片机就买了一个51开发板,然后买了一套智能小车配件,总共花费不到500块钱。 通过几个月学习找到第一份工作1.8k,半年后涨到5k,大概1-2年后,每个月都能通过这个技术获得1万多报酬,如果当初懂投产比这个概念,我应该会像中了彩票一样开心。 所以别说500块,即便是5000块让你能够学会这门技术,我都觉得超值。 Ok,言归正传,对于单片机学习入门。 一、入门单片机要买什么? 我的原则和建议是能买最低配绝对不买最高配。 曾经我买STM32开发板的时候就做过这种傻事,总想着买最高配能多学点东西。 其实高配那些东西,在
[单片机]
入门<font color='red'>单片机</font>需要购买什么东西,学哪款<font color='red'>单片机</font>最好?
基于光学传感器的智能玩具小车设计
智能机器人在当今社会的应用越来越广泛。从普通的玩具机器人到工业控制机器人,从能够炒菜的机器人到可以进行太空探测的机器人,可以预见今后智能机器人的应用将更加广泛。普通的无线遥控车大家都很熟悉,任天堂的电玩WII大家也都觉得很神奇。熟悉的不好玩,神奇的又玩不起,可能是很多人遇到的共同问题。本设计从全新的思维角度出发,制作一个日常生活可以玩的智能小车,以飨有共同爱好的读者。 系统总体设计 智能小车系统原理是,将三维坐标传感器安装在小车上,小车即具有智能感知功能,就会随着目标物的前后左右移动而跟着移动。系统主要有3个组件:一为三维坐标光感传感器(ETOMS-ET21X111),用于采集目标物的移动坐标,该传感器使用非常简单;二为MCU
[应用]
51单片机的AD/DA转换
一、A/D(模数)、D/A(数模)转换 (一)、引脚 AOUT:模拟输出 Vref:参考电压 AGND:模拟地 EXT:接地 OSC:悬空 SCL,SDA:IIC AIN0、AIN1、AIN2:模拟输入口 (二)、电路图 从电路图可以看出,A0,A1,A2接地,所以当写入的时候地址应该是0X90,读取的时候应该是0X91 (三)、AGND和DGND 模拟地和数字地隔离开,消除干扰 (四)、控制字节 (五)、AD读数据函数 #include reg52.h #include delay.h #include iic.h #define SUCC 1 #define FAIL 0 unsigned char
[单片机]
基于MSP430单片机的智能无功补偿控制器的设计
1 引言 随着经济的发展和人们生活水平的提高,各行各业对供电可靠性和供电质量提出了更高的要求。由于配电网处于电网的末端,用户多为低压用户,许多用电器的功率因数很低,且不带补偿装置,这给电网带来很大的功率负担和额外线损,为了维护电力系统稳定、保证电能质量和安全运行,对电网末端变压器进行就地无功补偿很有必要。本文利用TI公司的MSP430F149单片机为核心构成的控制器,实时监测电网的电压、电流,并计算出有功、无功、功率因数,根据用电负荷情况,通过复合开关控制电容器组的自动投、切,实现无功功率的动态补偿,且具有报警功能。该装置安装在电力配电变压器低压侧,用于补偿配电变压器无功功率改善配电变压器的无功潮流,同时该装置也具有辅助调压
[单片机]
基于MSP430<font color='red'>单片机</font>的智能无功补偿控制器的设计
单片机综合练习 - 多功能时钟
结合前几天来写过的文章, 今天总算写了一个功能较多的应用 - 多功能时钟, 集时钟, 秒表, 温度计一体. 基础文章: 1. 单片机练习 - DS18B20温度转换与显示 2. 用C51编写单片机延时函数 3. 单片机练习 - 定时器 4. 单片机练习 - 计时器 实验板: TX-1B实验板 6位数码管与单片机的连接电路图 按键S2, S3与单片机的连接电路图: 其中S2与P3.4连, S3与P3.5连接... DS18B20与单片机连接电路图: 具体按键功能分配请看源代码注释部分: 1 //多功能时钟, 精确到小数0.01秒, 即10ms 2 //功能: 时钟, 秒表, 温度计 3 4 /* 5 S
[单片机]
<font color='red'>单片机</font>综合练习 - 多功能时钟
Proteus仿真51单片机C语言程序-单片机间双向通信
简介:单片机之间的双向通信:甲机向乙机发送控制命令字符,甲机同时接收乙机发送的数字,并显示在数码管上。
[单片机]
Proteus仿真51<font color='red'>单片机</font>C语言程序-<font color='red'>单片机</font>间双向通信
基于单片机的高精度测温装置的设计
0 引言 在工业生产和日常生活中,温度是需要测量和控制的重要参数之一,物体的许多物理现象和化学性质都与温度有关,许多生产过程都是在一定的温度范围内进行的,需要测量和控制温度,因此温度测量的场合极其广泛。热电阻是工程上应用广泛的温度传感器,使用最多的铂热电阻温度传感器零摄氏度标称中阻值为100Ω和10Ω,电阻变化系数为0.003851。铂热电阻温度传感器精度高、稳定性好,应用温度范围广,是中低温区最常用的一种温度传感器,不仅广泛用于工业测温,而且被制成各种标准温度计供计量和校准使用。 该装置结合单片机和传感器技术,采用AD517及ADSlllO芯片和EL-700铂热电阻设计了一种具有无线发射与接收模块的高精度测温装置。该装置既可
[单片机]
基于<font color='red'>单片机</font>的高精度测温装置的设计
基于C8051F410单片机实现双频固定式阅读器的应用方案
随着当前物流行业的快速发展。作为物流主要运输方式的集装箱运输.其运输效率及货运安全性日益受到人们关注。近几年来,随着RFID技术的发展和推广,将RFID技术用于集装箱信息识别.实现集装箱运输的智能化已经成为各集装箱厂家竞相开发的目标。RFID技术是一种利用射频通信方法实现的非接触式、快速、实时和准确的采集与处理信息的自动射频识别技术。目前集装箱运输上对RFlD技术的应用仅仅限于利用阅读器射频信道识别电子标签内集装箱信息.并有实现其运输安全上的保证。本文设计了一种基于C8051F410单片机的双频固定式阅读器。该阅读器与智能集装箱安全设备及路标设备配合实用.不仅能快速识别集装箱信息,而且能监测集装箱内货物的安全。一旦集装箱被非法打开
[单片机]
基于C8051F410<font color='red'>单片机</font>实现双频固定式阅读器的应用方案
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved