STM32學習之路-LCD(3)<顯示圖片>


祝大家端午和六一快樂!原本今天是想歇息歇息的,可是實在無奈沒什么事干.所以就來學習學習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位真彩色

好了~這樣就能夠了,開發板圖片就不傳了,手機爛拍照不好看.



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM