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:字模数组
***** 返回值:	无
***** 创建者:	
***** 创建时间: 2011-03-30
***** 最后更新:2011-03-30
****************************************************************************/
void Draw_ASCII(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;				   //掩码,从bit7开始判断
		buffer=ch[i];			   //提取一行的第一个字节
		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;				//为判断下一位准备
		}
	}
}

/**************************************************************************
***** 函数名:  Draw_ASCII_N(void)
***** 功能:    绘制大小为16×8,16x16的字符串
***** 参数:    x:横坐标   y:纵坐标     color文字颜色  
   	            backColor  文字背景颜色  ch:字模数组
***** 返回值:	无
***** 创建者:	
***** 创建时间: 2011-03-30
***** 最后更新:2011-03-30
****************************************************************************/
void Draw_Text_8_16(U32 x,U32 y,U32 color,U32 backColor,const unsigned char *chs)
{ 
	U32 i=0;
	while (*chs != '\0')
	{
		if (*chs > 0xa0)				//汉字内码都是大于0xa0
		{
			for (i=0 ;i < GB16_NUM();i++)
			{	if(x>LCD_WIDTH-16){x=0;y=y+16;}
				if ((*chs == hz_index[i]) && (*(chs+1) == hz_index[i+1]))
				{
					Draw_Text16(x,y,color,backColor,&hz[16*(i)]);
					x +=16;
					break;
				}
			}
			chs+=2;
		}

		else	 //如果是字符执行以下
		{	if(x>LCD_WIDTH-8){x=0;y=y+16;}
			for (i=0 ;i < ASCII_NUM();i++)
			{
				if (*chs == zf_index[i])
				{
					Draw_ASCII(x,y,color,backColor,&zf[16*i]);
					x += 8;
					break;
				}
			}
			chs++;
		}	 
	}
}

/**************************************************************************
***** 函数名:  Draw_Text56(void)
***** 功能:绘制大小为56×56的中文字符
***** 参数:    x:横坐标 y:纵坐标 c颜色  	  ch:字模数组
***** 返回值:	无
***** 创建者:	潘星宇
***** 创建时间: 2012-12-16
***** 最后更新:2012-12-16
****************************************************************************/
//Draw_Text16(50,10,0x0,0xf800,xin);
void Draw_Text56(U32 x,U32 y,U32 color,U32 backColor,const unsigned char ch[])
{ 
	unsigned long int i,j;
	unsigned char mask,buffer;

	for (i=0;i<56;i++)
	{
	    /*汉字的第一部分*/
		mask=0x80;           //掩码	0b1000 0000>>1---0b0000 1000
		buffer=ch[i*7];      //提取一行的第一个字节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*7+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;				   //为判断下一位准备
		}

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

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

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

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

/**************************************************************************
***** 函数名:  Draw_ASCII_N(void)
***** 功能:    绘制N个大小为16×8的字符
***** 参数:    x:横坐标 y:纵坐标 color颜色  	  ch:字符串
***** 返回值:	无
***** 创建者:	
***** 创建时间: 2011-03-30
***** 最后更新:2011-03-30
****************************************************************************/
void Draw_ASCII_N(U32 x,U32 y,U32 color,U32 backColor,const unsigned char *chs)
{
	U32 i=0;
	while (*chs!= '\0')
	{
		for ( ;i < ASCII_NUM();i++)
		{
			if (*chs==zf_index[i])
			{
				Draw_ASCII(x,y+8,color,backColor,&zf[16*i]);
				break;
			}
		}
	}
}

/**************************************************************************
***** 函数名:   Brush_Background()
***** 功能:     绘制屏幕背景颜色,颜色为c
***** 参数:     c 颜色
***** 返回值:	 无
***** 创建者:    
***** 创建时间: 2011-03-30
***** 最后更新:  2011-03-30
****************************************************************************/
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 ;
		}
	}
}

/**************************************************************************
***** 函数名:  one_point_to_another(unsigned int x1, unsigned int y1,
								     unsigned int length, double angle, 
									 unsigned int color, unsigned int length_start,
									 unsigned int length_end)
***** 功能:    由一点,长度和角度做线
***** 参数:    已知点坐标x1,y1;长度length,角度angle,颜色color;起始点和结束点;
				角度按照钟表原则,0点为0°,顺时针旋转,
				函数内部将角度按照象限的原则转化,第一象限为0°的开始。
				length_start_points:希望保留起始的点的个数
				length_end_points:希望保留最后的点的个数
***** 返回值:  无
***** 创建者:   潘星宇
***** 创建时间:2012-12-25
***** 最后更新: 2012-12-28
****************************************************************************/
void one_point_to_another(unsigned int x1, 				    //已知点横坐标x1
						  unsigned int y1,				    //已知点纵坐标y1
					      unsigned int length, 			    //两点间距长度
						  float angle, 					    //两点角度,按照钟表原则,0点为0°,顺时针旋转
					      unsigned int color, 			    //颜色
						  unsigned int length_start_points,	//希望保留起始的点的个数
					      unsigned int length_end_points)	//希望保留最后的点的个数
{
	unsigned int x2;			    //画线用横坐标寄存器
	unsigned int y2;			    //画线用纵坐标寄存器
	unsigned int length_i;		    //画线计数用
	unsigned int length_end_i = 0;	//画线取最后几个点计数用
	float radian;					//弧度
    if ((angle >= 0) && (angle <= 90))
    {
	    angle = 90 - angle;
    }
    else if ((angle >= 91) && (angle <= 180))
    {
		angle = 360 - (angle - 90);
    }
    else if ((angle >= 181) && (angle <=270))
    {
		angle = 270 - (angle - 180); 
    }
    else if ((angle >= 271) && (angle <=359))
    {
		angle = 180 - (angle - 270); 
    }
	
	radian = (angle / 180)*PIN; 			//角度与弧度的转换
	
	if (length_start_points >= length)		//如果希望保留前面的点超出了线的长度
	{
		length_start_points = length;	
	}

	if (length_end_points >= length)		    //如果希望保留后面的点超出了线的长度
	{
		length_end_points = length;	
	}

	for (length_i = 0; length_i <= length; length_i++)
	{
		
		if ((length_start_points > 0) || (length_end_i >= (length - length_end_points))) //希望保留起始点的个数
		{
			x2 = (unsigned int)(x1 + length_i*cos(radian) + 0.5); //加0.5为了防止大于5的小数被舍去
    		y2 = (unsigned int)(y1 - length_i*sin(radian) + 0.5); //由于液晶屏的坐标Y轴向下坐标大,与象限刚好相反,故在此是减去
			PutPixel(x2,y2,color);
			if (length_start_points > 0) //防止自减运算溢出,变成最大值
			{
				length_start_points--;
			}
		}
	   	length_end_i++;
	}
}

/**************************************************************************
***** 函数名:  draw_circle(unsigned int x1, unsigned int y1,
						    unsigned int radius,unsigned int color)
***** 功能:    画一个圆
***** 参数:    已知点坐标x1,y1;半径radius,颜色color;
***** 返回值:  无
***** 创建者:   潘星宇
***** 创建时间:2012-12-30
***** 最后更新: 2012-12-30
****************************************************************************/
void draw_circle(unsigned int x1, 			//圆心横坐标
				 unsigned int y1,			//圆心纵坐标
				 unsigned int radius,		//半径
				 unsigned int color)		//颜色
{
	unsigned int i;
	for (i=0; i <= 359; i++)
	{
    	one_point_to_another (x1, y1, radius, i, color, 0, 1);
	}
}

/**************************************************************************
***** 函数名:   MidpointCircle(int x0,int y0,int r,int color)***** 功能:画个圆
***** 参数:     圆心x,y坐标,半径,颜色
***** 返回值:   无
***** 创建者:	 潘星宇
***** 创建时间: 2012-12-23
***** 最后更新:  2012-12-23
****************************************************************************/
void MidpointCircle(int x0,int y0,int r,int color)
{
	int x,y;
	float d;
	x=0;
	y=r;
	d=5.0/4-r;
	while(x<=y)
	{
		PutPixel(x0+x,y0+y,color);
		PutPixel(x0+x,y0-y,color);
		PutPixel(x0-x,y0+y,color);
		PutPixel(x0-x,y0-y,color);
		PutPixel(x0+y,y0+x,color);
		PutPixel(x0+y,y0-x,color);
		PutPixel(x0-y,y0+x,color);
		PutPixel(x0-y,y0-x,color);
		if(d<0)
		{
			d+=x*2.0+3;
		}

		else
		{
			d+=2.0*(x-y)+5;
			y--;
		}
		x++;
	}
}

/**************************************************************************
***** 函数名:   draw_square画个正方形
***** 参数:     x:左上角顶点横坐标
				 y:左上角顶点纵坐标
				 l:边长
				 color:边的颜色
				 back_color:内部填充色
***** 返回值:   无
***** 创建者:	 潘星宇
***** 创建时间: 2013-3-14
***** 最后更新:  2013-3-14
****************************************************************************/
void draw_square(U16 x, U16 y, U16 l, U32 color, U32 back_color)
{
	U16 i,j,k;
	for (i=0; i<=l; i++)
	{
		PutPixel(x+i,y,color);	   //上边
		PutPixel(x+i,y+l,color);   //下边
		PutPixel(x,y+i,color);	   //左边
		PutPixel(x+l,y+i,color);   //右边
	}
	for (j=0; j<=l-2; j++)
	{
		for(k=0; k<=l-2; k++)
		{
			PutPixel(x+1+k,y+1+j,back_color);	//填充内部,横着画
		}		
	}
}

/**************************************************************************
***** 函数名:   draw_rectangle画个矩形
***** 参数:     x:起点横坐标
				 y:起点纵坐标	
				 width:宽
				 height:高
				 color:颜色
***** 返回值:   无
***** 创建者:	 潘星宇
***** 创建时间: 2013-3-24
***** 最后更新:  2013-3-24
****************************************************************************/
void draw_rectangle(U16 x, U16 y, U16 width, U16 height, U32 color)
{
	U16 i,j;
	for(i=0; i<height; i++)
	{
		for(j=0; j<width; j++)
		{
			PutPixel(x+j,y+i,color);		
		}

	}
}

/**************************************************************************
***** 函数名:   Paint_Bmp()
***** 功能:     显示指定大小图片
***** 参数:     x0 开始位置,y0开始位置  ,h高度,l 宽度 ,bmp 图片数据数组
***** 返回值:	 无
***** 创建者:	
***** 创建时间: 2011-03-30
***** 最后更新:2017-04-22
****************************************************************************/
//l:480    h:272
 void Paint_Bmp(int x0,int y0,int l,int h,const unsigned char bmp[])
{
	int x,y;
	U32 c;
	int p = 0;
	
    for( y = y0 ; y < y0+h ; y++ )
    {
    	for( x = x0 ; x <x0+l ; x++ )
    	{
    		c = bmp[p+1] | (bmp[p]<<8) ;		 //16BPP 先放的是高8位然后是低8位

//			if ( ( (x0+x) < LCD_WIDTH) && ( (y0+y) < LCD_HEIGHT) )
				 LCD_BUFFER[y][x] = c ;
			
    		p = p + 2 ;			                 //16BPP储存一个颜色 故一次加2
    	}
    }
}

有好几个头文件如下:

#ifndef LCD_H
#define LCD_H
#include "2440addr.h"
#include "def.h"
#include "zi.h"
#include "math.h"
/**************************************************************************
***** 函数名:  LCD_Init(void)
***** 功能:	LCD初始化
***** 参数:    无
***** 返回值:	无
***** 创建者:	
***** 创建时间: 2011-03-30
***** 最后更新:2011-03-30
****************************************************************************/
extern void LCD_Init(void);

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

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

/**************************************************************************
***** 函数名:  Draw_Text56(void)
***** 功能:绘制大小为56×56的中文字符
***** 参数:    x:横坐标 y:纵坐标 c颜色  	  ch:字模数组
***** 返回值:	无
***** 创建者:	潘星宇
***** 创建时间: 2012-12-16
***** 最后更新:2012-12-16
****************************************************************************/
//Draw_Text16(50,10,0x0,0xf800,xin);
extern void Draw_Text56(U32 x,U32 y,U32 color,U32 backColor,const unsigned char ch[]);
	
/**************************************************************************
***** 函数名:  Draw_ASCII(void)
***** 功能:绘制宽X高大小为8×16的字符
***** 参数:    x:横坐标   y:纵坐标     color文字颜色  
   	            backColor  文字背景颜色  ch:字模数组
***** 返回值:	无
***** 创建者:	
***** 创建时间: 2011-03-30
***** 最后更新:2011-03-30
****************************************************************************/
extern void Draw_ASCII(U32 x,U32 y,U32 color,U32 backColor,const unsigned char *ch);

/**************************************************************************
***** 函数名:  Draw_ASCII_N(void)
***** 功能:    绘制大小为16×8,16x16的字符串
***** 参数:    x:横坐标   y:纵坐标     color文字颜色  
   	            backColor  文字背景颜色  ch:字模数组
***** 返回值:	无
***** 创建者:	
***** 创建时间: 2011-03-30
***** 最后更新:2011-03-30
****************************************************************************/
extern void Draw_Text_8_16(U32 x,U32 y,U32 color,U32 backColor,const unsigned char *chs);

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

/**************************************************************************
***** 函数名:  Draw_ASCII_N(void)
***** 功能:    绘制N个大小为16×8的字符
***** 参数:    x:横坐标 y:纵坐标 color颜色  	  ch:字符串
***** 返回值:	无
***** 创建者:	
***** 创建时间: 2011-03-30
***** 最后更新:2011-03-30
****************************************************************************/
extern void Draw_ASCII_N(U32 x,U32 y,U32 color,U32 backColor,const unsigned char *chs);

/**************************************************************************
***** 函数名:   Brush_Background()
***** 功能:     绘制屏幕背景颜色,颜色为c
***** 参数:     c 颜色
***** 返回值:	 无
***** 创建者:    
***** 创建时间: 2011-03-30
***** 最后更新:  2011-03-30
****************************************************************************/
extern void Brush_Background( U32 c);

/**************************************************************************
***** 函数名:  one_point_to_another(unsigned int x1, unsigned int y1,
								     unsigned int length, double angle, 
									 unsigned int color, unsigned int length_start,
									 unsigned int length_end)
***** 功能:    由一点,长度和角度做线
***** 参数:    已知点坐标x1,y1;长度length,角度angle,颜色color;起始点和结束点;
				角度按照钟表原则,0点为0°,顺时针旋转,
				函数内部将角度按照象限的原则转化,第一象限为0°的开始。
				length_start_points:希望保留起始的点的个数
				length_end_points:希望保留最后的点的个数
***** 返回值:  无
***** 创建者:   潘星宇
***** 创建时间:2012-12-25
***** 最后更新: 2012-12-25 这个函数有个缺陷:圆心的横纵坐标都要大于半径,因为没有判断负值的数据类型,稍微改造下即可
****************************************************************************/
extern void one_point_to_another(unsigned int x1, 				    //已知点横坐标x1
						 		 unsigned int y1,				    //已知点纵坐标y1
					     		 unsigned int length, 			    //两点间距长度
						 		 float angle, 					    //两点角度,按照钟表原则,0点为0°,顺时针旋转
					     		 unsigned int color, 			    //颜色
						 		 unsigned int length_start_points,	//希望保留起始的点的个数
					      		 unsigned int length_end_points);	//希望保留最后的点的个数

/**************************************************************************
***** 函数名:  draw_circle(unsigned int x1, unsigned int y1,
						    unsigned int radius,unsigned int color)
***** 功能:    画一个圆
***** 参数:    已知点坐标x1,y1;半径radius,颜色color;
***** 返回值:  无
***** 创建者:   潘星宇
***** 创建时间:2012-12-30
***** 最后更新: 2012-12-30
****************************************************************************/
extern void draw_circle(unsigned int x1, 			//圆心横坐标
						unsigned int y1,			//圆心纵坐标
				 		unsigned int radius,		//半径
						unsigned int color);		//颜色

/**************************************************************************
***** 函数名:   MidpointCircle(int x0,int y0,int r,int color)***** 功能:画个圆
***** 参数:     圆心x,y坐标,半径,颜色
***** 返回值:   无
***** 创建者:	 潘星宇
***** 创建时间: 2012-12-23
***** 最后更新:  2012-12-23
****************************************************************************/
extern void MidpointCircle(int x0,int y0,int r,int color);

/**************************************************************************
***** 函数名:   draw_square画个正方形
***** 参数:     x:左上角顶点横坐标
				 y:左上角顶点纵坐标
				 l:边长
				 color:边的颜色
				 back_color:内部填充色
***** 返回值:   无
***** 创建者:	 潘星宇
***** 创建时间: 2013-3-14
***** 最后更新:  2013-3-14
****************************************************************************/
extern void draw_square(U16 x, U16 y, U16 l, U32 color, U32 back_color);

/**************************************************************************
***** 函数名:   draw_rectangle画个矩形
***** 参数:     x:起点横坐标
				 y:起点纵坐标	
				 width:宽
				 height:高
				 color:颜色
***** 返回值:   无
***** 创建者:	 潘星宇
***** 创建时间: 2013-3-24
***** 最后更新:  2013-3-24
****************************************************************************/
extern void draw_rectangle(U16 x, U16 y, U16 width, U16 height, U32 color);

/**************************************************************************
***** 函数名:   Paint_Bmp()
***** 功能:     显示指定大小图片
***** 参数:     x0 开始位置,y0开始位置  ,h高度,l 宽度 ,bmp 图片数据数组
***** 返回值:	 无
***** 创建者:	
***** 创建时间: 2011-03-30
***** 最后更新:2011-03-30
****************************************************************************/
//l:480    h:272
extern void Paint_Bmp(int x0,int y0,int h,int l,const unsigned char bmp[]);
#endif

#ifndef __DEF_H__
#define __DEF_H__

#define U32 unsigned int
#define U16 unsigned short
#define S32 int
#define S16 short int
#define U8  unsigned char
#define	S8  char

#define	BYTE	char
#define	WORD 	short
#define	DWORD	int
#define	UINT	U32
#define	LPSTR	U8 *		

#define TRUE 	1   
#define FALSE 	0
#define OK		1
#define FAIL	0

#define	SIZE_1K		0x00000400
#define	SIZE_2K		0x00000800
#define	SIZE_4K		0x00001000
#define	SIZE_8K		0x00002000
#define	SIZE_16K	0x00004000
#define	SIZE_32K	0x00008000
#define	SIZE_64K	0x00010000
#define	SIZE_128K	0x00020000
#define	SIZE_256K	0x00040000
#define	SIZE_512K	0x00080000
#define	SIZE_1M		0x00100000
#define	SIZE_2M		0x00200000
#define	SIZE_4M		0x00400000
#define	SIZE_8M		0x00800000
#define	SIZE_16M	0x01000000
#define	SIZE_32M	0x02000000
#define	SIZE_64M	0x04000000
#define	SIZE_128M	0x08000000
#define	SIZE_256M	0x10000000
#define	SIZE_512M	0x20000000
#define	SIZE_1G		0x40000000
#define	SIZE_2G		0x80000000

#define	ENTER_KEY	0x0d
#define	BACK_KEY	0x08
#define BEEP_KEY	0x07
#define UP_KEY		0x41
#define DOWN_KEY	0x42
#define RIGHT_KEY	0x43
#define LEFT_KEY	0x44
#define HOME_KEY	0x48
#define END_KEY		0x4b
#define	ESC_KEY		0x1b

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

/******************480X272*********************************/

#define BPP24        (0)
#define LCD_WIDTH   480        //屏幕的宽
#define LCD_HEIGHT   272        //屏幕的高
//垂直同步信号的脉宽、后肩和前肩
#define VSPW        (8)		   //垂直同步信号的脉宽(X35屏只能是该值)
#define VBPD        (2)		   //垂直同步信号的后肩
#define VFPD        (4)	   //垂直同步信号的前肩

//水平同步信号的脉宽、后肩和前肩
#define HSPW        (30)	  //水平同步信号的脉宽
#define HBPD        (10)	  //水平同步信号的后肩
#define HFPD        (19)  //水平同步信号的前肩

#define FRM565		 (1)

//for
#define CLKVAL_TFT    4      //设置时钟信号
#define MVAL_USED     0      //	当屏是TFT时设置为0,STN屏时设置为1
#define PNRMODE_TFT   3      //选择显示模式 TFT型LCD
//for LCDCON5
#define BPP24BL        0     //32位数据表示24位颜色值时,低位数据有效,高8位无效
#define INVVCLK        0     //像素值在VCLK下降沿有效
#define INVVLINE       1     //翻转HSYNC信号
#define INVVFRAME      1     //翻转VSYNC信号
#define INVVD          1     //翻转VD信号极性
#define INVVDEN        1     //1    //翻转VDEN信号极性
#define PWREN          1     //使能PWREN信号
#define BSWP           0     //颜色数据字节不交换
#define LINEVAL  (LCD_HEIGHT-1)
#define HOZVAL   (LCD_WIDTH-1)

#endif /*__DEF_H__*/

猜你喜欢

转载自blog.csdn.net/pxy198831/article/details/86254866