LCD_NEC35.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:13k
源码类别:

uCOS

开发平台:

C/C++

  1. /**************************************************************
  2. The initial and control for 320×240 16Bpp TFT LCD----LCD_LTV350QV-F04
  3. **************************************************************/
  4. #include "option.h"
  5. #include "2440addr.h"
  6. #include "2440lib.h"
  7. #include "2440slib.h" 
  8. #include "LCD_LTS350Q1_PE1.h"
  9. #define MVAL (13)
  10. #define MVAL_USED  (0) //0=each frame   1=rate by MVAL
  11. #define INVVDEN (1) //0=normal       1=inverted
  12. #define BSWP (0) //Byte swap control
  13. #define HWSWP (1) //Half word swap control
  14. #define M5D(n) ((n) & 0x1fffff) // To get lower 21bits
  15. //TFT 240320
  16. #define LCD_XSIZE_TFT_240320  (240)
  17. #define LCD_YSIZE_TFT_240320  (320)
  18. #define SCR_XSIZE_TFT_240320  (240)
  19. #define SCR_YSIZE_TFT_240320  (320)
  20. //TFT240320
  21. #define HOZVAL_TFT_240320 (LCD_XSIZE_TFT_240320-1)
  22. #define LINEVAL_TFT_240320 (LCD_YSIZE_TFT_240320-1)
  23. //Timing parameter for NEC3.5"
  24. #define VBPD_240320 (1) //垂直同步信号的后肩
  25. #define VFPD_240320 (5) //垂直同步信号的前肩
  26. #define VSPW_240320 (1) //垂直同步信号的脉宽
  27. #define HBPD_240320 (36) //水平同步信号的后肩
  28. #define HFPD_240320 (19) //水平同步信号的前肩
  29. #define HSPW_240320 (5) //水平同步信号的脉宽
  30. #define CLKVAL_TFT_240320 (4) 
  31. //FCLK=180MHz,HCLK=90MHz,VCLK=6.5MHz
  32. // GPB1/TOUT1 for Backlight control(PWM)
  33. #define GPB1_TO_OUT()   (rGPBUP &= 0xfffd, rGPBCON &= 0xfffffff3, rGPBCON |= 0x00000004)
  34. #define GPB1_TO_1()     (rGPBDAT |= 0x0002)
  35. #define GPB1_TO_0()     (rGPBDAT &= 0xfffd)
  36. static void Lcd_PowerEnable(int invpwren,int pwren);
  37. volatile static unsigned short LCD_BUFFER[SCR_YSIZE_TFT_240320][SCR_XSIZE_TFT_240320];
  38. /**************************************************************
  39. 320×240 16Bpp TFT LCD功能模块初始化
  40. **************************************************************/
  41. static void Lcd_Init(void)
  42. {
  43.     rGPCUP  = 0x00000000;
  44.  rGPCCON = 0xaaaa02a9; 
  45.  
  46. //    rGPDUP=0xffffffff; // Disable Pull-up register
  47.    rGPDUP  = 0x00000000;
  48.    rGPDCON=0xaaaaaaaa; //Initialize VD[15:8]
  49. rLCDCON1=(CLKVAL_TFT_240320<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;
  50.      // TFT LCD panel,12bpp TFT,ENVID=off
  51. rLCDCON2=(VBPD_240320<<24)|(LINEVAL_TFT_240320<<14)|(VFPD_240320<<6)|(VSPW_240320);
  52. rLCDCON3=(HBPD_240320<<19)|(HOZVAL_TFT_240320<<8)|(HFPD_240320);
  53. rLCDCON4=(MVAL<<8)|(HSPW_240320);
  54.     rLCDCON5 = (1<<11) | (1<<10) | (1<<9) | (1<<8) | (0<<7) | (0<<6)
  55.              | (1<<3)  |(BSWP<<1) | (HWSWP);
  56. rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1);
  57. rLCDSADDR2=M5D( ((U32)LCD_BUFFER+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320*2))>>1 );
  58. rLCDSADDR3=(((SCR_XSIZE_TFT_240320-LCD_XSIZE_TFT_240320)/1)<<11)|(LCD_XSIZE_TFT_240320/1);
  59. rLCDINTMSK|=(3); // MASK LCD Sub Interrupt
  60.     rTCONSEL &= (~7) ;     // Disable LPC3480
  61. rTPAL=0; // Disable Temp Palette
  62. }
  63. /**************************************************************
  64. LCD视频和控制信号输出或者停止,1开启视频输出
  65. **************************************************************/
  66. static void Lcd_EnvidOnOff(int onoff)
  67. {
  68.     if(onoff==1)
  69. rLCDCON1|=1; // ENVID=ON
  70.     else
  71. rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off
  72. }
  73. /**************************************************************
  74. 240×320 8Bpp TFT LCD 电源控制引脚使能(注意:在NEC3.5" 驱动板中实际并没有该函数相应的硬件支持)
  75. **************************************************************/
  76. static void Lcd_PowerEnable(int invpwren,int pwren)
  77. {
  78.     //GPG4 is setted as LCD_PWREN
  79.     rGPGUP=rGPGUP&(~(1<<4))|(1<<4); // Pull-up disable
  80.     rGPGCON=rGPGCON&(~(3<<8))|(3<<8); //GPG4=LCD_PWREN
  81.     rGPGDAT = rGPGDAT | (1<<4) ;
  82. // invpwren=pwren;
  83.     //Enable LCD POWER ENABLE Function
  84.     rLCDCON5=rLCDCON5&(~(1<<3))|(pwren<<3);   // PWREN
  85.     rLCDCON5=rLCDCON5&(~(1<<5))|(invpwren<<5);   // INVPWREN
  86. }
  87. /**************************************************************
  88. 240×320 16Bpp TFT LCD单个象素的显示数据输出
  89. **************************************************************/
  90. static void PutPixel(U32 x,U32 y, U32 c )
  91. {
  92. if ( (x < SCR_XSIZE_TFT_240320) && (y < SCR_YSIZE_TFT_240320) )
  93. LCD_BUFFER[(y)][(x)] = c;
  94. }
  95. /**************************************************************
  96. 240×320 16Bpp TFT LCD全屏填充特定颜色单元或清屏
  97. **************************************************************/
  98. static void Lcd_ClearScr( U32 c)
  99. {
  100. unsigned int x,y ;
  101.     for( y = 0 ; y < SCR_YSIZE_TFT_240320 ; y++ )
  102.     {
  103.      for( x = 0 ; x < SCR_XSIZE_TFT_240320 ; x++ )
  104.      {
  105. LCD_BUFFER[y][x] = c ;
  106.      }
  107.     }
  108. }
  109. /**************************************************************
  110. LCD屏幕显示垂直翻转
  111. // LCD display is flipped vertically
  112. // But, think the algorithm by mathematics point.
  113. //   3I2
  114. //   4 I 1
  115. //  --+--   <-8 octants  mathematical cordinate
  116. //   5 I 8
  117. //   6I7
  118. **************************************************************/
  119. static void Glib_Line(int x1,int y1,int x2,int y2,int color)
  120. {
  121. int dx,dy,e;
  122. dx=x2-x1; 
  123. dy=y2-y1;
  124.     
  125. if(dx>=0)
  126. {
  127. if(dy >= 0) // dy>=0
  128. {
  129. if(dx>=dy) // 1/8 octant
  130. {
  131. e=dy-dx/2;
  132. while(x1<=x2)
  133. {
  134. PutPixel(x1,y1,color);
  135. if(e>0){y1+=1;e-=dx;}
  136. x1+=1;
  137. e+=dy;
  138. }
  139. }
  140. else // 2/8 octant
  141. {
  142. e=dx-dy/2;
  143. while(y1<=y2)
  144. {
  145. PutPixel(x1,y1,color);
  146. if(e>0){x1+=1;e-=dy;}
  147. y1+=1;
  148. e+=dx;
  149. }
  150. }
  151. }
  152. else    // dy<0
  153. {
  154. dy=-dy;   // dy=abs(dy)
  155. if(dx>=dy) // 8/8 octant
  156. {
  157. e=dy-dx/2;
  158. while(x1<=x2)
  159. {
  160. PutPixel(x1,y1,color);
  161. if(e>0){y1-=1;e-=dx;}
  162. x1+=1;
  163. e+=dy;
  164. }
  165. }
  166. else // 7/8 octant
  167. {
  168. e=dx-dy/2;
  169. while(y1>=y2)
  170. {
  171. PutPixel(x1,y1,color);
  172. if(e>0){x1+=1;e-=dy;}
  173. y1-=1;
  174. e+=dx;
  175. }
  176. }
  177. }
  178. }
  179. else //dx<0
  180. {
  181. dx=-dx; //dx=abs(dx)
  182. if(dy >= 0) // dy>=0
  183. {
  184. if(dx>=dy) // 4/8 octant
  185. {
  186. e=dy-dx/2;
  187. while(x1>=x2)
  188. {
  189. PutPixel(x1,y1,color);
  190. if(e>0){y1+=1;e-=dx;}
  191. x1-=1;
  192. e+=dy;
  193. }
  194. }
  195. else // 3/8 octant
  196. {
  197. e=dx-dy/2;
  198. while(y1<=y2)
  199. {
  200. PutPixel(x1,y1,color);
  201. if(e>0){x1-=1;e-=dy;}
  202. y1+=1;
  203. e+=dx;
  204. }
  205. }
  206. }
  207. else    // dy<0
  208. {
  209. dy=-dy;   // dy=abs(dy)
  210. if(dx>=dy) // 5/8 octant
  211. {
  212. e=dy-dx/2;
  213. while(x1>=x2)
  214. {
  215. PutPixel(x1,y1,color);
  216. if(e>0){y1-=1;e-=dx;}
  217. x1-=1;
  218. e+=dy;
  219. }
  220. }
  221. else // 6/8 octant
  222. {
  223. e=dx-dy/2;
  224. while(y1>=y2)
  225. {
  226. PutPixel(x1,y1,color);
  227. if(e>0){x1-=1;e-=dy;}
  228. y1-=1;
  229. e+=dx;
  230. }
  231. }
  232. }
  233. }
  234. }
  235. /**************************************************************
  236. 在LCD屏幕上画一个矩形
  237. **************************************************************/
  238. static void Glib_Rectangle(int x1,int y1,int x2,int y2,int color)
  239. {
  240.     Glib_Line(x1,y1,x2,y1,color);
  241.     Glib_Line(x2,y1,x2,y2,color);
  242.     Glib_Line(x1,y2,x2,y2,color);
  243.     Glib_Line(x1,y1,x1,y2,color);
  244. }
  245. /**************************************************************
  246. 在LCD屏幕上用颜色填充一个矩形
  247. **************************************************************/
  248. static void Glib_FilledRectangle(int x1,int y1,int x2,int y2,int color)
  249. {
  250.     int i;
  251.     for(i=y1;i<=y2;i++)
  252. Glib_Line(x1,i,x2,i,color);
  253. }
  254. /**************************************************************
  255. 在LCD屏幕上指定坐标点画一个指定大小的图片
  256. **************************************************************/
  257. static void Paint_Bmp(int x0,int y0,int h,int l,unsigned char bmp[])
  258. {
  259. int x,y;
  260. U32 c;
  261. int p = 0;
  262.     for( y = y0 ; y < l ; y++ )
  263.     {
  264.      for( x = x0 ; x < h ; x++ )
  265.      {
  266.      c = bmp[p+1] | (bmp[p]<<8) ;
  267. if ( ( (x0+x) < SCR_XSIZE_TFT_240320) && ( (y0+y) < SCR_YSIZE_TFT_240320) )
  268. LCD_BUFFER[y0+y][x0+x] = c ;
  269.      p = p + 2 ;
  270.      }
  271.     }
  272. }
  273. /**************************************************************
  274. **************************************************************/
  275. void Lcd_Tft_NEC35_Init(void)
  276. {
  277.     //qjy: turn on the blacklight!
  278.     GPB1_TO_OUT();
  279.     GPB1_TO_1();
  280.     Lcd_Init();
  281. LcdBkLtSet( 70 ) ;
  282. Lcd_PowerEnable(0, 1);
  283.     Lcd_EnvidOnOff(1); //turn on vedio
  284.     Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x00) );  
  285.     #define LCD_BLANK 12
  286. #define C_UP ( LCD_XSIZE_TFT_240320 - LCD_BLANK*2 )
  287. #define C_RIGHT ( LCD_XSIZE_TFT_240320 - LCD_BLANK*2 )
  288. #define V_BLACK ( ( LCD_YSIZE_TFT_240320 - LCD_BLANK*4 ) / 6 )
  289. Glib_FilledRectangle( LCD_BLANK, LCD_BLANK, ( LCD_XSIZE_TFT_240320 - LCD_BLANK ), ( LCD_YSIZE_TFT_240320 - LCD_BLANK ),0x0000); //fill a Rectangle with some color
  290. 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
  291. 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
  292. 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
  293. 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
  294. 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
  295. 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
  296. Glib_Line( LCD_BLANK,LCD_BLANK, (LCD_XSIZE_TFT_240320-LCD_BLANK), (LCD_YSIZE_TFT_240320-LCD_BLANK), 0x0000 ) ;
  297. Glib_Line( LCD_BLANK,(LCD_YSIZE_TFT_240320-LCD_BLANK), (LCD_XSIZE_TFT_240320-LCD_BLANK), LCD_BLANK, 0x0000 ) ;
  298. Glib_Line( (LCD_XSIZE_TFT_240320/2),(LCD_BLANK*2 + V_BLACK*0), (LCD_XSIZE_TFT_240320/2), (LCD_BLANK*2 + V_BLACK*6), 0x0000 ) ;
  299. }
  300. void Lcd_Tft_NEC35_Test( void ) 
  301. {
  302.   // Lcd_Tft_LTS350Q1_PE1_Init();
  303.     Uart_Printf("nTest LTV350QV-F05 (TFT LCD)!n");
  304. Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x00)  )  ; //clear screen
  305. Uart_Printf( "nLCD clear screen is finished! press any key to continue!n" );
  306.     Uart_Getch() ; //wait uart input
  307. Lcd_ClearScr( (0x1f<<11) | (0x3f<<5) | (0x1f)  )  ; //clear screen
  308. Uart_Printf( "LCD clear screen is finished! press any key to continue!n" );
  309.     Uart_Getch() ; //wait uart input
  310. Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x1f)  )  ; //clear screen
  311. Uart_Printf( "LCD clear screen is finished! press any key to continue!n" );
  312.     Uart_Getch() ; //wait uart input
  313. Lcd_ClearScr( (0x00<<11) | (0x3f<<5) | (0x00)  )  ; //clear screen
  314. Uart_Printf( "LCD clear screen is finished! press any key to continue!n" );
  315.     Uart_Getch() ; //wait uart input
  316. /*
  317. Lcd_ClearScr( (0x1f<<11) | (0x00<<5) | (0x00)  )  ; //clear screen
  318. Uart_Printf( "LCD clear screen is finished! press any key to continue!n" );
  319.     Uart_Getch() ; //wait uart input
  320. Lcd_ClearScr( (0x00<<11) | (0x3f<<5) | (0x1f)  )  ; //clear screen
  321. Uart_Printf( "LCD clear screen is finished! press any key to continue!n" );
  322.     Uart_Getch() ; //wait uart input
  323. Lcd_ClearScr( (0x1f<<11) | (0x00<<5) | (0x1f)  )  ; //clear screen
  324. Uart_Printf( "LCD clear screen is finished! press any key to continue!n" );
  325.     Uart_Getch() ; //wait uart input
  326. Lcd_ClearScr( (0x1f<<11) | (0x3f<<5) | (0x00)  )  ; //clear screen
  327. Uart_Printf( "LCD clear screen is finished! press any key to continue!n" );
  328.     Uart_Getch() ; //wait uart input
  329. */
  330. Lcd_ClearScr(0xffff); //fill all screen with some color
  331. #define LCD_BLANK 12
  332. #define C_UP ( LCD_XSIZE_TFT_240320 - LCD_BLANK*2 )
  333. #define C_RIGHT ( LCD_XSIZE_TFT_240320 - LCD_BLANK*2 )
  334. #define V_BLACK ( ( LCD_YSIZE_TFT_240320 - LCD_BLANK*4 ) / 6 )
  335. Glib_FilledRectangle( LCD_BLANK, LCD_BLANK, ( LCD_XSIZE_TFT_240320 - LCD_BLANK ), ( LCD_YSIZE_TFT_240320 - LCD_BLANK ),0x0000); //fill a Rectangle with some color
  336. 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
  337. 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
  338. 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
  339. 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
  340. 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
  341. 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
  342. Glib_Line( LCD_BLANK,LCD_BLANK, (LCD_XSIZE_TFT_240320-LCD_BLANK), (LCD_YSIZE_TFT_240320-LCD_BLANK), 0x0000 ) ;
  343. Glib_Line( LCD_BLANK,(LCD_YSIZE_TFT_240320-LCD_BLANK), (LCD_XSIZE_TFT_240320-LCD_BLANK), LCD_BLANK, 0x0000 ) ;
  344. Glib_Line( (LCD_XSIZE_TFT_240320/2),(LCD_BLANK*2 + V_BLACK*0), (LCD_XSIZE_TFT_240320/2), (LCD_BLANK*2 + V_BLACK*6), 0x0000 ) ;
  345. Uart_Getch() ; //Any Key To Next
  346.     Paint_Bmp(0, 0, 240, 320, flower1_240_320);
  347.     Paint_Bmp(0, 0, 240, 320, FriendlyARM_pic_240x320);
  348.     Uart_Printf("bmp,Any Key To Next!n");
  349.     Uart_Getch() ;
  350.         
  351. }
  352. //*************************************************************