- /**************************************************************
- The initial and control for 16Bpp TFT LCD
- **************************************************************/
- #include "def.h"
- #include "option.h"
- #include "2440addr.h"
- #include "2440lib.h"
- #include "2440slib.h"
- #define MVAL_USED (0) //0=each frame 1=rate by MVAL
- #define INVVDEN (1) //0=normal 1=inverted
- #define BSWP (0) //Byte swap control
- #define HWSWP (1) //Half word swap control
- #define PNRMODE (3) // 设置为TFT屏
- #define BPPMODE (12) // 设置为16bpp模式
- //TFT_SIZE
- #define LCD_XSIZE_TFT (480)
- #define LCD_YSIZE_TFT (272)
- #define SCR_XSIZE_TFT (480)
- #define SCR_YSIZE_TFT (272)
- #define HOZVAL_TFT (LCD_XSIZE_TFT-1)
- #define LINEVAL_TFT (LCD_YSIZE_TFT-1)
- //Timing parameter for 4.3' LCD
- #define VBPD (2) //垂直同步信号的后肩
- #define VFPD (4) //垂直同步信号的前肩
- #define VSPW (8) //垂直同步信号的脉宽
- #define HBPD (10) //水平同步信号的后肩
- #define HFPD (19) //水平同步信号的前肩
- #define HSPW (30) //水平同步信号的脉宽
- #define CLKVAL_TFT (4) //时钟分频因子,VCLK = HCLK/((CLKVAL_TFT+1)*2)
- #define M5D(n) ((n) & 0x1fffff) //用于设置显示缓存区时,取低21位地址
- volatile unsigned short LCD_BUFFER[SCR_YSIZE_TFT][SCR_XSIZE_TFT]; //定义显示缓存区
- /**************************************************************
- TFT LCD功能模块初始化
- **************************************************************/
- void Lcd_Init(void)
- {
- rGPCUP = 0x00000000;
- rGPCCON = 0xaaaa02a9;
- rGPDUP = 0x00000000;
- rGPDCON=0xaaaaaaaa; //Initialize VD[15:8]
- rLCDCON1=(CLKVAL_TFT<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;// TFT LCD panel,16bpp TFT,ENVID=off
- rLCDCON2=(VBPD<<24)|(LINEVAL_TFT<<14)|(VFPD<<6)|(VSPW);
- rLCDCON3=(HBPD<<19)|(HOZVAL_TFT<<8)|(HFPD);
- rLCDCON4= HSPW;
- rLCDCON5 = (1<<11) | (0<<10) | (1<<9) | (1<<8) | (0<<7) | (0<<6) | (1<<3) |(BSWP<<1) | (HWSWP);
- //16位输出格式565,VCLK下降沿取数据等 (看数据手册)
- rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1); //单扫描
- rLCDSADDR2=M5D( ((U32)LCD_BUFFER+(SCR_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1 );
- //LCD_WIDTH×16/16;由于是选择的16位模式,
- //如果是24位模式,每个像素4字节则为LCD_WIDTH×32/16
- //(LCD_WIDTH在此为LCD_XSIZE_TFT)
- rLCDSADDR3=(((SCR_XSIZE_TFT-LCD_XSIZE_TFT)/1)<<11)|(LCD_XSIZE_TFT/1);
- rLCDINTMSK|=(3); // MASK LCD Sub Interrupt
- rTCONSEL &= (~7) ; // Disable LPC3600
- rTPAL=0; // 禁止临时调色板寄存器
- }
- /**************************************************************
- * LCD视频和控制信号输出或者停止,1开启视频输出
- **************************************************************/
- void Lcd_EnvidOnOff(int onoff)
- {
- if(onoff==1)
- rLCDCON1|=1; // ENVID=ON
- else
- rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off
- }
- /**************************************************************
- * TFT LCD 电源控制引脚使能
- * pwren=1时,允许PWREN信号
- * pwren=0时,禁止PWREN信号
- * invpwre=1,PWREN信号极性反转
- * invpwre=0,PWREN信号极性正常
- **************************************************************/
- void Lcd_PowerEnable(int invpwren,int pwren)
- {
- //GPG4 is setted as LCD_PWREN
- rGPGUP=rGPGUP&(~(1<<4))|(1<<4); //GPG4上拉电阻无效
- rGPGCON=rGPGCON&(~(3<<8))|(3<<8); //GPG4=LCD_PWREN
- rGPGDAT = rGPGDAT | (1<<4) ; //GPG4置1
- //invpwren=pwren;
- //Enable LCD POWER ENABLE Function
- rLCDCON5=rLCDCON5&(~(1<<3))|(pwren<<3); // PWREN
- rLCDCON5=rLCDCON5&(~(1<<5))|(invpwren<<5); // INVPWREN
- }
- /**************************************************************
- TFT LCD单个象素的显示数据输出
- **************************************************************/
- void PutPixel(U32 x,U32 y, U32 c )
- {
- if ( (x < SCR_XSIZE_TFT) && (y < SCR_YSIZE_TFT) )
- LCD_BUFFER[(y)][(x)] = c;
- }
- /**************************************************************
- TFT LCD全屏填充特定颜色单元或清屏
- **************************************************************/
- void Lcd_ClearScr( U32 c)
- {
- unsigned int x,y ;
- for( y = 0 ; y < SCR_YSIZE_TFT ; y++ )
- {
- for( x = 0 ; x < SCR_XSIZE_TFT ; x++ )
- {
- LCD_BUFFER[y][x] = c ;
- }
- }
- }
- /**************************************************************
- //实现功能: 在屏幕中画直线
- //参数:
- // x1 - 起始点的x坐标
- // y1 - 起始点的y坐标
- // x2 - 结束点的x坐标
- // y2 - 结束点的y坐标
- // color - 直线颜色
- //返回值: 无
- **************************************************************/
- void Glib_Line(int x1,int y1,int x2,int y2,int color)
- {
- int dx,dy,e;
- dx=x2-x1;
- dy=y2-y1;
- if(dx>=0)
- {
- if(dy >= 0) // dy>=0
- {
- if(dx>=dy) // 1/8 octant
- {
- e=dy-dx/2;
- while(x1<=x2)
- {
- PutPixel(x1,y1,color);
- if(e>0){y1+=1;e-=dx;}
- x1+=1;
- e+=dy;
- }
- }
- else // 2/8 octant
- {
- e=dx-dy/2;
- while(y1<=y2)
- {
- PutPixel(x1,y1,color);
- if(e>0){x1+=1;e-=dy;}
- y1+=1;
- e+=dx;
- }
- }
- }
- else // dy<0
- {
- dy=-dy; // dy=abs(dy)
- if(dx>=dy) // 8/8 octant
- {
- e=dy-dx/2;
- while(x1<=x2)
- {
- PutPixel(x1,y1,color);
- if(e>0){y1-=1;e-=dx;}
- x1+=1;
- e+=dy;
- }
- }
- else // 7/8 octant
- {
- e=dx-dy/2;
- while(y1>=y2)
- {
- PutPixel(x1,y1,color);
- if(e>0){x1+=1;e-=dy;}
- y1-=1;
- e+=dx;
- }
- }
- }
- }
- else //dx<0
- {
- dx=-dx; //dx=abs(dx)
- if(dy >= 0) // dy>=0
- {
- if(dx>=dy) // 4/8 octant
- {
- e=dy-dx/2;
- while(x1>=x2)
- {
- PutPixel(x1,y1,color);
- if(e>0){y1+=1;e-=dx;}
- x1-=1;
- e+=dy;
- }
- }
- else // 3/8 octant
- {
- e=dx-dy/2;
- while(y1<=y2)
- {
- PutPixel(x1,y1,color);
- if(e>0){x1-=1;e-=dy;}
- y1+=1;
- e+=dx;
- }
- }
- }
- else // dy<0
- {
- dy=-dy; // dy=abs(dy)
- if(dx>=dy) // 5/8 octant
- {
- e=dy-dx/2;
- while(x1>=x2)
- {
- PutPixel(x1,y1,color);
- if(e>0){y1-=1;e-=dx;}
- x1-=1;
- e+=dy;
- }
- }
- else // 6/8 octant
- {
- e=dx-dy/2;
- while(y1>=y2)
- {
- PutPixel(x1,y1,color);
- if(e>0){x1-=1;e-=dy;}
- y1-=1;
- e+=dx;
- }
- }
- }
- }
- }
- /**************************************************************
- 在LCD屏幕上画一个矩形
- **************************************************************/
- void Glib_Rectangle(int x1,int y1,int x2,int y2,int color)
- {
- Glib_Line(x1,y1,x2,y1,color);
- Glib_Line(x2,y1,x2,y2,color);
- Glib_Line(x1,y2,x2,y2,color);
- Glib_Line(x1,y1,x1,y2,color);
- }
- /**************************************************************
- 在LCD屏幕上用颜色填充一个矩形
- **************************************************************/
- void Glib_FilledRectangle(int x1,int y1,int x2,int y2,int color)
- {
- int i;
- for(i=y1;i<=y2;i++)
- Glib_Line(x1,i,x2,i,color);
- }
- /**************************************************************
- 在LCD屏幕上指定坐标点画一个指定大小的图片
- **************************************************************/
- void Paint_Bmp(int x0,int y0,int h,int l,unsigned char bmp[])
- {
- int x,y;
- U32 c;
- int p = 0;
- for( y = y0 ; y < l ; y++ )
- {
- for( x = x0 ; x < h ; x++ )
- {
- c = bmp[p+1] | (bmp[p]<<8) ;
- if ( ( (x0+x) < SCR_XSIZE_TFT) && ( (y0+y) < SCR_YSIZE_TFT) )
- LCD_BUFFER[y0+y][x0+x] = c ;
- p = p + 2 ;
- }
- }
- }
- //=============================================================
- //语法格式: void TFT_Circle(int x,int y,int r,int color,unsigned char Mode);
- //实现功能: 在屏幕中画圆
- //参数:
- // x - 圆心的x坐标
- // y - 圆心的y坐标
- // r - 圆的半径
- // color - 圆的颜色
- // Mode - 0 空心圆
- // 1 实心圆
- //返回值: 无
- //=============================================================
- void TFT_Circle(int x,int y,int r,int color,unsigned char Mode)
- {
- int dx,dy,ref;
- int Temp;
- if(r == 0)
- return;
- dx = r;
- dy = 1;
- ref = 707 * r / 1000; // 参考值为0.707r
- if(Mode == 1) // 实心圆
- {
- while(dy <= dx)
- {
- if(dx > ref)
- Glib_Line(x + ref + 1, y + dy, x + dx, y + dy, color);
- if(x >= ref + 1 && dx > ref)
- {
- if(x < dx)
- Temp = 0;
- else
- Temp = x - dx;
- Glib_Line(Temp, y + dy, x - ref - 1, y + dy, color);
- }
- if(y >= dy && dx > ref)
- Glib_Line(x + ref + 1, y - dy, x + dx, y - dy, color);
- if(x >= ref + 1 && y >= dy && dx > ref)
- {
- if(x < dx)
- Temp = 0;
- else
- Temp = x - dx;
- Glib_Line(Temp, y - dy, x - ref - 1, y - dy, color);
- }
- if(dy != dx || dx == ref)
- {
- if(y < dx)
- Temp = 0;
- else
- Temp = y - dx;
- Glib_Line(x + dy, Temp, x + dy, y + dx, color);
- }
- if(x >= dy && (dy != dx || dy == ref))
- {
- if(y < dx)
- Temp = 0;
- else
- Temp = y - dx;
- Glib_Line(x - dy, Temp, x - dy, y + dx, color);
- }
- dy++;
- if((r*r-dy*dy)<=(dx-1)*dx)
- dx--;
- }
- Glib_Line(x + ref + 1, y, x + r, y, color);
- if(x >= ref + 1)
- {
- if(x < r)
- Temp = 0;
- else
- Temp = x - r;
- Glib_Line(Temp, y, x - ref - 1, y, color);
- }
- if(y < r)
- Temp = 0;
- else
- Temp = y - r;
- Glib_Line(x, Temp, x, y + r, color);
- }
- else // 空心圆
- {
- while(dy <= dx)
- {
- PutPixel(x + dx, y + dy, color);
- PutPixel(x - dx, y + dy, color);
- PutPixel(x + dx, y - dy, color);
- PutPixel(x - dx, y - dy, color);
- if(dx != dy)
- {
- PutPixel(x + dy, y + dx, color);
- PutPixel(x + dy, y - dx, color);
- PutPixel(x - dy, y + dx, color);
- PutPixel(x - dy, y - dx, color);
- }
- dy++;
- if((r*r-dy*dy)<=(dx-1)*dx)
- dx--;
- }
- PutPixel(x + r, y, color);
- PutPixel(x - r, y, color);
- PutPixel(x, y + r, color);
- PutPixel(x, y - r, color);
- }
- }
- /**************************************************************
- *
- * LCD屏初始化
- *
- **************************************************************/
- void Lcd_TFT_Init(void)
- {
- Lcd_Init();
- Lcd_PowerEnable(0, 1);
- Lcd_EnvidOnOff(1); //turn on vedio
- Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x00) ); //565格式 纯黑色
- }
- void Main(void)
- {
- SelectFclk(2); //设置系统时钟 400M
- ChangeClockDivider(2, 1); //设置分频 1:4:8
- CalcBusClk(); //计算总线频率
- Lcd_TFT_Init();
- Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x0e) ) ; //背景整屏蓝屏
- Glib_Rectangle(10,10,150,150,(0x1f<<11) | (0x00<<5) | (0x00)); //空心正方形边为纯红
- Glib_FilledRectangle(20,20,100,100,(0x1f<<11) | (0x00<<5) | (0x1f) ); //品红正方形
- Glib_Line(155,5,280,160,(0x00<<11) | (0x00<<5) | (0x00)); //黑色直线
- Glib_FilledRectangle(5,180,150,240,(0x1f<<11) | (0x3f<<5) | (0x00) ); //黄色矩形
- TFT_Circle(360,180,80,(0x1f<<11) | (0x3f<<5) | (0x1f),0); //空心圆
- TFT_Circle(360,170,60,(0x1f<<11) | (0x00<<5) | (0x00),1); //纯红实心圆
- //Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x1f) ) ; //clear screen
- //Delay(1000);
- }
上一篇:S3C2440 AD转换器
下一篇:网上S3C2440驱动TFT屏资料
推荐阅读最新更新时间:2024-03-16 14:50
设计资源 培训 开发板 精华推荐
- 算力进化,向智而生: 英特尔为企业智能化发展注入新动力
- 世强硬创入选深圳软件产业扶持计划,赋能电子元器件产业链上下游
- 车规级UFS 4.0将变得愈发重要
- 英飞凌AURIX™ TC3x新增支持FreeRTOS
- 意法半导体推出 STM32WL33 低功耗、长距离无线微控制器,扩展专用生态系统
- 强化PSA安全生态,安谋科技为无处不在的物联网设备筑牢“安全”底座
- 尼得科旗下利莱森玛电机科技(福州)首台国产1E级发电机成功下线
- 艾迈斯欧司朗和弗劳恩霍夫研究团队凭借“数字之光”项目荣获“德国未来奖”
- 介绍一种基于规则的车载网络入侵检测技术
- 基于Nordic nRF54L系列的低功耗蓝牙模块助力下一代物联网应用性能升级