S3C2440之液晶屏LCD驱动

作为一款高端的CPU S3C2440(2013年的时候),自带LCD液晶屏的UI接口,

也就是外设,只需要对照对应的LCD手册设置寄存器即可

所用LCD是一款16BPP的320(宽)X240(高)的LCD显示屏

/******************************
*文件名:LCD.c				  *
*功能:   液晶显示程序		  *
*创建者: 潘星宇				  *
*最后修改:2013.02.27		  *
*备注:						  *
*							  *
*******************************/

#include "LCD.h"

#if  !BPP24
#define BPPMODE_TFT   12     //16位TFT型LCD
#else
#define BPPMODE_TFT   13     //24位TFT型LCD
#endif

#if  !BPP24
#define HWSWP          1     //颜色数据半字交换
#else
#define HWSWP          0     //颜色数据半字不交换
#endif
//定义显示缓存区		320           240
//24BPP时应该为	 U32LCD_BUFFER[LCD_HEIGHT][LCD_WIDTH];
volatile U16 LCD_BUFFER[LCD_HEIGHT][LCD_WIDTH];	

/**************************************************************************
***** 函数名:  LCD_Init(void)
***** 功能:	LCD初始化
***** 参数:    无
***** 返回值:	无
***** 创建者:	潘星宇
***** 创建时间: 2013-03-7
***** 最后更新:2013-03-7
****************************************************************************/
void LCD_Init(void)
{
	rGPCUP  = 0x00000000;
	rGPCCON = 0xaaaa02aa;	//0x1010
	rGPDUP  = 0x00000000;
	rGPDCON=0xaaaaaaaa; //Initialize VD[15:8]
	rLCDCON1=rLCDCON1|((CLKVAL_TFT<<8)|(MVAL_USED<<7)|(PNRMODE_TFT<<5)|(BPPMODE_TFT<<1)|0);	//1100
	rLCDCON2=(VBPD<<24)|(LINEVAL<<14)|(VFPD<<6)|(VSPW);
	rLCDCON3=(HBPD<<19)|(HOZVAL<<8)|(HFPD);
	rLCDCON4=(HSPW);
	rLCDCON5 = (1<<11) |(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);

	//24BPP时应该是M5D( ((U32)LCD_BUFFER+(LCD_WIDTH*LCD_HEIGHT*4))>>1 );
	rLCDSADDR2=M5D( ((U32)LCD_BUFFER+(LCD_WIDTH*LCD_HEIGHT*2))>>1 );

	rLCDSADDR3=LCD_WIDTH*2/2;		   //24BPP时候应该是 LCD_WIDTH*4/2

	rLCDINTMSK|=(3);                   // MASK LCD Sub Interrupt
	rTCONSEL = 0;                      // Disable LPC3480
	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电源脉冲信号不反转
	rLCDCON1|=1;                         //开启LCD显示
}

/**************************************************************************
***** 函数名:  PutPixel(void)
***** 功能:	绘制像素点
***** 参数:    x:横坐标 y:纵坐标 c颜色
***** 返回值:	无
***** 创建者:	
***** 创建时间: 2011-03-30
***** 最后更新:2011-03-30	int
****************************************************************************/
void PutPixel(U32 x,U32 y, U32 c )
{
	LCD_BUFFER[y][x] = c;
}

/**************************************************************************
***** 函数名:  Draw_Text16(void)
***** 功能:绘制宽X高大小为16×16的中文字符
***** 参数:    x:横坐标 y:纵坐标 c颜色  	  ch:字模数组
***** 返回值:	无
***** 创建者:	
***** 创建时间: 2011-03-30
***** 最后更新:2011-03-30
****************************************************************************/
void Draw_Text16(U32 x,U32 y,U32 color,U32 backColor,const unsigned char ch[])
{ 
	unsigned short int i,j;
	unsigned char mask,buffer;

	for (i=0;i<16;i++)
	{
	    /*汉字的左半边*/
		mask=0x80;           //掩码	0b1000 0000>>1---0b0000 1000
		buffer=ch[i*2];      //提取一行的第一个字节0x08=0b0000 1000
		for (j=0;j<8;j++)
		{
			if (buffer&mask)
			{
				PutPixel(x+j,y+i,color); //为笔画上色
			}
			else
			{
				PutPixel(x+j,y+i,backColor); //背景色
			}
			mask=mask>>1;				  //为判断下一位准备
		}

		/*汉字的右半边*/
		mask=0x80;                       //掩码,从bit7开始判断
		buffer=ch[i*2+1];                //提取一行的第二个字节
		for (j=0;j<8;j++)
		{
			if (buffer&mask)
			{
				PutPixel(x+j+8,y+i,color); //为笔画上色
			}
            else
			{
				PutPixel(x+j+8,y+i,backColor);//背景色
			}
			mask=mask>>1;				   //为判断下一位准备
		}
	}
}

/**************************************************************************
***** 函数名:  Draw_ASCII16x24(void)
***** 功能:绘制宽X高大小为16×24的字符
***** 参数:    x:横坐标 y:纵坐标 c颜色  	  ch:字模数组
***** 返回值:	无
***** 创建者:	
***** 创建时间: 2013-03-22
***** 最后更新:2013-03-22
****************************************************************************/
void Draw_ASCII16x24(U32 x,U32 y,U32 color,U32 backColor,const unsigned char ch[])
{ 
	unsigned short int i,j;
	unsigned char mask,buffer;

	for (i=0;i<24;i++)
	{
	    /*字符的左半边*/
		mask=0x80;           //掩码	0b1000 0000>>1---0b0000 1000
		buffer=ch[i*2];      //提取一行的第一个字节0x08=0b0000 1000
		for (j=0;j<8;j++)
		{
			if (buffer&mask)
			{
				PutPixel(x+j,y+i,color); //为笔画上色
			}
			else
			{
				PutPixel(x+j,y+i,backColor); //背景色
			}
			mask=mask>>1;				  //为判断下一位准备
		}

		/*字符的右半边*/
		mask=0x80;                       //掩码,从bit7开始判断
		buffer=ch[i*2+1];                //提取一行的第二个字节
		for (j=0;j<8;j++)
		{
			if (buffer&mask)
			{
				PutPixel(x+j+8,y+i,color); //为笔画上色
			}
            else
			{
				PutPixel(x+j+8,y+i,backColor);//背景色
			}
			mask=mask>>1;				   //为判断下一位准备
		}
	}
}

/**************************************************************************
***** 函数名:  Draw_ASCII(void)
***** 功能:绘制宽X高大小为8×16的字符
***** 参数:    x:横坐标   y:纵坐标     color文字颜色  
   	            backColor  文字背景颜色  ch
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值