1. 程式人生 > >S3C2440之液晶屏LCD驅動

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__*/