當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]由于需要用到液晶屏(320*240)顯示圖片,而且圖片的數(shù)量比較多(好幾百張),并且圖片要求保存到16M的SPI FLASH里面,顯然如果不處理 16M的FLASH明顯是放不下去。后來同事說可以用壓縮算法RLE,并且用C#給我做了個小

由于需要用到液晶屏(320*240)顯示圖片,而且圖片的數(shù)量比較多(好幾百張),并且圖片要求保存到16M的SPI FLASH里面,顯然如果不處理 16M的FLASH明顯是放不下去。后來同事說可以用壓縮算法RLE,并且用C#給我做了個小的軟件,壓縮圖片得到RLE壓縮后的數(shù)據(jù)。

點擊打開鏈接 ---------- 詳細(xì)的RLE算法可以參考次連接http://blog.csdn.net/orbit/article/details/7062218


這個算法的缺點是 如果圖片顏色復(fù)雜就不好,所以顏色盡量單調(diào)些。


1、RLE算法小工具的使用

2、我使用的RLE和上面連接的區(qū)別(改進(jìn))

3、單片機里面實現(xiàn)的方法



1、RLE算法小工具的使用點擊打開鏈接

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



使用:使用也非常簡單 下載下來RLETest.exe,點擊打開 --》界面就一個按鈕 “壓縮”---》點擊選擇圖片 自動壓縮

提示完成可以看見生成


第一個里面有壓縮前和壓縮后的文件大小對比

最后一個.c文件壓縮后得到一個數(shù)據(jù),可以保存到spi flash里面

2、我使用的RLE和上面連接的區(qū)別(改進(jìn))

由于采用的液晶屏是16位的數(shù)據(jù),那么比較可定應(yīng)該是按照2字節(jié) 一個數(shù)據(jù)的比較,不能采用上面那種1個字節(jié)的比較。所以這里做了改進(jìn),其他都和上面那篇文章介紹一樣。并且采用的是上面文章介紹的最后一個改進(jìn)算法,如下

詳細(xì)介紹 還是去看看那個文章。

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 unsignedcharsign=*src++;

235 intcount=sign&0x3F;

236 if((decSize+count)>onuBufSize)/*輸出緩沖區(qū)空間不夠了*/

237 {

238 return-1;

239 }

240 if((sign&0x80)==0x80)/*連續(xù)重復(fù)數(shù)據(jù)標(biāo)志*/

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、單片機里面實現(xiàn)的方法



下面是在單片機里面實現(xiàn)的代碼,不過這里一個問題頻繁讀取 刷屏速度比較慢 測試發(fā)現(xiàn)要100多MS,后面改進(jìn)了算法 ,并且采用FATFS管理SPI FLASH 測試發(fā)現(xiàn)28ms可以顯示一張圖片(不過顏色不是很復(fù)雜 復(fù)雜時間會更長)


void lcd_display_image(uint32_t epromoffset)//保存在flsah中的地址
{
uint8_t buf[1024] = {0};//定義緩沖區(qū)大小
uint32_t totlelen = 0;//用于保存數(shù)據(jù)總長度
uint32_t index = 0;//索引
uint8_t temp = 0;//臨時存放數(shù)據(jù)
uint8_t count = 0;//連續(xù)數(shù)據(jù)個數(shù)
uint16_t colour = 0;//保存顏色用如液晶顯示
uint8_t i = 0;
SPI_FLASH_ReadBuffer(buf,epromoffset, 3);//前3個字節(jié)保存數(shù)據(jù)的總長度
epromoffset = epromoffset + 3;//flash 地址偏移3
totlelen = buf[0] << 16 " buf[1] << 8 | buf[2];//計算得到總長度
LCD_SetWindows(0,319,0,239);//320 240 設(shè)置LCD顯示區(qū)域
while(index < totlelen)//判斷 索引和文件總長度 退出的條件
{
SPI_FLASH_ReadBuffer(buf,epromoffset, 1);//讀數(shù)據(jù)
epromoffset++;//flash 地址自加
temp = buf[0];//得到讀取的數(shù)據(jù)
index++;//索引自加
count = temp & 0x7f;//得到連續(xù)的個數(shù)
if((temp & 0x80) == 0x80)//判斷是否是相同 還是不同的 連續(xù)
{
SPI_FLASH_ReadBuffer(buf,epromoffset, 2);//相同連續(xù) 讀取兩個字節(jié)
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//不相同 連續(xù)
{
//SPI_FLASH_ReadBuffer(buf,epromoffset, count *2);
//讀取 count*2個數(shù)據(jù) 2個數(shù)據(jù)組成一個顏色數(shù)據(jù) count 個顏色數(shù)據(jù) 所以要*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;
}


改進(jìn)后的單片機程序

void SPI_Flash_lcd_Fatfs_image(const char *filename)//文件名
{
uint8_t buf[piece_size] = {0};//開辟一個大的緩沖區(qū)


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);//讀取數(shù)據(jù)保存到緩沖區(qū)
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ìn) 假如緩沖區(qū)數(shù)據(jù)讀完 就會出現(xiàn)點問題
j = j + 2;
LCD_RAM =buf[0] << 8 | buf[1];
write_buf = write_buf +2;
}
}
}
}
write_buf= write_buf %piece_size;
}


}

這個程序還有點小

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉