微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2440的LCD简单应用与实现

S3C2440的LCD简单应用与实现

时间:11-11 来源:互联网 点击:

LCDBASEU[21:0]对应帧内存起始地址A[21:1]。

在LCDSADDR2中,用来保存帧缓存区结束地址A[21:1]。LCDBASEL等于LCD_BUFFER+(240*320*4)的结果的21位到1位的数据值。

在LCDSADDR3中,OFFSIZE用于虚拟屏幕偏移长度,不用可以设置为0;PAGEWIDTH用于定义视口宽度,以半字为单位。因此我们定义PAGEWIDTH=320*32/16。

现在我们来看一段代码分析:

#inlcude "2440addr.h"
#define U32 unsigned int

#define M5D(n) ((n) & 0x1fffff) /*用于设置显示缓存区时,取低21位地址*/

#define LCD_WIDTH 320 /*屏幕的宽*/

#define LCD_HEIGHT 240 /*屏幕的高*/

/*垂直同步信号的脉宽、后肩和前肩*/

#define VSPW (3-1)

#define VBPD (15-1)

#define VFPD (12-1)

/*水平同步信号的脉宽、后肩和前肩*/

#define HSPW (30-1)

#define HBPD (38-1)

#define HFPD (20-1)

/*显示尺寸*/

#define LINEVAL (LCD_HEIGHT-1)

#define HOZVAL (LCD_WIDTH-1)

/*for LCDCON1*/

#define CLKVAL_TFT 6 /*设置时钟信号*/

#define MVAL_USED 0

#define PNRMODE_TFT 3 /*TFT型LCD*/

#define BPPMODE_TFT 13 /*24位TFT型LCD 24BPP*/

/*for LCDCON5*/

#define BPP24BL 0 /*32位数据表示24位颜色值时,低位数据有效,高8位无效*/

#define INVVCLK 0/*像素值在VCLK下降沿有效*/

#define INVVLINE 1/*翻转HSYNC信号*/

#define INVVFRAME 1/*翻转VSYNC信号*/

#define INVVD 0 /*正常VD信号极性*/

#define INVVDEN 0/*正常VDEN信号极性*/

#define PWREN 1 /*使能PWREN信号*/

#define BSWP0 /*颜色数据字节不交换*/

#define HWSWP 0 /*颜色数据半字不交换*/

/*定义显示缓存区*/

volatile U32 LCD_BUFFER[LCD_HEIGHT][LCD_WIDTH];

extern unsigned char gImage_xiaogou[];

/*延时程序*/

void delay(int a)

{

int k;
for(k=0;k

}

/*绘制屏幕背景颜色,颜色为c*/

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;

}
}

}

/*画实心圆,颜色为c。圆心在屏幕中心,半径为80个像素*/

void Draw_Circular(U32 c)

{

int x,y ;

int tempX,tempY;

int radius = 80;

int SquareOfR = radius*radius;

for( y = 0 ; y < LCD_HEIGHT ; y++ )/*将屏幕分成四个区域*/

{

for( x = 0 ; x < LCD_WIDTH ; x++ )

{

if(y<=120 && x<=160)

{

tempY=120-y;

tempX=160-x;

}

else if(y<=120&& x>=160)

{

tempY=120-y;

tempX=x-160;

}

else if(y>=120&& x<=160)

{

tempY=y-120;

tempX=160-x;

}

else

{

tempY = y-120;

tempX = x-160;

}

/*x2+y2与r2比较,画圆,因为π(x2+y2)=πr2(圆),两边比较时把π约掉,进行比较*/

if ((tempY*tempY+tempX*tempX)<=SquareOfR)

LCD_BUFFER[y][x] = c ;

}

}

}

void Main(void)

{

/*配置LCD相关引脚*/

rGPCUP = 0x00000000;

rGPCCON = 0xaaaa02a9;

rGPDUP = 0x00000000;

rGPDCON=0xaaaaaaaa;

/*设置LCD的类型、像素时钟、设置像素位数、使能LCD信号的输出。*/

rLCDCON1=(CLKVAL_TFT<8)|(MVAL_USED<7)|(PNRMODE_TFT<5)|(BPPMODE_TFT<1)|0;

/*这个非常重要。设置垂直方向各信号时间参数。*/

rLCDCON2=(VBPD<24)|(LINEVAL<14)|(VFPD<6)|(VSPW);

rLCDCON3=(HBPD<19)|(HOZVAL<8)|(HFPD);/*设置水平方向各信号的时间参数*/

rLCDCON4=(HSPW); /*设置HSYNC信号脉冲宽度*/

rLCDCON5 = (BPP24BL<12) | (INVVCLK<10) | (INVVLINE<9) | (INVVFRAME<8) | (0<7) | (INVVDEN<6) | (PWREN<3) |(BSWP<1) | (HWSWP);

/*******************************************************************************************/

rLCDSADDR1=(((U32)LCD_BUFFER>>22)<21)|M5D((U32)LCD_BUFFER>>1);

rLCDSADDR2=M5D( ((U32)LCD_BUFFER+(LCD_WIDTH*LCD_HEIGHT*4))>>1 );

rLCDSADDR3=LCD_WIDTH*32/16;
/*在s3c2440中,寄存器LCDSADDR1和LCDSADDR2用于设置显示缓存区,即把我们定义的那个二维数组告诉s3c2440。其中LCDBANK的9位数据指定LCD的BANK,即显示缓存区的第30位到第22位地址;LCDBASEU的21位数据指定了LCD的基址,即显示缓存区开始地址的第21位到第1位;LCDBASEL的21位数据指定了LCD的尾址,即显示缓存区结束地址的第21位到第1位。例如,我们想要在尺寸为320&times;240的屏幕上显示24位颜色,定义的显示缓存区数组为LCD_BUFFER[240][320],则LCDBANK等于LCD_BUFFER的第30位到第22位数据值(因为LCD_BUFFER表示的就是数组的首地址),LCDBASEU等于LCD_BUFFER的第21位到第1位数据值,由于是用32位数据表示24为颜色,因此每个像素值是4个字节,所以LCDBASEL等于(LCD_BUFFER+(240&times;320&times;4))结果的第21位到第1位的数据值。另外寄存器LCDSADDR3有两个内容:OFFSIZE和PAGEWIDTH。OFFSIZE用于虚拟屏幕的偏移长度,如果我们不使用虚拟屏幕,就把它置为0;PAGEWIDTH定义了视口的宽,单位是半字,如在上面的例子中,PAGEWIDTH应该为320&times

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top