LCD测试成功

500阅读 0评论2015-04-15 yuncmt
分类:嵌入式

 
注意:
1.LCD_BUFFER  数组必须为 unsigned short  类型   原因是 16位表示一个像素 
 
  半字形式
 
2.LCD电源断口要打开,电源要使能
3.VFBD 。。。。等一系列参数 只是调节其 上下间距的
 
4.视频输出要打开  即  rLCDCON1  |=  0x1 ;
 
5.GPXCON这样的寄存器 似乎不用配置
 
6.能显示16×16的汉字
 
 
 
 
#include "2440addr.h"
#include "2440lib.h"
extern const unsigned char sunflower_240x320[];

#define M5D(n) ((n) & 0x1fffff) // To get lower 21bits

#define LCD_WIDTH 240
#define LCD_HEIGHT 320

#define SCR_XSIZE  LCD_WIDTH
#define SCR_YSIZE  LCD_HEIGHT
 
#define VSPW (3-1)    //垂直同步脉冲的宽度
#define VBPD (15-1)   //在一帧图像开始时,垂直同步信号以后的无效的行数
#define VFPD (12-1)
#define HSPW (30-1)   //水平同步信号的宽度
#define HBPD (38-1)   //从水平同步信号开始到一行的有效数据开始之间的VCLK的个数
#define HFPD (20-1)   //一行的有效数据结束到下一个水平同步信号开始之间的VCLK的个数

#define LINEVAL (LCD_HEIGHT-1)
#define HOZVAL (LCD_WIDTH-1)
//for LCDCON1
#define CLKVAL_TFT 6
#define MVAL_USED 0
#define PNRMODE_TFT 3
#define BPPMODE_TFT 13
//for LCDCON5
#define BPP24BL 0
#define INVVCLK 0
#define INVVLINE 1
#define INVVFRAME 1
#define INVVD 0
#define INVVDEN 0
#define PWREN 1
#define BSWP 0
#define HWSWP 0

volatile static unsigned short LCD_BUFFER[LCD_HEIGHT][LCD_WIDTH]; //此处很关键   必须是 unsigned short 类型   我之前用unsigned int (U32) 出错
void Brush_Background( U32 c)
{
  int x,y ;

  for( y = 0 ; y < LCD_HEIGHT ; y++ )
 {
  
  
   for( x = 0 ; x < LCD_WIDTH ; x++ )
 
   {
   
    
    
    LCD_BUFFER[y][x] = c ;
   
   
   }
 
 
 }
}
//绘制像素点
void PutPixel(U32 x,U32 y, U32 c )
{
 
 LCD_BUFFER[y][x] = c;
}
 
//init_lcd
void LCD_Init()
{
  //rGPCUP = 0xffffffff;
  //rGPCCON = 0xaaaaaaaa;
  //rGPDUP = 0xffffffff;
  //rGPDCON=0xaaaaaaaa; //Initialize VD[15:8]   //似乎不配置管教   也能成功显示
  
  rLCDCON1 = (2<<8) |(3<<5)|(12<<1);
  
  //rLCDCON1=(CLKVAL_TFT<<8)|(MVAL_USED<<7)|(PNRMODE_TFT<<5) |(BPPMODE_TFT<<1)|0;
  //   CLKVAL_TFT = 6   MVAL_USED = 0    PNRMODE_TFT = 3   BPPMODE_TFT = 13
  
  
  rLCDCON2 = (20<<24) | ((320-1) << 14 ) | (4<<6) | (1<<0);
  //rLCDCON2=(VBPD<<24)|(LINEVAL<<14)|(VFPD<<6)|(VSPW);
  //  VBPD = 15-1      LINEVAL =  (LCD_HEIGHT-1)   VFPD = 12-1   VSPW = 3-1
  
  rLCDCON3 = (25<<19) | ((240 - 1 ) <<8) | (0<<0);
  //rLCDCON3=(HBPD<<19)|(HOZVAL<<8)|(HFPD);
  //  HBPD = 38-1   HOZVAL = (LCD_WIDTH-1)   HFPD =  20-1
  
  rLCDCON4  =  (13<<8) | (4<<0);
  //rLCDCON4=(HSPW);
  //  HSPW  = 30-1
  
  //rLCDCON5  =  ((1<<11) | (1 << 9) | (1 << 8) | (1 << 3) | (1 << 0));
  
  rLCDCON5   =  ( (1 << 11)| (1<<0) | (1 << 8) | (1 << 6) | (1 << 9) | ( 1<< 10)) ;
  //rLCDCON5 = (BPP24BL<<12) | (INVVCLK<<10) | (INVVLINE<<9) | (INVVFRAME<<8) | (0<<7) | (INVVDEN<<6) | (PWREN<<3) |(BSWP<<1) | (HWSWP);
  // BPP24BL = 0    INVVCLK  = 0    INVVLINE  = 1   INVVFRAME  =1    INVVDEN  =  0   PWREN   = 1    BSWP  = 0   HWSWP  =  0
  
  
  
  rLCDSADDR1=(((U32)LCD_BUFFER>>22)  <<  21)| M5D((U32)LCD_BUFFER>>1) ;
  //
  
  
  rLCDSADDR2=M5D( ((U32)LCD_BUFFER+(LCD_WIDTH*LCD_HEIGHT*2))>>1 );
  
  
  rLCDSADDR3 =  LCD_WIDTH;
  
  
  
  rLCDINTMSK|=(3); // MASK LCD Sub Interrupt
  
  rTCONSEL &= (~7) ; // Disable LPC3480
  
  
  rTPAL     = 0x0;
        rTCONSEL &= ~((1<<4) | 1);
  
  
  
  
  
}
 
static void Lcd_PowerEnable(void)
{

 rGPGUP=rGPGUP&(~(1<<4))|(1<<4); // Pull-up disable
 rGPGCON=rGPGCON&(~(3<<8))|(3<<8); //GPG4=LCD_PWREN
  
  
 rGPGDAT = rGPGDAT | (1<<4) ; //输出高电平
  
  
 rLCDCON5=rLCDCON5&(~(1<<3))|(1<<3); // PWREN
  
 rLCDCON5=rLCDCON5&(~(1<<5))|(0<<5); // INVPWREN
  
 
}
/**************************************************************
 TFT LCD全屏填充特定颜色单元或清屏
**************************************************************/
static void Lcd_ClearScr( U16 c)
{
 unsigned int x,y ;
  
    for( y = 0 ; y < SCR_YSIZE ; y++ )
    {
     for( x = 0 ; x < SCR_XSIZE ; x++ )
     {
   LCD_BUFFER[y][x] = c ;
     }
    }
}

/**************************************************************
在LCD屏幕上指定坐标点画一个指定大小的图片
**************************************************************/
static void Paint_Bmp(int x0,int y0,int h,int l,const unsigned char *bmp)
{
 int x,y;
 U32 c;
 int p = 0;
 
    for( y = 0 ; y < l ; y++ )
    {
     for( x = 0 ; x < h ; x++ )
     {
      c = bmp[p+1] | (bmp[p]<<8) ;
   if ( ( (x0+x) < SCR_XSIZE) && ( (y0+y) < SCR_YSIZE) )
    LCD_BUFFER[y0+y][x0+x] = c ;
      p = p + 2 ;
     }
    }
}
static void Lcd_EnvidOnoff(void)
{

 rLCDCON1|=1;
}

const U8 zhao[] =
{
     0x04,0x80,0x0E,0xA0,0x78,0x90,0x08,0x90,
      0x08,0x84,0xFF,0xFE,0x08,0x80,0x08,0x90,
      0x0A,0x90,0x0C,0x60,0x18,0x40,0x68,0xA0,
      0x09,0x20,0x0A,0x14,0x28,0x14,0x10,0x0C
} ;
//绘制大小为16×16的中文字符
void Draw_Text16(U32 x,U32 y,U32 color,const unsigned char ch[])
{
 unsigned short int i,j;
 unsigned char mask,buffer;
 for(i=0;i<16;i++)
 {
   mask=0x80; //掩码
   buffer=ch[i*2]; //提取一行的第一个字节
   
   for(j=0;j<8;j++)
   {
        if(buffer&mask)
        {
       
           PutPixel(x+j,y+i,color); //为笔画上色
       }
    
            mask=mask>>1;
       
       }
 
           mask=0x80; //掩码
           buffer=ch[i*2+1]; //提取一行的第二个字节
      
      
          for(j=0;j<8;j++)
         {
                if(buffer&mask)
              {
         
                PutPixel(x+j+8,y+i,color); //为笔画上色
         
         
             }
       
       
              mask=mask>>1;
     
     
      }
 

   }

}
 

void xmain(void)
{
 ChangeClockDivider(2,1);
 ChangeMPllValue(127,2,1);  //405MHZ
 
 Isr_Init();
 Uart_Init(0, 115200);
 Uart_Select(0);
 Uart_Printf("the main is running ");
 
    LCD_Init();
    Lcd_PowerEnable();
    Lcd_EnvidOnoff();
    Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x00) ); 
   
   // Lcd_ClearScr(0x001f); //蓝色
   // Lcd_ClearScr(0xf800); // 红色
   // Lcd_ClearScr(0x7e00); // 绿
   
    Draw_Text16(50,100,0x001f,zhao);
   
   // Paint_Bmp(50, , 8, 16, zhao);
    Paint_Bmp(0, 0, 240, 320, sunflower_240x320);
    while (1) ;
 
 
 
}
上一篇:IIS的介绍和配置
下一篇:DMA传输 从 字符数组到串口