新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > S3C2440驅(qū)動4.3寸TFT屏程序

S3C2440驅(qū)動4.3寸TFT屏程序

作者: 時間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
簡單的配色原理

本文引用地址:http://m.butianyuan.cn/article/201611/319207.htm
  1. /**************************************************************
  2. Theinitialandcontrolfor16BppTFTLCD
  3. **************************************************************/
  4. #include"def.h"
  5. #include"option.h"
  6. #include"2440addr.h"
  7. #include"2440lib.h"
  8. #include"2440slib.h"
  9. #defineMVAL_USED(0)//0=eachframe1=ratebyMVAL
  10. #defineINVVDEN(1)//0=normal1=inverted
  11. #defineBSWP(0)//Byteswapcontrol
  12. #defineHWSWP(1)//Halfwordswapcontrol
  13. #definePNRMODE(3)//設(shè)置為TFT屏
  14. #defineBPPMODE(12)//設(shè)置為16bpp模式
  15. //TFT_SIZE
  16. #defineLCD_XSIZE_TFT(480)
  17. #defineLCD_YSIZE_TFT(272)
  18. #defineSCR_XSIZE_TFT(480)
  19. #defineSCR_YSIZE_TFT(272)
  20. #defineHOZVAL_TFT(LCD_XSIZE_TFT-1)
  21. #defineLINEVAL_TFT(LCD_YSIZE_TFT-1)
  22. //Timingparameterfor4.3LCD
  23. #defineVBPD(2)//垂直同步信號的后肩
  24. #defineVFPD(4)//垂直同步信號的前肩
  25. #defineVSPW(8)//垂直同步信號的脈寬
  26. #defineHBPD(10)//水平同步信號的后肩
  27. #defineHFPD(19)//水平同步信號的前肩
  28. #defineHSPW(30)//水平同步信號的脈寬
  29. #defineCLKVAL_TFT(4)//時鐘分頻因子,VCLK=HCLK/((CLKVAL_TFT+1)*2)
  30. #defineM5D(n)((n)&0x1fffff)//用于設(shè)置顯示緩存區(qū)時,取低21位地址
  31. volatileunsignedshortLCD_BUFFER[SCR_YSIZE_TFT][SCR_XSIZE_TFT];//定義顯示緩存區(qū)
  32. /**************************************************************
  33. TFTLCD功能模塊初始化
  34. **************************************************************/
  35. voidLcd_Init(void)
  36. {
  37. rGPCUP=0x00000000;
  38. rGPCCON=0xaaaa02a9;
  39. rGPDUP=0x00000000;
  40. rGPDCON=0xaaaaaaaa;//InitializeVD[15:8]
  41. rLCDCON1=(CLKVAL_TFT<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;//TFTLCDpanel,16bppTFT,ENVID=off
  42. rLCDCON2=(VBPD<<24)|(LINEVAL_TFT<<14)|(VFPD<<6)|(VSPW);
  43. rLCDCON3=(HBPD<<19)|(HOZVAL_TFT<<8)|(HFPD);
  44. rLCDCON4=HSPW;
  45. rLCDCON5=(1<<11)|(0<<10)|(1<<9)|(1<<8)|(0<<7)|(0<<6)|(1<<3)|(BSWP<<1)|(HWSWP);
  46. //16位輸出格式565,VCLK下降沿取數(shù)據(jù)等(看數(shù)據(jù)手冊)
  47. rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1);//單掃描
  48. rLCDSADDR2=M5D(((U32)LCD_BUFFER+(SCR_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1);
  49. //LCD_WIDTH×16/16;由于是選擇的16位模式,
  50. //如果是24位模式,每個像素4字節(jié)則為LCD_WIDTH×32/16
  51. //(LCD_WIDTH在此為LCD_XSIZE_TFT)
  52. rLCDSADDR3=(((SCR_XSIZE_TFT-LCD_XSIZE_TFT)/1)<<11)|(LCD_XSIZE_TFT/1);
  53. rLCDINTMSK|=(3);//MASKLCDSubInterrupt
  54. rTCONSEL&=(~7);//DisableLPC3600
  55. rTPAL=0;//禁止臨時調(diào)色板寄存器
  56. }
  57. /**************************************************************
  58. *LCD視頻和控制信號輸出或者停止,1開啟視頻輸出
  59. **************************************************************/
  60. voidLcd_EnvidOnOff(intonoff)
  61. {
  62. if(onoff==1)
  63. rLCDCON1|=1;//ENVID=ON
  64. else
  65. rLCDCON1=rLCDCON1&0x3fffe;//ENVIDOff
  66. }
  67. /**************************************************************
  68. *TFTLCD電源控制引腳使能
  69. *pwren=1時,允許PWREN信號
  70. *pwren=0時,禁止PWREN信號
  71. *invpwre=1,PWREN信號極性反轉(zhuǎn)
  72. *invpwre=0,PWREN信號極性正常
  73. **************************************************************/
  74. voidLcd_PowerEnable(intinvpwren,intpwren)
  75. {
  76. //GPG4issettedasLCD_PWREN
  77. rGPGUP=rGPGUP&(~(1<<4))|(1<<4);//GPG4上拉電阻無效
  78. rGPGCON=rGPGCON&(~(3<<8))|(3<<8);//GPG4=LCD_PWREN
  79. rGPGDAT=rGPGDAT|(1<<4);//GPG4置1
  80. //invpwren=pwren;
  81. //EnableLCDPOWERENABLEFunction
  82. rLCDCON5=rLCDCON5&(~(1<<3))|(pwren<<3);//PWREN
  83. rLCDCON5=rLCDCON5&(~(1<<5))|(invpwren<<5);//INVPWREN
  84. }
  85. /**************************************************************
  86. TFTLCD單個象素的顯示數(shù)據(jù)輸出
  87. **************************************************************/
  88. voidPutPixel(U32x,U32y,U32c)
  89. {
  90. if((x
  91. LCD_BUFFER[(y)][(x)]=c;
  92. }
  93. /**************************************************************
  94. TFTLCD全屏填充特定顏色單元或清屏
  95. **************************************************************/
  96. voidLcd_ClearScr(U32c)
  97. {
  98. unsignedintx,y;
  99. for(y=0;y
  100. {
  101. for(x=0;x
  102. {
  103. LCD_BUFFER[y][x]=c;
  104. }
  105. }
  106. }
  107. /**************************************************************
  108. //實現(xiàn)功能:在屏幕中畫直線
  109. //參數(shù):
  110. //x1-起始點的x坐標(biāo)
  111. //y1-起始點的y坐標(biāo)
  112. //x2-結(jié)束點的x坐標(biāo)
  113. //y2-結(jié)束點的y坐標(biāo)
  114. //color-直線顏色
  115. //返回值:無
  116. **************************************************************/
  117. voidGlib_Line(intx1,inty1,intx2,inty2,intcolor)
  118. {
  119. intdx,dy,e;
  120. dx=x2-x1;
  121. dy=y2-y1;
  122. if(dx>=0)
  123. {
  124. if(dy>=0)//dy>=0
  125. {
  126. if(dx>=dy)//1/8octant
  127. {
  128. e=dy-dx/2;
  129. while(x1<=x2)
  130. {
  131. PutPixel(x1,y1,color);
  132. if(e>0){y1+=1;e-=dx;}
  133. x1+=1;
  134. e+=dy;
  135. }
  136. }
  137. else//2/8octant
  138. {
  139. e=dx-dy/2;
  140. while(y1<=y2)
  141. {
  142. PutPixel(x1,y1,color);
  143. if(e>0){x1+=1;e-=dy;}
  144. y1+=1;
  145. e+=dx;
  146. }
  147. }
  148. }
  149. else//dy<0
  150. {
  151. dy=-dy;//dy=abs(dy)
  152. if(dx>=dy)//8/8octant
  153. {
  154. e=dy-dx/2;
  155. while(x1<=x2)
  156. {
  157. PutPixel(x1,y1,color);
  158. if(e>0){y1-=1;e-=dx;}
  159. x1+=1;
  160. e+=dy;
  161. }
  162. }
  163. else//7/8octant
  164. {
  165. e=dx-dy/2;
  166. while(y1>=y2)
  167. {
  168. PutPixel(x1,y1,color);
  169. if(e>0){x1+=1;e-=dy;}
  170. y1-=1;
  171. e+=dx;
  172. }
  173. }
  174. }
  175. }
  176. else//dx<0
  177. {
  178. dx=-dx;//dx=abs(dx)
  179. if(dy>=0)//dy>=0
  180. {
  181. if(dx>=dy)//4/8octant
  182. {
  183. e=dy-dx/2;
  184. while(x1>=x2)
  185. {
  186. PutPixel(x1,y1,color);
  187. if(e>0){y1+=1;e-=dx;}
  188. x1-=1;
  189. e+=dy;
  190. }
  191. }
  192. else//3/8octant
  193. {
  194. e=dx-dy/2;
  195. while(y1<=y2)
  196. {
  197. PutPixel(x1,y1,color);
  198. if(e>0){x1-=1;e-=dy;}
  199. y1+=1;
  200. e+=dx;
  201. }
  202. }
  203. }
  204. else//dy<0
  205. {
  206. dy=-dy;//dy=abs(dy)
  207. if(dx>=dy)//5/8octant
  208. {
  209. e=dy-dx/2;
  210. while(x1>=x2)
  211. {
  212. PutPixel(x1,y1,color);
  213. if(e>0){y1-=1;e-=dx;}
  214. x1-=1;
  215. e+=dy;
  216. }
  217. }
  218. else//6/8octant
  219. {
  220. e=dx-dy/2;
  221. while(y1>=y2)
  222. {
  223. PutPixel(x1,y1,color);
  224. if(e>0){x1-=1;e-=dy;}
  225. y1-=1;
  226. e+=dx;
  227. }
  228. }
  229. }
  230. }
  231. }
  232. /**************************************************************
  233. 在LCD屏幕上畫一個矩形
  234. **************************************************************/
  235. voidGlib_Rectangle(intx1,inty1,intx2,inty2,intcolor)
  236. {
  237. Glib_Line(x1,y1,x2,y1,color);
  238. Glib_Line(x2,y1,x2,y2,color);
  239. Glib_Line(x1,y2,x2,y2,color);
  240. Glib_Line(x1,y1,x1,y2,color);
  241. }
  242. /**************************************************************
  243. 在LCD屏幕上用顏色填充一個矩形
  244. **************************************************************/
  245. voidGlib_FilledRectangle(intx1,inty1,intx2,inty2,intcolor)
  246. {
  247. inti;
  248. for(i=y1;i<=y2;i++)
  249. Glib_Line(x1,i,x2,i,color);
  250. }
  251. /**************************************************************
  252. 在LCD屏幕上指定坐標(biāo)點畫一個指定大小的圖片
  253. **************************************************************/
  254. voidPaint_Bmp(intx0,inty0,inth,intl,unsignedcharbmp[])
  255. {
  256. intx,y;
  257. U32c;
  258. intp=0;
  259. for(y=y0;y
  260. {
  261. for(x=x0;x
  262. {
  263. c=bmp[p+1]|(bmp[p]<<8);
  264. if(((x0+x)
  265. LCD_BUFFER[y0+y][x0+x]=c;
  266. p=p+2;
  267. }
  268. }
  269. }
  270. //=============================================================
  271. //語法格式:voidTFT_Circle(intx,inty,intr,intcolor,unsignedcharMode);
  272. //實現(xiàn)功能:在屏幕中畫圓
  273. //參數(shù):
  274. //x-圓心的x坐標(biāo)
  275. //y-圓心的y坐標(biāo)
  276. //r-圓的半徑
  277. //color-圓的顏色
  278. //Mode-0空心圓
  279. //1實心圓
  280. //返回值:無
  281. //=============================================================
  282. voidTFT_Circle(intx,inty,intr,intcolor,unsignedcharMode)
  283. {
  284. intdx,dy,ref;
  285. intTemp;
  286. if(r==0)
  287. return;
  288. dx=r;
  289. dy=1;
  290. ref=707*r/1000;//參考值為0.707r
  291. if(Mode==1)//實心圓
  292. {
  293. while(dy<=dx)
  294. {
  295. if(dx>ref)
  296. Glib_Line(x+ref+1,y+dy,x+dx,y+dy,color);
  297. if(x>=ref+1&&dx>ref)
  298. {
  299. if(x
  300. Temp=0;
  301. else
  302. Temp=x-dx;
  303. Glib_Line(Temp,y+dy,x-ref-1,y+dy,color);
  304. }
  305. if(y>=dy&&dx>ref)
  306. Glib_Line(x+ref+1,y-dy,x+dx,y-dy,color);
  307. if(x>=ref+1&&y>=dy&&dx>ref)
  308. {
  309. if(x
  310. Temp=0;
  311. else
  312. Temp=x-dx;
  313. Glib_Line(Temp,y-dy,x-ref-1,y-dy,color);
  314. }
  315. if(dy!=dx||dx==ref)
  316. {
  317. if(y
  318. Temp=0;
  319. else
  320. Temp=y-dx;
  321. Glib_Line(x+dy,Temp,x+dy,y+dx,color);
  322. }
  323. if(x>=dy&&(dy!=dx||dy==ref))
  324. {
  325. if(y
  326. Temp=0;
  327. else
  328. Temp=y-dx;
  329. Glib_Line(x-dy,Temp,x-dy,y+dx,color);
  330. }
  331. dy++;
  332. if((r*r-dy*dy)<=(dx-1)*dx)
  333. dx--;
  334. }
  335. Glib_Line(x+ref+1,y,x+r,y,color);
  336. if(x>=ref+1)
  337. {
  338. if(x
  339. Temp=0;
  340. else
  341. Temp=x-r;
  342. Glib_Line(Temp,y,x-ref-1,y,color);
  343. }
  344. if(y
  345. Temp=0;
  346. else
  347. Temp=y-r;
  348. Glib_Line(x,Temp,x,y+r,color);
  349. }
  350. else//空心圓
  351. {
  352. while(dy<=dx)
  353. {
  354. PutPixel(x+dx,y+dy,color);
  355. PutPixel(x-dx,y+dy,color);
  356. PutPixel(x+dx,y-dy,color);
  357. PutPixel(x-dx,y-dy,color);
  358. if(dx!=dy)
  359. {
  360. PutPixel(x+dy,y+dx,color);
  361. PutPixel(x+dy,y-dx,color);
  362. PutPixel(x-dy,y+dx,color);
  363. PutPixel(x-dy,y-dx,color);
  364. }
  365. dy++;
  366. if((r*r-dy*dy)<=(dx-1)*dx)
  367. dx--;
  368. }
  369. PutPixel(x+r,y,color);
  370. PutPixel(x-r,y,color);
  371. PutPixel(x,y+r,color);
  372. PutPixel(x,y-r,color);
  373. }
  374. }
  375. /**************************************************************
  376. *
  377. *LCD屏初始化
  378. *
  379. **************************************************************/
  380. voidLcd_TFT_Init(void)
  381. {
  382. Lcd_Init();
  383. Lcd_PowerEnable(0,1);
  384. Lcd_EnvidOnOff(1);//turnonvedio
  385. Lcd_ClearScr((0x00<<11)|(0x00<<5)|(0x00));//565格式純黑色
  386. }
  387. voidMain(void)
  388. {
  389. SelectFclk(2);//設(shè)置系統(tǒng)時鐘400M
  390. ChangeClockDivider(2,1);//設(shè)置分頻1:4:8
  391. CalcBusClk();//計算總線頻率
  392. Lcd_TFT_Init();
  393. Lcd_ClearScr((0x00<<11)|(0x00<<5)|(0x0e));//背景整屏藍(lán)屏
  394. Glib_Rectangle(10,10,150,150,(0x1f<<11)|(0x00<<5)|(0x00));//空心正方形邊為純紅
  395. Glib_FilledRectangle(20,20,100,100,(0x1f<<11)|(0x00<<5)|(0x1f));//品紅正方形
  396. Glib_Line(155,5,280,160,(0x00<<11)|(0x00<<5)|(0x00));//黑色直線
  397. Glib_FilledRectangle(5,180,150,240,(0x1f<<11)|(0x3f<<5)|(0x00));//黃色矩形
  398. TFT_Circle(360,180,80,(0x1f<<11)|(0x3f<<5)|(0x1f),0);//空心圓
  399. TFT_Circle(360,170,60,(0x1f<<11)|(0x00<<5)|(0x00),1);//純紅實心圓
  400. //Lcd_ClearScr((0x00<<11)|(0x00<<5)|(0x1f));//clearscreen
  401. //Delay(1000);
  402. }



關(guān)鍵詞: S3C24404.3寸TFT屏程

評論


技術(shù)專區(qū)

關(guān)閉