2014年(38)
分类: 嵌入式
2014-03-13 16:54:55
//LCD视频驱动编写
#include"2440addr.h"
#include "Phoenix_lib.h"
#define MVAL (13)
#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)
//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)
#define M5D(n) ((n) & 0x1fffff) // To get lower 21bits
volatile unsigned short LCD_BUFFER[SCR_YSIZE_TFT][SCR_XSIZE_TFT];
extern void delay(U32 time);
void PutPixel( int x,int y, int c )
{
if ( (x <480) && (y < 272) )
LCD_BUFFER[(y)][(x)] = c;
}
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;
}
}
}
}
}
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);
}
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);
}
void Paint_Bmp(int x0,int y0,int h,int l,const unsigned char *bmp)
{
int x,y;
int 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) < 480) && ( (y0+y) <272) )
LCD_BUFFER[y0+y][x0+x] = c ;
p = p + 2 ;
}
}
}
//视频输出使能函数
void LCDVideoOnOff(int onoff)
{
if(onoff==1)
{
rLCDCON1|=1;//ENVID=ON;控制信号输出使能
}
else
{
rLCDCON1&=0x3ffffffe;//disable video output
}
}
//GPIO管脚初始化
void GPIOInit()
{
rGPCUP=0x0;//上拉
rGPCCON=0xaaaa02a9;
rGPDUP=0x0;
rGPDCON=0xaaaaaaaa;
rGPGUP=0x7ff;
rGPGCON|=(3<<8);//LCD POWER Enable
}
//LCD寄存器初始化
void LCDRegisterInit()
{
rLCDCON1=(4<<8)|(3<<5)|(0x0b<<1)|0;
rLCDCON2=(2<<24)|((272-1)<<14)|(4<<6)|8;
rLCDCON3=(10<<19)|((480-1)<<8)|19;
rLCDCON4=(13<<8)|30;
rLCDCON5=(1<<11)|(0<<10)|(1<<9)|(1<<8)|(0<<7)| (0<<6)| (1<<3)|0<<1|1;
rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1);
rLCDSADDR2=M5D( ((U32)LCD_BUFFER+(SCR_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1);
rLCDSADDR3=(((SCR_XSIZE_TFT-LCD_XSIZE_TFT)/1)<<11)|(LCD_XSIZE_TFT/1);
rLCDINTMSK|=(3); // MASK LCD Sub Interrupt
rTCONSEL &= (~7) ; // Disable LPC3480
rTPAL=0; // Disable Temp Palette
}
void LCDInit()
{
GPIOInit();
LCDRegisterInit();
}
void Main()
{
LCDInit();//对LCD进行初始化配置
LCDVideoOnOff(1);// ENVID=ON;控制信号输出使能
while(1)
{
rTPAL=(1<<24)|(250<<16);//display RED,满屏红
delay(999999);
rTPAL=(1<<24)|(250<<8);//display GREEN
delay(999999);
rTPAL=(1<<24)|(250);//display BLUE
delay(999999);
rTPAL=(0<<24);// Disable Temp Palette
}
}