FLASH芯片W25Q16中放入圖片后用單片機(jī)讀取顯示
下面,瑞生介紹一種方法給大家,只利用一顆FLASH芯片W25Q16即可用你的單片機(jī)把圖片顯示到TFT液晶屏上。
原理:W25Q16是一顆FLASH芯片,可以存儲數(shù)據(jù),共2M字節(jié)。把圖片搞成二進(jìn)制bin文件,通過串口調(diào)試助手把這個文件傳給單片機(jī),單片機(jī)再把接收到的數(shù)據(jù)通過SPI口傳給W25Q16,這樣圖片就永久的保存下來了。顯示圖片的時候,單片機(jī)通過SPI口讀取W25Q16中的圖片數(shù)據(jù),然后解碼顯示到液晶屏上。
1.把圖片搞成二進(jìn)制bin文件
這里需要用到一個軟件:Image2LCD(百度可以下載)
打開軟件如下圖所示:
點(diǎn)擊左上角“打開”,選擇一張圖片打開,并按照下面圖片顯示的配置
點(diǎn)擊“保存”按鈕,保存到你的電腦某個位置即可。二進(jìn)制bin文件就做好了。
2.把bin文件裝到W25Q16里面
要把bin文件裝到W25Q16里面,通過前面講的原理,我們得寫個單片機(jī)程序。程序的流程為:串口接收到一個字節(jié),把字節(jié)通過SPI口傳到W25Q16,再接收到一個字節(jié),再傳一個,如此循環(huán)……。這個程序簡單吧?這個功能最好用串口中斷完成。
下面是串口中斷函數(shù),負(fù)責(zé)接收串口數(shù)據(jù)和把接收到的數(shù)據(jù)寫到W25Q16:
voidUART_IRQHandler(void){uint32IRQ_ID;//定義讀取中斷ID號變量uint8buf[1]={0x00};//定義接收數(shù)據(jù)變量數(shù)組
IRQ_ID=UART->IIR;//讀中斷ID號IRQ_ID=((IRQ_ID>>1)&0x7);//檢測bit4:bit1if(IRQ_ID==0x02)//檢測是不是接收數(shù)據(jù)引起的中斷{buf[0]=UART->RBR;//從RXFIFO中讀取接收到的數(shù)據(jù)W25X16_Write_Page(buf,flash_addr,1);//把數(shù)據(jù)寫到W25X16中flash_addr++;}return;}
寫好程序以后,連接好單片機(jī)和電腦的串口,打開串口調(diào)試助手,選好波特率,選好串口號,然后點(diǎn)擊“選擇發(fā)送文件”按鈕,如下圖所示:
選擇你剛才做好的bin文件,然后點(diǎn)擊“發(fā)送文件”按鈕,顯示“正在發(fā)送”。如下圖:
等上個幾秒鐘,顯示發(fā)送完成,并顯示發(fā)送了多少個字節(jié)。如下圖:
為什么是一共發(fā)送了153600個字節(jié),讓我們來算一下吧。TFT真彩屏,一個像素點(diǎn)需要用2個字節(jié)表示,240*320的屏,就需要240X340X2=153600個字節(jié)。
這時候,圖片數(shù)據(jù)就下載完成了。
3.從W25Q16里面讀取圖片數(shù)據(jù)并顯示到TFT上
下面是顯示圖片的關(guān)鍵函數(shù):
voidLCD_ShowPic(uint16xstart,uint16ystart,uint16xend,uint16yend,uint32pic_add){uint32max,i;uint8pic_buf[2];//用于存放一個點(diǎn)的顏色值
LCD_XYRAM(xstart,ystart,xend,yend);//設(shè)置GRAM坐標(biāo)LCD_WR_REG_DATA(0x0020,xstart);//設(shè)置X坐標(biāo)位置LCD_WR_REG_DATA(0x0021,ystart);//設(shè)置Y坐標(biāo)位置LCD_WR_REG(0x0022);//指向RAM寄存器,準(zhǔn)備寫數(shù)據(jù)到RAMW25X16_Write_Enable();//允許寫W25X16max=((uint32)(xend-xstart+1)*(uint32)(yend-ystart+1))*2;//得到顯示圖片的數(shù)據(jù)大小
for(i=0;i調(diào)用這個函數(shù),就可以顯示圖片了!
4.總結(jié)
接收一個字節(jié)并存儲到W25Q16中,這個需要很快的速度,主頻低的單片機(jī)是做不到的。我的實驗中,用到的是ARM Cortex-M0內(nèi)核的單片機(jī)LPC1114。