您的位置 首页 厂商

怎么选用单片机驱动液晶屏完成显现图片

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

因为需求用到液晶屏(320*240)显现图片,而且图片的数量比较多(好几百张),而且图片要求保存到16M的SPI FLASH里边,显着假设不处理 16M的FLASH显着是放不下去。后来搭档说能够用紧缩算法RLE,而且用C#给我做了个小的软件,紧缩图片得到RLE紧缩后的数据。

这个算法的缺陷是 假设图片色彩杂乱就欠好,所以色彩尽量单调些。

1、RLE算法小工具的运用

2、我运用的RLE和上面衔接的差异(改善)

3、单片机里边完结的办法

1、RLE算法小工具的运用点击翻开链接

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

运用:运用也十分简略 下载下来RLETest.exe,点击翻开 –》界面就一个按钮 “紧缩”—》点击挑选图片 主动紧缩

提示完结能够看见生成

榜首个里边有紧缩前和紧缩后的文件巨细比照

最终一个.c文件紧缩后得到一个数据,能够保存到spi flash里边

2、我运用的RLE和上面衔接的差异(改善)

因为选用的液晶屏是16位的数据,那么比较可定应该是依照2字节 一个数据的比较,不能选用上面那种1个字节的比较。所以这儿做了改善,其他都和上面那篇文章介绍相同。而且选用的是上面文章介绍的最终一个改善算法,如下

225intRle_Decode_O(unsignedchar*inbuf,inTInSize,unsignedchar*outbuf,intonuBufSize)

226{

227unsignedchar*src=inbuf;

228inTI;

229intdecSize=0;

230intcount=0;

231

232while(src《(inbuf+inSize))

233{

234 unsignedc++harsign=*src++;

235 intcount=sign&0x3F;

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

237 {

238 return-1;

239 }

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

241 {

242 for(i=0;i

243 {

244 outbuf[decSize++]=*src;

245 }

246 src++;

247 }

248 else

249 {

250 for(i=0;i

251 {

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

253 }

254 }

255}

256

257returndecSize;

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;

}

}

这个程序还有点小
来历;21ic

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/344158.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部