牛骨文教育服务平台(让学习变的简单)

参数配置:

开发板型号TX2440;  一个像素点采用16位表示; LCD屏幕分辨率 480*272; 液晶模块型号:BL43014_SPEC;图像的内容以C语言数组的形式保存在bmp.c文件中。

/*
*版权所有(C)2015,ZJU
*
*文件名称:lcd.c
*内容摘要:关于lcd的配置
*其它说明:开发板型号:	TX2440
*	   led显示尺寸 480 x 272
	   液晶模块型号:BL43014_SPEC
*当前版本:V1.0
*作    者:Frank	
*完成日期:2015.12.20
*
*/

#define  GPCCON		(*(volatile unsigned long *)0x56000020)
#define  GPDCON		(*(volatile unsigned long *)0x56000030)
#define  GPGCON		(*(volatile unsigned long *)0x56000060)

//LCD控制寄存器定义
#define  LCDCON1	(*(volatile unsigned long *)0x4D000000) 
#define  LCDCON2	(*(volatile unsigned long *)0x4D000004)
#define  LCDCON3	(*(volatile unsigned long *)0x4D000008)
#define  LCDCON4	(*(volatile unsigned long *)0x4D00000C)
#define  LCDCON5	(*(volatile unsigned long *)0x4D000010)
#define  LCDSADDR1	(*(volatile unsigned long *)0x4D000014)
#define  LCDSADDR2	(*(volatile unsigned long *)0x4D000018)
#define  LCDSADDR3	(*(volatile unsigned long *)0x4D00001C)
#define  TPAL		(*(volatile unsigned long *)0x4D000050)

/*以下宏定义的值参考所使用的LCD液晶模块的芯片手册*/
#define  VSPW	9
#define  VBPD	7
#define  LINEVAL 271
#define  VFPD	7
#define	 CLKVAL	4	// 10 = 100 / ((CLKVAL+1)*2)
#define  HSPW	40
#define  HBPD	39
#define  HOZVAL	479
#define  HFPD	4

unsigned short LCDBUFFER[272][480];	//定义一个LCD图像缓存空间
extern unsigned char bmp[90200];

typedef unsigned char U8;
typedef unsigned short int U16;
typedef unsigned int U32;

/*******************************************************************
*函数名称:Lcd_Port_Init()
*功能描述:LCD端口初始化
*其他说明:配置LCD用到的GPIO端口
*创建日期:2015.12.20
*******************************************************************/
void Lcd_Port_Init(void)
{
	GPDCON = 0xaaaaaaaa;
	GPCCON = 0xaaaaaaaa;
}

/*******************************************************************
*函数名称:Lcd_Control_Init()
*功能描述:LCD控制寄存器初始化
*其他说明:配置LCD用到的控制寄存器
*创建日期:2015.12.20
*******************************************************************/
void Lcd_Control_Init(void)
{
	LCDCON1 = (CLKVAL << 8) | (0x3 << 5) | (0xC << 1) | (0 << 0);
	LCDCON2 = (VBPD << 24) | (LINEVAL << 14) | (VFPD << 6) | (VSPW);
	LCDCON3 = (HBPD << 19) | (HOZVAL << 8) | (HFPD);
	LCDCON4 = HSPW;
//	LCDCON5 = (1 << 11) | (1 << 9) | (1 << 8) | (1 << 0);
	LCDCON5 = (1 << 11) | (1 << 9) | (1 << 8);
	
	LCDSADDR1 = (((unsigned int)LCDBUFFER >> 22) << 21) | (((unsigned int)LCDBUFFER >> 1) & 0x1fffff);
	LCDSADDR2 = (((unsigned int)LCDBUFFER + 272*480*2) >> 1) & 0x1fffff;
	LCDSADDR3 = (0 << 11) | (480*2 / 2);
	
	TPAL = 0;
	
}

/*******************************************************************
*函数名称:Lcd_Init()
*功能描述:LCD初始化
*其他说明:
*创建日期:2015.12.20
*******************************************************************/
void Lcd_Init()
{
	Lcd_Port_Init();
	Lcd_Control_Init();
	
	/*打开LCD电源*/
	GPGCON |= (0x3 << 8);
	LCDCON5 |= (1 << 3);
	
	/*使能LCD控制器*/
	LCDCON1 |= 1;
		
}

/*******************************************************************
*函数名称:point()
*功能描述:在lcd上画一个点
*其他说明:
*创建日期:2015.12.20
*******************************************************************/
void Point(unsigned int x, unsigned int y, unsigned int color)
{
	unsigned int red, green, blue;
	
	red = (color >> 19) & 0x1f;
	green = (color >> 10) & 0x3f;
	blue = (color >> 3) & 0x1f;
	
	/*采用5:6:5的模式表示一个RGB*/
	LCDBUFFER[y][x] = (unsigned short)((red << 11) | (green << 5) | blue);
	
}

/*******************************************************************
*函数名称:Paint_Bmp(U16,U16,U16,U16,U8)
*功能描述:LCD显示一幅图像
*输入参数:(x0,y0)图像显示第一个点的坐标; high图像的高度
	   wide图像的宽度; bmp存储图像的数组 
*其他说明:
*创建日期:2015.12.20
*******************************************************************/
void Paint_Bmp(U16 x0, U16 y0, U16 wide, U16 high, const U8 *bmp)
{
	unsigned short x, y;
	unsigned short c;
	unsigned int p = 0;
	
	for (y=y0; y<y0+high; y++)
	{
		for (x=x0; x<x0+wide; x++)
		{
			c = bmp[p] | (bmp[p+1]<<8);   /*一个像素点由16位表示,bmp[p]
						      表示低8位,bmp[p+1]表示高8位*/
			if ((x<480) && (y<272))
			{
				LCDBUFFER[y][x] = c;	
			}
			
			p = p + 2;
		}
	}	
}

/*******************************************************************
*函数名称:Lcd_Test()
*功能描述:LCD测试函数
*其他说明:
*创建日期:2015.12.20
*******************************************************************/
void Lcd_Test(void)
{
	int x;
	
/*	for (x=0; x<480; ++x)
	{
		Point(x++, 150, 0xff0000);	
	}	
*/	
	Paint_Bmp(0,0,220,220,bmp);
}

需要注意的几点:

1、宏定义的值需要参考使用的LCD液晶模块的芯片手册(TX2440使用的LCD是BL43014_SPEC)

图1 BL43014_SPEC Input Time Table

2、液晶模块的Vsync和Hsync的时序与S3C2440芯片手册上的相反,所以LCDCON5中bit8和bit9需要设置为1。

图2 BL43014_SPEC Vertical Input Timing

图3 TFT LCD Timing Example( S3C2440 Datasheet)