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