祝大家端午和六一快樂!原本今天是想歇息歇息的,可是實在無奈沒什么事干.所以就來學習學習LCD顯示圖片的函數
函數是照搬奮斗的樣例,算是些筆記吧.只是奮斗的樣例凝視的不是非常具體.今天去看了正點原子的論壇,唉..瞬間感覺正點原子做得真的非常好
能把全部的資料都開源,而且論壇上大多問題都耐心的解答了.這實在是很很好的售后服務了!!自己也偷偷的去下了寫資料來看看,(*^__^*) 嘻嘻……
好,進入主題:
開發板:奮斗V5
LCD:3寸 400X240
直接上代碼吧
void lcd_DrawPicture(u16 StartX,u16 StartY,u8 Dir,u8 *pic) { u32 i=8, len; u16 temp,x,y; /**************************************/ /*a1 長:240 寬:400*/ /*a2 長:400 寬:240*/ x=((uint16_t)(pic[2]<<8)+pic[3])-1; //從圖像數組里取出圖像的長度 y=((uint16_t)(pic[4]<<8)+pic[5])-1; //從圖像數組里取出圖像的高度 if(Dir==0){ LCD_WR_CMD(0x0003,0x1030); //圖像顯示方向為左下起 行遞增 列遞增 LCD_WR_CMD(0x0210, StartX); //水平顯示區起始地址 0-239 LCD_WR_CMD(0x0211, StartX+x); //水平顯示區結束地址 0-239 LCD_WR_CMD(0x0212, StartY); //垂直顯示區起始地址 0-399 LCD_WR_CMD(0x0213, StartY+y); //垂直顯示區結束地址 0-399 LCD_WR_CMD(0x0200, StartX); //水平顯示區地址 LCD_WR_CMD(0x0201, StartY); //垂直顯示區地址 } else if(Dir==1){ LCD_WR_CMD(0x0003,0x1018); //圖像顯示方向為左下起 行遞增 列遞減 LCD_WR_CMD(0x0210, StartY); //水平顯示區起始地址 0-239 LCD_WR_CMD(0x0211, StartY+y); //水平顯示區結束地址 0-239 LCD_WR_CMD(0x0212, 399-(x+StartX)); //垂直顯示區起始地址 0-399 LCD_WR_CMD(0x0213, 399-StartX); //垂直顯示區結束地址 0-399 LCD_WR_CMD(0x200, StartY); //水平顯示區地址 LCD_WR_CMD(0x201, 399-StartX); //垂直顯示區地址 } LCD_WR_REG(0x0202); //寫數據到顯示區 len=2*((uint16_t)(pic[2]<<8)+pic[3])*((uint16_t)(pic[4]<<8)+pic[5]); //計算出圖像所占的字節數 while(i<(len+8)) { //從圖像數組的第9位開始遞增 temp=(uint16_t)( pic[i]<<8)+pic[i+1]; //16位總線, 須要一次發送2個字節的數據 LCD_WR_Data(temp); //將取出的16位像素數據送入顯示區 i=i+2; //取模位置加2,以為獲取下一個像素數據 } }這是奮斗給的原版樣例,當中的凝視都給出了各行待會的功能,讓我們來看看他們詳細是怎么實現的
x=((uint16_t)(pic[2]<<8)+pic[3])-1; y=((uint16_t)(pic[4]<<8)+pic[5])-1;
為什么要這樣計算圖片的長和寬呢? 這時候就要看看圖片的數組了.圖片經過取模軟件(這里用的是Image2LCD)把圖片變成16進制的數組,非常長非常長的一個數組,可是
我們這里僅僅關心它的前8個字符,這是400X240的一個圖片取模出來的結果(當然僅僅是前面一小部分)
這是240X400的圖片的取模:
我想頭8位應該是固定的,並且240X400格式的照片前8位應該是一樣的,400X240格式的也應該是一樣的,這里我僅僅是自己下了兩張照片
取模的結果和奮斗給的樣例中的圖片是一樣的,所以我猜是一樣的,詳細我也沒去研究.還有就是取模然間要設置得對,取模結果才會和上面
一樣,顯示照片才會正常,這個問題以下再說.好,回到上面的長度和寬度的分析:
這時候你能夠拿起筆來計算一下了,以240X400為例, x=((uint16_t)(pic[2]<<8)+pic[3])-1; y=((uint16_t)(pic[4]<<8)+pic[5])-1;
pic[2] << 8 即 0x00左移8位,還是0x00,然后加上0xF0(十進制240),所以x=240-1=239(為了不超過屏幕范圍)
同理pic[4] <<8 等於0x100,然后加上0x90等於0x190(十進制400),所以y=400-1=399;
400X240的也是這樣算的...
然后接下來是顯示方向的問題,dir=0是豎屏(240x400),dir=1是橫屏(400x240),然后接下來就是寫數據了,上面已經有凝視了,這里就不說了,不明確的能夠看前一篇文章
len=2*((uint16_t)(pic[2]<<8)+pic[3])*((uint16_t)(pic[4]<<8)+pic[5]); 計算圖像所占字節數,這里我似懂非懂,不知道理解的對不正確,這里按我的理解是長X寬,這個easy懂,
為什么要乘於2,我想應該是求長和寬的時候是用了2個的字符合起來求的,所以這里要分成1個字節就要乘於2(這些是瞎寫的,假設真的正確答案的朋友,就請幫忙解答下)
接下來是
while(i<(len+8)) { //從圖像數組的第9位開始遞增 temp=(uint16_t)( pic[i]<<8)+pic[i+1]; //16位總線, 須要一次發送2個字節的數據 LCD_WR_Data(temp);<span style="white-space:pre"> </span>//將取出的16位像素數據送入顯示區 i=i+2; //取模位置加2,以為獲取下一個像素數據i的初始值為8,目的也就是為了跳過前8個字符,這也說明了前8個字符應該不是照片的內容,應該是前綴.
好了,這就完了,接下來說說取模軟件的設置吧,不小心這東西也會讓你費非常多事情的,這里用的是Image2LCD
第一個注意的點是輸入的設置:最大寬度和最大高度要和你的照片相符,這張相片是400X240的
第二個注意的點是輸出圖像:一開始輸出圖像並非(400,240)的,你要先設置最大寬度和最大高度以后,然后按上面的又一次加載一下,它才會輸出正確的大小格式,要不然圖像就不能正常顯示,或者是不能顯示.
第三個注意的點是高位在前:要勾上它,要不然圖像顯示就不正常了!
至於輸出多少位的圖片,是依據你的LCD接口方式來的.16位並口,就選擇16位真彩色
好了~這樣就能夠了,開發板圖片就不傳了,手機爛拍照不好看.