×
单片机 > 单片机程序设计 > 详情

S3C2440驱动4.3寸TFT屏程序

发布时间:2020-08-27 发布时间:
|
简单的配色原理

 
  1. /************************************************************** 
  2. The initial and control for 16Bpp TFT LCD 
  3. **************************************************************/  
  4.   
  5. #include "def.h"  
  6. #include "option.h"  
  7. #include "2440addr.h"  
  8. #include "2440lib.h"  
  9. #include "2440slib.h"   
  10.   
  11.   
  12. #define MVAL_USED   (0)         //0=each frame   1=rate by MVAL  
  13. #define INVVDEN     (1)         //0=normal       1=inverted  
  14. #define BSWP        (0)         //Byte swap control  
  15. #define HWSWP       (1)         //Half word swap control  
  16. #define PNRMODE     (3)         // 设置为TFT屏  
  17. #define BPPMODE     (12)        // 设置为16bpp模式  
  18.   
  19. //TFT_SIZE  
  20. #define LCD_XSIZE_TFT   (480)     
  21. #define LCD_YSIZE_TFT   (272)  
  22.   
  23. #define SCR_XSIZE_TFT   (480)         
  24. #define SCR_YSIZE_TFT   (272)  
  25.   
  26. #define HOZVAL_TFT  (LCD_XSIZE_TFT-1)  
  27. #define LINEVAL_TFT (LCD_YSIZE_TFT-1)  
  28.   
  29. //Timing parameter for 4.3' LCD  
  30. #define VBPD        (2)             //垂直同步信号的后肩  
  31. #define VFPD        (4)             //垂直同步信号的前肩  
  32. #define VSPW        (8)             //垂直同步信号的脉宽  
  33.   
  34. #define HBPD        (10)            //水平同步信号的后肩  
  35. #define HFPD        (19)            //水平同步信号的前肩  
  36. #define HSPW        (30)            //水平同步信号的脉宽  
  37.   
  38. #define CLKVAL_TFT  (4)             //时钟分频因子,VCLK = HCLK/((CLKVAL_TFT+1)*2)   
  39.   
  40.   
  41. #define M5D(n)  ((n) & 0x1fffff)    //用于设置显示缓存区时,取低21位地址  
  42.   
  43.   
  44. volatile unsigned short LCD_BUFFER[SCR_YSIZE_TFT][SCR_XSIZE_TFT];   //定义显示缓存区  
  45.   
  46. /************************************************************** 
  47. TFT LCD功能模块初始化 
  48. **************************************************************/  
  49. void Lcd_Init(void)  
  50. {  
  51.     rGPCUP  = 0x00000000;  
  52.     rGPCCON = 0xaaaa02a9;   
  53.        
  54.     rGPDUP  = 0x00000000;  
  55.     rGPDCON=0xaaaaaaaa; //Initialize VD[15:8]  
  56.   
  57.     rLCDCON1=(CLKVAL_TFT<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;// TFT LCD panel,16bpp TFT,ENVID=off     
  58.     rLCDCON2=(VBPD<<24)|(LINEVAL_TFT<<14)|(VFPD<<6)|(VSPW);  
  59.     rLCDCON3=(HBPD<<19)|(HOZVAL_TFT<<8)|(HFPD);  
  60.     rLCDCON4= HSPW;  
  61.     rLCDCON5 = (1<<11) | (0<<10) | (1<<9) | (1<<8) | (0<<7) | (0<<6) | (1<<3)  |(BSWP<<1) | (HWSWP);  
  62.     //16位输出格式565,VCLK下降沿取数据等 (看数据手册)  
  63.     rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1);   //单扫描  
  64.     rLCDSADDR2=M5D( ((U32)LCD_BUFFER+(SCR_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1 );  
  65.     //LCD_WIDTH×16/16;由于是选择的16位模式,     
  66.     //如果是24位模式,每个像素4字节则为LCD_WIDTH×32/16  
  67.     //(LCD_WIDTH在此为LCD_XSIZE_TFT)     
  68.     rLCDSADDR3=(((SCR_XSIZE_TFT-LCD_XSIZE_TFT)/1)<<11)|(LCD_XSIZE_TFT/1);  
  69.       
  70.     rLCDINTMSK|=(3); // MASK LCD Sub Interrupt  
  71.     rTCONSEL &= (~7) ;     // Disable LPC3600  
  72.       
  73.     rTPAL=0;    // 禁止临时调色板寄存器  
  74. }  
  75.   
  76.   
  77. /************************************************************** 
  78. *   LCD视频和控制信号输出或者停止,1开启视频输出 
  79. **************************************************************/  
  80. void Lcd_EnvidOnOff(int onoff)  
  81. {  
  82.     if(onoff==1)  
  83.         rLCDCON1|=1; // ENVID=ON  
  84.     else  
  85.         rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off  
  86. }  
  87.   
  88. /************************************************************** 
  89. *   TFT LCD 电源控制引脚使能 
  90. *   pwren=1时,允许PWREN信号 
  91. *   pwren=0时,禁止PWREN信号 
  92. *   invpwre=1,PWREN信号极性反转 
  93. *   invpwre=0,PWREN信号极性正常 
  94. **************************************************************/  
  95. void Lcd_PowerEnable(int invpwren,int pwren)  
  96. {  
  97.     //GPG4 is setted as LCD_PWREN  
  98.     rGPGUP=rGPGUP&(~(1<<4))|(1<<4);    //GPG4上拉电阻无效  
  99.     rGPGCON=rGPGCON&(~(3<<8))|(3<<8);  //GPG4=LCD_PWREN  
  100.     rGPGDAT = rGPGDAT | (1<<4) ;     //GPG4置1  
  101.     //invpwren=pwren;  
  102.     //Enable LCD POWER ENABLE Function  
  103.     rLCDCON5=rLCDCON5&(~(1<<3))|(pwren<<3);   // PWREN  
  104.     rLCDCON5=rLCDCON5&(~(1<<5))|(invpwren<<5);   // INVPWREN  
  105. }  
  106.   
  107. /************************************************************** 
  108. TFT LCD单个象素的显示数据输出 
  109. **************************************************************/  
  110. void PutPixel(U32 x,U32 y, U32 c )  
  111. {  
  112.     if ( (x 
  113.         LCD_BUFFER[(y)][(x)] = c;  
  114. }  
  115.   
  116. /************************************************************** 
  117. TFT LCD全屏填充特定颜色单元或清屏 
  118. **************************************************************/  
  119. void Lcd_ClearScr( U32 c)  
  120. {  
  121.     unsigned int x,y ;  
  122.           
  123.     for( y = 0 ; y 
  124.     {  
  125.         for( x = 0 ; x 
  126.         {  
  127.             LCD_BUFFER[y][x] = c ;  
  128.         }  
  129.     }  
  130. }  
  131.   
  132. /************************************************************** 
  133. //实现功能: 在屏幕中画直线 
  134. //参数: 
  135. //              x1 - 起始点的x坐标 
  136. //              y1 - 起始点的y坐标 
  137. //              x2 - 结束点的x坐标 
  138. //              y2 - 结束点的y坐标 
  139. //              color - 直线颜色 
  140. //返回值:      无 
  141. **************************************************************/  
  142. void Glib_Line(int x1,int y1,int x2,int y2,int color)  
  143. {  
  144.     int dx,dy,e;  
  145.     dx=x2-x1;   
  146.     dy=y2-y1;  
  147.       
  148.     if(dx>=0)  
  149.     {  
  150.         if(dy >= 0) // dy>=0  
  151.         {  
  152.             if(dx>=dy) // 1/8 octant  
  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        // 2/8 octant  
  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.         else           // dy<0  
  176.         {  
  177.             dy=-dy;   // dy=abs(dy)  
  178.   
  179.             if(dx>=dy) // 8/8 octant  
  180.             {  
  181.                 e=dy-dx/2;  
  182.                 while(x1<=x2)  
  183.                 {  
  184.                     PutPixel(x1,y1,color);  
  185.                     if(e>0){y1-=1;e-=dx;}      
  186.                     x1+=1;  
  187.                     e+=dy;  
  188.                 }  
  189.             }  
  190.             else        // 7/8 octant  
  191.             {  
  192.                 e=dx-dy/2;  
  193.                 while(y1>=y2)  
  194.                 {  
  195.                     PutPixel(x1,y1,color);  
  196.                     if(e>0){x1+=1;e-=dy;}      
  197.                     y1-=1;  
  198.                     e+=dx;  
  199.                 }  
  200.             }  
  201.         }     
  202.     }  
  203.     else //dx<0  
  204.     {  
  205.         dx=-dx;     //dx=abs(dx)  
  206.         if(dy >= 0) // dy>=0  
  207.         {  
  208.             if(dx>=dy) // 4/8 octant  
  209.             {  
  210.                 e=dy-dx/2;  
  211.                 while(x1>=x2)  
  212.                 {  
  213.                     PutPixel(x1,y1,color);  
  214.                     if(e>0){y1+=1;e-=dx;}      
  215.                     x1-=1;  
  216.                     e+=dy;  
  217.                 }  
  218.             }  
  219.             else        // 3/8 octant  
  220.             {  
  221.                 e=dx-dy/2;  
  222.                 while(y1<=y2)  
  223.                 {  
  224.                     PutPixel(x1,y1,color);  
  225.                     if(e>0){x1-=1;e-=dy;}      
  226.                     y1+=1;  
  227.                     e+=dx;  
  228.                 }  
  229.             }  
  230.         }  
  231.         else           // dy<0  
  232.         {  
  233.             dy=-dy;   // dy=abs(dy)  
  234.   
  235.             if(dx>=dy) // 5/8 octant  
  236.             {  
  237.                 e=dy-dx/2;  
  238.                 while(x1>=x2)  
  239.                 {  
  240.                     PutPixel(x1,y1,color);  
  241.                     if(e>0){y1-=1;e-=dx;}      
  242.                     x1-=1;  
  243.                     e+=dy;  
  244.                 }  
  245.             }  
  246.             else        // 6/8 octant  
  247.             {  
  248.                 e=dx-dy/2;  
  249.                 while(y1>=y2)  
  250.                 {  
  251.                     PutPixel(x1,y1,color);  
  252.                     if(e>0){x1-=1;e-=dy;}      
  253.                     y1-=1;  
  254.                     e+=dx;  
  255.                 }  
  256.             }  
  257.         }     
  258.     }  
  259. }  
  260.   
  261. /************************************************************** 
  262. 在LCD屏幕上画一个矩形 
  263. **************************************************************/  
  264. void Glib_Rectangle(int x1,int y1,int x2,int y2,int color)  
  265. {  
  266.     Glib_Line(x1,y1,x2,y1,color);  
  267.     Glib_Line(x2,y1,x2,y2,color);  
  268.     Glib_Line(x1,y2,x2,y2,color);  
  269.     Glib_Line(x1,y1,x1,y2,color);  
  270. }  
  271.   
  272. /************************************************************** 
  273. 在LCD屏幕上用颜色填充一个矩形 
  274. **************************************************************/  
  275. void Glib_FilledRectangle(int x1,int y1,int x2,int y2,int color)  
  276. {  
  277.     int i;  
  278.   
  279.     for(i=y1;i<=y2;i++)  
  280.     Glib_Line(x1,i,x2,i,color);  
  281. }  
  282.   
  283. /************************************************************** 
  284. 在LCD屏幕上指定坐标点画一个指定大小的图片 
  285. **************************************************************/  
  286. void Paint_Bmp(int x0,int y0,int h,int l,unsigned char bmp[])  
  287. {  
  288.     int x,y;  
  289.     U32 c;  
  290.     int p = 0;  
  291.       
  292.     for( y = y0 ; y 
  293.     {  
  294.         for( x = x0 ; x 
  295.         {  
  296.             c = bmp[p+1] | (bmp[p]<<8) ;  
  297.   
  298.             if ( ( (x0+x) 
  299.                 LCD_BUFFER[y0+y][x0+x] = c ;  
  300.               
  301.             p = p + 2 ;  
  302.         }  
  303.     }  
  304. }  
  305.   
  306. //=============================================================  
  307. //语法格式: void TFT_Circle(int x,int y,int r,int color,unsigned char Mode);  
  308. //实现功能: 在屏幕中画圆  
  309. //参数:         
  310. //              x - 圆心的x坐标  
  311. //              y - 圆心的y坐标  
  312. //              r - 圆的半径  
  313. //              color - 圆的颜色  
  314. //              Mode -  0   空心圆  
  315. //                      1   实心圆  
  316. //返回值:      无  
  317. //=============================================================  
  318. void TFT_Circle(int x,int y,int r,int color,unsigned char Mode)  
  319. {  
  320.     int dx,dy,ref;  
  321.     int Temp;  
  322.       
  323.     if(r == 0)  
  324.         return;  
  325.     dx = r;  
  326.     dy = 1;  
  327.     ref = 707 * r / 1000;                   // 参考值为0.707r  
  328.   
  329.     if(Mode == 1)                   // 实心圆  
  330.     {  
  331.         while(dy <= dx)  
  332.         {  
  333.             if(dx > ref)  
  334.                 Glib_Line(x + ref + 1, y + dy, x + dx, y + dy, color);  
  335.   
  336.             if(x >= ref + 1 && dx > ref)  
  337.             {  
  338.                 if(x 
  339.                     Temp = 0;  
  340.                 else  
  341.                     Temp = x - dx;  
  342.                 Glib_Line(Temp, y + dy, x - ref - 1, y + dy, color);  
  343.             }  
  344.               
  345.             if(y >= dy && dx > ref)  
  346.                 Glib_Line(x + ref + 1, y - dy, x + dx, y - dy, color);  
  347.             if(x >= ref + 1 && y >= dy && dx > ref)  
  348.             {  
  349.                 if(x 
  350.                     Temp = 0;  
  351.                 else  
  352.                     Temp = x - dx;  
  353.                 Glib_Line(Temp, y - dy, x - ref - 1, y - dy, color);  
  354.             }  
  355.   
  356.             if(dy != dx || dx == ref)  
  357.             {  
  358.                 if(y 
  359.                     Temp = 0;  
  360.                 else  
  361.                     Temp = y - dx;  
  362.                 Glib_Line(x + dy, Temp, x + dy, y + dx, color);  
  363.             }  
  364.   
  365.             if(x >= dy && (dy != dx || dy == ref))  
  366.             {  
  367.                 if(y 
  368.                     Temp = 0;  
  369.                 else  
  370.                     Temp = y - dx;  
  371.                 Glib_Line(x - dy, Temp, x - dy, y + dx, color);  
  372.             }             
  373.             dy++;  
  374.             if((r*r-dy*dy)<=(dx-1)*dx)  
  375.                 dx--;  
  376.         }  
  377.   
  378.         Glib_Line(x + ref + 1, y, x + r, y, color);  
  379.   
  380.         if(x >= ref + 1)  
  381.         {  
  382.             if(x 
  383.                 Temp = 0;  
  384.             else  
  385.                 Temp = x - r;  
  386.             Glib_Line(Temp, y, x - ref - 1, y, color);  
  387.         }  
  388.   
  389.         if(y 
  390.             Temp = 0;  
  391.         else  
  392.             Temp = y - r;  
  393.         Glib_Line(x, Temp, x, y + r, color);  
  394.     }  
  395.     else                                                    // 空心圆  
  396.     {  
  397.         while(dy <= dx)  
  398.         {  
  399.             PutPixel(x + dx, y + dy, color);  
  400.             PutPixel(x - dx, y + dy, color);  
  401.             PutPixel(x + dx, y - dy, color);  
  402.             PutPixel(x - dx, y - dy, color);  
  403.             if(dx != dy)  
  404.             {  
  405.                 PutPixel(x + dy, y + dx, color);  
  406.                 PutPixel(x + dy, y - dx, color);  
  407.                 PutPixel(x - dy, y + dx, color);  
  408.                 PutPixel(x - dy, y - dx, color);  
  409.             }  
  410.             dy++;  
  411.             if((r*r-dy*dy)<=(dx-1)*dx)  
  412.                 dx--;  
  413.         }  
  414.         PutPixel(x + r, y, color);  
  415.         PutPixel(x - r, y, color);  
  416.         PutPixel(x, y + r, color);  
  417.         PutPixel(x, y - r, color);  
  418.     }     
  419. }  
  420.   
  421. /************************************************************** 
  422. *       LCD屏初始化 
  423. **************************************************************/  
  424. void Lcd_TFT_Init(void)  
  425. {  
  426.     Lcd_Init();  
  427.     Lcd_PowerEnable(0, 1);  
  428.     Lcd_EnvidOnOff(1);      //turn on vedio  
  429.     Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x00) ); //565格式 纯黑色  
  430. }  
  431.       
  432. void Main(void)  
  433. {  
  434.       
  435.     SelectFclk(2);  //设置系统时钟 400M       
  436.     ChangeClockDivider(2, 1);      //设置分频 1:4:8  
  437.     CalcBusClk();           //计算总线频率  
  438.       
  439.     Lcd_TFT_Init();  
  440.    
  441.    
  442.     Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x0e)  )  ;     //背景整屏蓝屏  
  443.     Glib_Rectangle(10,10,150,150,(0x1f<<11) | (0x00<<5) | (0x00)); //空心正方形边为纯红  
  444.     Glib_FilledRectangle(20,20,100,100,(0x1f<<11) | (0x00<<5) | (0x1f) ); //品红正方形  
  445.     Glib_Line(155,5,280,160,(0x00<<11) | (0x00<<5) | (0x00));   //黑色直线  
  446.     Glib_FilledRectangle(5,180,150,240,(0x1f<<11) | (0x3f<<5) | (0x00) ); //黄色矩形  
  447.     TFT_Circle(360,180,80,(0x1f<<11) | (0x3f<<5) | (0x1f),0);   //空心圆  
  448.     TFT_Circle(360,170,60,(0x1f<<11) | (0x00<<5) | (0x00),1);   //纯红实心圆  
  449.     //Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x1f)  )  ;       //clear screen  
  450.     //Delay(1000);  
  451.    
  452.  }  
  453.  

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式