lcd.c
上传用户:jankzhpno
上传日期:2022-08-03
资源大小:4763k
文件大小:10k
源码类别:

Windows CE

开发平台:

Visual C++

  1. /**************************************************************
  2. The initial and control for 640×480 16Bpp TFT LCD----VGA
  3. **************************************************************/
  4. #include "def.h"
  5. #include "option.h"
  6. #include "2440addr.h"
  7. #include "2440lib.h"
  8. #include "2440slib.h" 
  9. extern const unsigned char sunflower_240x320[];
  10. extern const unsigned char sunflower_800x480[];
  11. extern const unsigned char sunflower_1024x768[];
  12. extern const unsigned char sunflower_640x480[];
  13. #define LCD_XSIZE  LCD_WIDTH
  14. #define LCD_YSIZE  LCD_HEIGHT
  15. #define SCR_XSIZE  LCD_WIDTH
  16. #define SCR_YSIZE  LCD_HEIGHT
  17. volatile static unsigned short LCD_BUFFER[SCR_YSIZE][SCR_XSIZE];
  18. /**************************************************************
  19. 640×480 TFT LCD数据和控制端口初始化
  20. **************************************************************/
  21. static void Lcd_Port_Init( void )
  22. {
  23.     rGPCUP=0xffffffff; // Disable Pull-up register
  24.     rGPCCON=0xaaaa02a8; //Initialize VD[7:0],VM,VFRAME,VLINE,VCLK
  25.     rGPDUP=0xffffffff; // Disable Pull-up register
  26.     rGPDCON=0xaaaaaaaa; //Initialize VD[15:8]
  27. }
  28. /**************************************************************
  29. 640×480 TFT LCD功能模块初始化
  30. **************************************************************/
  31. static void LCD_Init(void)
  32. {
  33. #define M5D(n) ((n)&0x1fffff)
  34. #define LCD_ADDR ((U32)LCD_BUFFER)
  35. rLCDCON1 = (LCD_PIXCLOCK << 8) | (3 <<  5) | (12 << 1);
  36.     rLCDCON2 = (LCD_UPPER_MARGIN << 24) | ((LCD_HEIGHT - 1) << 14) | (LCD_LOWER_MARGIN << 6) | (LCD_VSYNC_LEN << 0);
  37.     rLCDCON3 = (LCD_RIGHT_MARGIN << 19) | ((LCD_WIDTH  - 1) <<  8) | (LCD_LEFT_MARGIN << 0);
  38.     rLCDCON4 = (13 <<  8) | (LCD_HSYNC_LEN << 0);
  39. #if !defined(LCD_CON5)
  40. #    define LCD_CON5 ((1<<11) | (1 << 9) | (1 << 8) | (1 << 3) | (1 << 0))
  41. #endif
  42.     rLCDCON5   =  LCD_CON5;
  43.     rLCDSADDR1 = ((LCD_ADDR >> 22) << 21) | ((M5D(LCD_ADDR >> 1)) <<  0);
  44.     rLCDSADDR2 = M5D((LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2) >> 1);
  45.     rLCDSADDR3 = LCD_WIDTH;        
  46.     rLCDINTMSK |= 3;
  47.    rTCONSEL   &= (~7);
  48.  
  49.     rTPAL     = 0x0;
  50.     rTCONSEL &= ~((1<<4) | 1);
  51.     
  52. }
  53. /**************************************************************
  54. LCD视频和控制信号输出或者停止,1开启视频输出
  55. **************************************************************/
  56. static void Lcd_EnvidOnOff(int onoff)
  57. {
  58.     if(onoff==1)
  59. rLCDCON1|=1; // ENVID=ON
  60.     else
  61. rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off
  62. }
  63. /**************************************************************
  64. 320×240 8Bpp TFT LCD 电源控制引脚使能
  65. **************************************************************/
  66. static void Lcd_PowerEnable(int invpwren,int pwren)
  67. {
  68.     //GPG4 is setted as LCD_PWREN
  69.     rGPGUP = rGPGUP|(1<<4); // Pull-up disable
  70.     rGPGCON = rGPGCON|(3<<8); //GPG4=LCD_PWREN
  71.     
  72.     //Enable LCD POWER ENABLE Function
  73.     rLCDCON5 = rLCDCON5&(~(1<<3))|(pwren<<3);   // PWREN
  74.     rLCDCON5 = rLCDCON5&(~(1<<5))|(invpwren<<5);   // INVPWREN
  75. }
  76. /**************************************************************
  77. 640×480 TFT LCD单个象素的显示数据输出
  78. **************************************************************/
  79. static void PutPixel(U32 x,U32 y,U16 c)
  80. {
  81.     if(x<SCR_XSIZE && y<SCR_YSIZE)
  82. LCD_BUFFER[(y)][(x)] = c;
  83. }
  84. /**************************************************************
  85. 640×480 TFT LCD全屏填充特定颜色单元或清屏
  86. **************************************************************/
  87. static void Lcd_ClearScr( U16 c)
  88. {
  89. unsigned int x,y ;
  90.     for( y = 0 ; y < SCR_YSIZE ; y++ )
  91.     {
  92.      for( x = 0 ; x < SCR_XSIZE ; x++ )
  93.      {
  94. LCD_BUFFER[y][x] = c ;
  95.      }
  96.     }
  97. }
  98. /**************************************************************
  99. LCD屏幕显示垂直翻转
  100. // LCD display is flipped vertically
  101. // But, think the algorithm by mathematics point.
  102. //   3I2
  103. //   4 I 1
  104. //  --+--   <-8 octants  mathematical cordinate
  105. //   5 I 8
  106. //   6I7
  107. **************************************************************/
  108. static void Glib_Line(int x1,int y1,int x2,int y2, U16 color)
  109. {
  110. int dx,dy,e;
  111. dx=x2-x1; 
  112. dy=y2-y1;
  113.     
  114. if(dx>=0)
  115. {
  116. if(dy >= 0) // dy>=0
  117. {
  118. if(dx>=dy) // 1/8 octant
  119. {
  120. e=dy-dx/2;
  121. while(x1<=x2)
  122. {
  123. PutPixel(x1,y1,color);
  124. if(e>0){y1+=1;e-=dx;}
  125. x1+=1;
  126. e+=dy;
  127. }
  128. }
  129. else // 2/8 octant
  130. {
  131. e=dx-dy/2;
  132. while(y1<=y2)
  133. {
  134. PutPixel(x1,y1,color);
  135. if(e>0){x1+=1;e-=dy;}
  136. y1+=1;
  137. e+=dx;
  138. }
  139. }
  140. }
  141. else    // dy<0
  142. {
  143. dy=-dy;   // dy=abs(dy)
  144. if(dx>=dy) // 8/8 octant
  145. {
  146. e=dy-dx/2;
  147. while(x1<=x2)
  148. {
  149. PutPixel(x1,y1,color);
  150. if(e>0){y1-=1;e-=dx;}
  151. x1+=1;
  152. e+=dy;
  153. }
  154. }
  155. else // 7/8 octant
  156. {
  157. e=dx-dy/2;
  158. while(y1>=y2)
  159. {
  160. PutPixel(x1,y1,color);
  161. if(e>0){x1+=1;e-=dy;}
  162. y1-=1;
  163. e+=dx;
  164. }
  165. }
  166. }
  167. }
  168. else //dx<0
  169. {
  170. dx=-dx; //dx=abs(dx)
  171. if(dy >= 0) // dy>=0
  172. {
  173. if(dx>=dy) // 4/8 octant
  174. {
  175. e=dy-dx/2;
  176. while(x1>=x2)
  177. {
  178. PutPixel(x1,y1,color);
  179. if(e>0){y1+=1;e-=dx;}
  180. x1-=1;
  181. e+=dy;
  182. }
  183. }
  184. else // 3/8 octant
  185. {
  186. e=dx-dy/2;
  187. while(y1<=y2)
  188. {
  189. PutPixel(x1,y1,color);
  190. if(e>0){x1-=1;e-=dy;}
  191. y1+=1;
  192. e+=dx;
  193. }
  194. }
  195. }
  196. else    // dy<0
  197. {
  198. dy=-dy;   // dy=abs(dy)
  199. if(dx>=dy) // 5/8 octant
  200. {
  201. e=dy-dx/2;
  202. while(x1>=x2)
  203. {
  204. PutPixel(x1,y1,color);
  205. if(e>0){y1-=1;e-=dx;}
  206. x1-=1;
  207. e+=dy;
  208. }
  209. }
  210. else // 6/8 octant
  211. {
  212. e=dx-dy/2;
  213. while(y1>=y2)
  214. {
  215. PutPixel(x1,y1,color);
  216. if(e>0){x1-=1;e-=dy;}
  217. y1-=1;
  218. e+=dx;
  219. }
  220. }
  221. }
  222. }
  223. }
  224. /**************************************************************
  225. 在LCD屏幕上用颜色填充一个矩形
  226. **************************************************************/
  227. static void Glib_FilledRectangle(int x1,int y1,int x2,int y2, U16 color)
  228. {
  229.     int i;
  230.     for(i=y1;i<=y2;i++)
  231. Glib_Line(x1,i,x2,i,color);
  232. }
  233. /**************************************************************
  234. 在LCD屏幕上指定坐标点画一个指定大小的图片
  235. **************************************************************/
  236. static void Paint_Bmp(int x0,int y0,int h,int l,const unsigned char *bmp)
  237. {
  238. int x,y;
  239. U32 c;
  240. int p = 0;
  241.     for( y = 0 ; y < l ; y++ )
  242.     {
  243.      for( x = 0 ; x < h ; x++ )
  244.      {
  245.      c = bmp[p+1] | (bmp[p]<<8) ;
  246. if ( ( (x0+x) < SCR_XSIZE) && ( (y0+y) < SCR_YSIZE) )
  247. LCD_BUFFER[y0+y][x0+x] = c ;
  248.      p = p + 2 ;
  249.      }
  250.     }
  251. }
  252. /**************************************************************
  253. **************************************************************/
  254. void TFT_LCD_Init(void)
  255. {
  256.     LCD_Init();
  257. LcdBkLtSet( 70 ) ;
  258. Lcd_PowerEnable(0, 1);
  259.     Lcd_EnvidOnOff(1); //turn on vedio
  260.     Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x00) );  
  261. #if defined(LCD_N35) || defined(LCD_T35)
  262. Paint_Bmp(0, 0, 240, 320, sunflower_240x320);
  263. #elif defined(LCD_A70)
  264. Paint_Bmp(0, 0, 800, 480, sunflower_800x480);
  265. #elif defined(LCD_L80)
  266. Paint_Bmp(0, 0, 640, 480, sunflower_640x480);
  267. #elif defined(LCD_VGA1024768)
  268.     Paint_Bmp(0, 0, 1024, 768, sunflower_1024x768);
  269. #endif    
  270. }
  271. /**************************************************************
  272. **************************************************************/
  273. void TFT_LCD_Test(void)
  274. {
  275. #if defined(LCD_N35) || defined(LCD_T35)
  276. Uart_Printf("nTest TFT LCD 240x320!n");
  277. #elif defined(LCD_A70)
  278. Uart_Printf("nTest TFT LCD 800×480!n");
  279. #elif defined(LCD_L80)
  280. Uart_Printf("nTest TFT LCD 640×480!n");
  281. #elif defined(LCD_VGA1024768)
  282.     Uart_Printf("nTest VGA 1024x768!n");
  283. #endif    
  284.     Lcd_Port_Init();
  285.     LCD_Init();
  286.     Lcd_EnvidOnOff(1); //turn on vedio
  287. Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x00)  )  ; //clear screen
  288. Uart_Printf( "nLCD clear screen is finished! press any key to continue!n" );
  289.     Uart_Getch() ; //wait uart input
  290. Lcd_ClearScr( (0x1f<<11) | (0x3f<<5) | (0x1f)  )  ; //clear screen
  291. Uart_Printf( "LCD clear screen is finished! press any key to continue!n" );
  292.     Uart_Getch() ; //wait uart input
  293. Lcd_ClearScr(0xffff); //fill all screen with some color
  294. #define LCD_BLANK 30
  295. #define C_UP ( LCD_XSIZE - LCD_BLANK*2 )
  296. #define C_RIGHT ( LCD_XSIZE - LCD_BLANK*2 )
  297. #define V_BLACK ( ( LCD_YSIZE - LCD_BLANK*4 ) / 6 )
  298. Glib_FilledRectangle( LCD_BLANK, LCD_BLANK, ( LCD_XSIZE - LCD_BLANK ), ( LCD_YSIZE - LCD_BLANK ),0x0000); //fill a Rectangle with some color
  299. Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*0), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*1),0x001f); //fill a Rectangle with some color
  300. Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*1), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*2),0x07e0); //fill a Rectangle with some color
  301. Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*2), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*3),0xf800); //fill a Rectangle with some color
  302. Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*3), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*4),0xffe0); //fill a Rectangle with some color
  303. Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*4), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*5),0xf81f); //fill a Rectangle with some color
  304. Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*5), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*6),0x07ff); //fill a Rectangle with some color
  305.     Uart_Printf( "LCD color test, please look! press any key to continue!n" );
  306.     Uart_Getch() ; //wait uart input
  307. #if defined(LCD_N35) || defined(LCD_T35)
  308. Paint_Bmp(0, 0, 240, 320, sunflower_240x320);
  309. #elif defined(LCD_A70)
  310. Paint_Bmp(0, 0, 800, 480, sunflower_800x480);
  311. #elif defined(LCD_L80)
  312. Paint_Bmp(0, 0, 640, 480, sunflower_640x480);
  313. #elif defined(LCD_VGA1024768)
  314.     Paint_Bmp(0, 0, 1024, 768, sunflower_1024x768);
  315. #endif    
  316.     Uart_Printf( "LCD paint a bmp, please look! press any key to continue! n" );
  317.     Uart_Getch() ; //wait uart input
  318.     Lcd_EnvidOnOff(0); //turn off vedio
  319. }
  320. //*************************************************************