新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > S3C2440驅動4.3寸TFT屏程序

        S3C2440驅動4.3寸TFT屏程序

        作者: 時間:2016-11-21 來源:網絡 收藏
        簡單的配色原理

        本文引用地址:http://www.104case.com/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)//設置為TFT屏
        14. #defineBPPMODE(12)//設置為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)//用于設置顯示緩存區時,取低21位地址
        31. volatileunsignedshortLCD_BUFFER[SCR_YSIZE_TFT][SCR_XSIZE_TFT];//定義顯示緩存區
        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下降沿取數據等(看數據手冊)
        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字節則為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;//禁止臨時調色板寄存器
        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信號極性反轉
        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單個象素的顯示數據輸出
        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. //實現功能:在屏幕中畫直線
        109. //參數:
        110. //x1-起始點的x坐標
        111. //y1-起始點的y坐標
        112. //x2-結束點的x坐標
        113. //y2-結束點的y坐標
        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屏幕上指定坐標點畫一個指定大小的圖片
        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. //實現功能:在屏幕中畫圓
        273. //參數:
        274. //x-圓心的x坐標
        275. //y-圓心的y坐標
        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);//設置系統時鐘400M
        390. ChangeClockDivider(2,1);//設置分頻1:4:8
        391. CalcBusClk();//計算總線頻率
        392. Lcd_TFT_Init();
        393. Lcd_ClearScr((0x00<<11)|(0x00<<5)|(0x0e));//背景整屏藍屏
        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. }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 汉寿县| 石首市| 康乐县| 安平县| 静宁县| 原阳县| 河曲县| 盐亭县| 舟山市| 石台县| 东安县| 金塔县| 隆化县| 大同县| 内丘县| 平阴县| 兴国县| 濮阳县| 安达市| 大田县| 准格尔旗| 高邮市| 基隆市| 娄底市| 金山区| 广河县| 会同县| 循化| 化隆| 兴宁市| 汽车| 万盛区| 孟州市| 永昌县| 辽宁省| 资源县| 玛纳斯县| 迁西县| 大田县| 休宁县| 新干县|