×
单片机 > 单片机程序设计 > 详情

S3C2440 LCD液晶模块驱动设计

发布时间:2024-05-01 发布时间:
|

参数配置:


开发板型号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

{

for (x=x0; 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)


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计