Chinaunix首页 | 论坛 | 博客
  • 博客访问: 65060
  • 博文数量: 38
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 138
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-26 16:24
文章分类

全部博文(38)

文章存档

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
 }
}

阅读(552) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~