⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd_480272.c

📁 三星处理器S3C2440的液晶源代码
💻 C
字号:
#include <S3C2440.H>

#include "LCD_480272.h"
#include "caculate.h"

//#include "shu_8.h"
    int dx,dy,e;
    int temp=0;
    int X,Y;
    

volatile static unsigned short LCD_BUFER[LCD_YSIZE_TFT_480272][LCD_XSIZE_TFT_480272];
//红色(0x1f<<11--0x01<<11)  绿色(0x7e<<5--0x02<<5) 蓝色(0x1f--0x01)
const unsigned char *PicBtn;  // 指针指向底层图片
U32 PicBtn_x1,PicBtn_x2;	  //保存底层图片色坐标信息
U32 PicBtn_y1,PicBtn_y2;
volatile U16 PicBac[10000];   //被覆盖的图片数据




/**************************************************************
480×272 16Bpp TFT LCD数据和控制端口初始化
**************************************************************/
static void Lcd_Port_Init(void)
{
    #ifdef LTV350QV_POE
	
    GPCUP=0xffffffff; // Disable Pull-up register
    GPCCON=0xaa9556a9; //Initialize VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND 
                                           //LCDVF[0],[1],[2]---output;VD[0],[1],[2]----output.
    GPDUP=0xffffffff; // Disable Pull-up register
    GPDCON=0xaaaaaaaa; //Initialize VD[15:8]     VD[8]---output

    CS_H;          //initialize the cs,scl,sdi pin for LTV350QV_POE
    SCLK_H;
    SDI_H; 
	
    #else
	
    //rGPCUP = 0xffffffff; // Disable Pull-up register
    GPCUP = 0x0; // enable Pull-up register
    GPCCON = 0xaaaa56a9; //Initialize VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND 

    //rGPDUP = 0xffffffff ; // Disable Pull-up register
    GPDUP = 0x0 ; // enable Pull-up register
    GPDCON=0xaaaaaaaa; //Initialize VD[15:8]

   #endif
}

/**************************************************************
480×272 16Bpp TFT LCD功能模块初始化
**************************************************************/
static void Lcd_Init(void)
{
	LCDCON1=(CLKVAL_TFT_480272<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;
    // TFT LCD panel,16bpp TFT,ENVID=off
	LCDCON2=(VBPD_480272<<24)|(LINEVAL_TFT_480272<<14)|(VFPD_480272<<6)|(VSPW_480272);
	LCDCON3=(HBPD_480272<<19)|(HOZVAL_TFT_480272<<8)|(HFPD_480272);
	LCDCON4=(MVAL<<8)|(HSPW_480272);
	LCDCON5=(1<<11)|(1<<10)|(1<<9)|(1<<8)|(0<<6)|(1<<3)|(BSWP<<1)|(HWSWP);	//FRM5:6:5,VCLK,HSYNC and VSYNC are inverted
	LCDSADDR1=(((U32)LCD_BUFER>>22)<<21)|M5D((U32)LCD_BUFER>>1);
	LCDSADDR2=M5D( ((U32)LCD_BUFER+(LCD_XSIZE_TFT_480272*LCD_YSIZE_TFT_480272*2))>>1 );
	LCDSADDR3=(((LCD_XSIZE_TFT_480272-LCD_XSIZE_TFT_480272)/1)<<11)|(LCD_XSIZE_TFT_480272/1);

	
	LCDINTMSK|=(3); // MASK LCD Sub Interrupt
//	TCONSEL&=(~7); // Disable LPC3600 diff 2410
	TPAL=0; // Disable Temp Palette
}

/**************************************************************
LCD视频和控制信号输出或者停止,1开启视频输出
**************************************************************/
static void Lcd_EnvidOnOff(int onoff)
{
    if(onoff==1)
	LCDCON1|=1; // ENVID=ON
    else
	LCDCON1 =LCDCON1 & 0x3fffe; // ENVID Off
}

static void Lcd_MoveViewPort(int vx,int vy)
{
    U32 addr;

    SET_IF(); 
	#if (LCD_XSIZE_TFT_480272<32)
    	    while((LCDCON1>>18)<=1); // if x<32
	#else	
    	    while((LCDCON1>>18)==0); // if x>32
	#endif
    
    addr=(U32)LCD_BUFER+(vx*2)+vy*(SCR_XSIZE_TFT_480272*2);
	LCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1 );
	LCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_480272*LCD_YSIZE_TFT_480272*2))>>1));
	CLR_IF();
}    



/**************************************************************
480×272 16Bpp TFT LCD单个象素的显示数据输出
**************************************************************/
static void PutPixel(U32 x,U32 y,U32 c)
{
	if ( (x < SCR_XSIZE_TFT_480272) && (y < SCR_YSIZE_TFT_480272) )
	LCD_BUFER[(y)][(x)] = c;
}

/**************************************************************
480×272 16Bpp TFT LCD全屏填充特定颜色单元或清屏
**************************************************************/
static void Lcd_ClearScr(U16 c)
{
	unsigned int x,y ;
		
    for( y = 0 ; y < SCR_YSIZE_TFT_480272 ; y++ )
    {
    	for( x = 0 ; x < SCR_XSIZE_TFT_480272 ; x++ )
    	{
			LCD_BUFER[y][x] = c;
    	}
    }
}



static void Glib_FilledRectangle(int x1,int y1,int x2,int y2,int color)
{
    int i;

    for(i=y1;i<=y2;i++)
		Glib_Line(x1,i,x2,i,color);
}

/* 
 * 画线
 * 输入参数:
 *     x1、y1 : 起点坐标
 *     x2、y2 : 终点坐标
 *     color  : 颜色值
 *         对于16BPP: color的格式为0xAARRGGBB (AA = 透明度),
 *     需要转换为5:6:5格式
 *         对于8BPP: color为调色板中的索引值,
 *     其颜色取决于调色板中的数值
 */
void Lcd_DrawLine(int x1,int y1,int x2,int y2,U32 color)
{


    if(x2<x1){temp=x1;x1=x2;x2=temp;temp=y1;y1=y2;y2=temp;}//保证一个方向

    dy=y2-y1;
    dx=x2-x1;

    if(dx==0)
    {
	    for(Y=y1;Y<y2;Y++)
	    {
	    	PutPixel(x1,Y,color);
	    }	
    }
    else
    {
    
    	if(dy>0)    
    	{
    		if(dy>dx)
    		{
    			temp=dy/dx;	
    			for(X=x1;X<x2+1;X++)
    			{
    				for(Y=0;Y<temp;Y++)
    				{
    					PutPixel(X,y1,color);
    					y1+=1;
    				}
    			}
    		}
    		else
    		{
    		if(dy<dx)
    		{
    			temp=dx/dy;	
    			for(Y=y1;Y<y2;Y++)
    			{
    				for(X=0;X<temp;X++)
    				{
    					PutPixel(x1,Y,color);
    					x1+=1;
    				}
    			}
    		}
    		else
    		{
    			for(X=x1;X<x2+1;X++)
    			{
    				PutPixel(X,X,color);
    			}
    		}
    		}
    	}
    	
    	else
    	{
    	if(dy<0)   
    	{
    		dy=-dy;
    		if(dy>dx)
    		{
    			temp=dy/dx;	
    			for(X=x1;X<x2+1;X++)
    			{
    				for(Y=0;Y<temp;Y++)
    				{
    					PutPixel(X,y1,color);
    					y1-=1;
    				}
    			}
    		}
    		else
    		{
    		if(dy<dx)
    		{
    			temp=dx/dy;	
    			for(Y=y1;Y<y2-1;Y--)
    			{
    				for(X=0;X<temp;X++)
    				{
    					PutPixel(x1,Y,color);
    					x1+=1;
    				}
    			}
    		}
    		else
    		{
    			for(X=x1;X<x2;X++)
    			{
    				PutPixel(X,X,color);
    			}
    		}
    		}
    		
    	}
    	else
    	{
    		for(X=x1;X<x2;X++)
    		{
    			PutPixel(X,y1,color);
    		}
    	}
    	}
    }
}
/* 
 * 画一张图片
 * 输入参数:
 *     x1、y1 : 起点坐标
 *     x2、y2 : 终点坐标
 *     *Pic   : 图片数据存放的数组入口
 *     Act    : 为1则需要保存覆盖不封的数据,保存格式为U16,Picbtn为需要保存的数据, 地址为PicBac[10000] (大小有限制的)
 */
void Lcd_PicDraw(U32 x1,U32 y1,U32 x2,U32 y2,const unsigned char *Pic,int Act,const unsigned char *Picbtn)
{
	U32 tempX,tempY;
	U16 color;
	
	if(0==Act) //为0则不需要保存数据
	{
		for(tempY=y1;tempY<y2;tempY++)                          //画一阵附图片
			for(tempX=x1;tempX<x2;tempX++)
			{
				color=(Pic[(2*(x2-x1)*(tempY-y1)+(tempX-x1)*2)]<<8)+Pic[(2*(x2-x1)*(tempY-y1)+(tempX-x1)*2+1)];
				PutPixel(tempX+1,tempY+1,color);
			}
			
		PicBtn=Pic;
		PicBtn_x1=x1;
		PicBtn_y1=y1;
		PicBtn_x2=x2;
		PicBtn_y2=y2;
			
	}
	if(1==Act) //需要保存底层副高数据
	{
		for(tempY=y1;tempY<y2;tempY++)                 //保存数据       
			for(tempX=x1;tempX<x2;tempX++)
			{
				PicBac[(tempY-y1)*(x2-x1)+(tempX-x1)]=(Picbtn[(2*(PicBtn_x2-PicBtn_x1)*(tempY-PicBtn_y1)+(tempX-PicBtn_x1)*2)]<<8)+PicBtn[(2*(PicBtn_x2-PicBtn_x1)*(tempY-PicBtn_y1)+(tempX-PicBtn_x1)*2+1)];
			}
			
		for(tempY=y1;tempY<y2;tempY++)               //载入新图片数据
			for(tempX=x1;tempX<x2;tempX++)
			{
				color=(Pic[(2*(x2-x1)*(tempY-y1)+(tempX-x1)*2)]<<8)+Pic[(2*(x2-x1)*(tempY-y1)+(tempX-x1)*2+1)];
				PutPixel(tempX+1,tempY+1,color);
			}
	}
}

/*
 *十六位图片的显示
 *参数与原来的一样
 */
void Lcd_PicDraw_16(U32 x1,U32 y1,U32 x2,U32 y2,volatile U16 *PicBac)
{
	U32 tempX,tempY;
	U16 color;
	
	for(tempY=y1;tempY<y2;tempY++)
		for(tempX=x1;tempX<x2;tempX++)
		{
			color=PicBac[(tempY-y1)*(x2-x1)+(tempX-x1)];
			PutPixel(tempX+1,tempY+1,color);
		}	
}



/*
 *写一个子,宽35,高26
 */
//void Lcd_WriteWord()
void Lcd_Write(U32 x1,U32 y1,U32 x2,U32 y2,unsigned char *Pic,unsigned char *Picbtn)
{
	U32 tempX,tempY;
	U16 color;
	
	
		for(tempY=y1;tempY<y2;tempY++)                 //保存数据       
			for(tempX=x1;tempX<x2;tempX++)
			{
				PicBac[(tempY-y1)*(x2-x1)+(tempX-x1)]=(Picbtn[(2*(PicBtn_x2-PicBtn_x1)*(tempY-PicBtn_y1)+(tempX-PicBtn_x1)*2)]<<8)+PicBtn[(2*(PicBtn_x2-PicBtn_x1)*(tempY-PicBtn_y1)+(tempX-PicBtn_x1)*2+1)];
			}
			
		for(tempY=y1;tempY<y2;tempY++)               //载入新图片数据
			for(tempX=x1;tempX<x2;tempX++)
			{
				color=(Pic[(2*(x2-x1)*(tempY-y1)+(tempX-x1)*2)]<<8)+Pic[(2*(x2-x1)*(tempY-y1)+(tempX-x1)*2+1)];
				if(0xffff==color){color=PicBac[(tempY-y1)*(x2-x1)+(tempX-x1)];}
				else
				{
					if(0x0000==color){color=0xff00;}
				}
				PutPixel(tempX+1,tempY+1,color);
			}
}




void Lcd_Tft_480X272_Init( void )
{
	U32 tempX,tempY;
	U16 color;
	
	U16 use[2500];
	
   	Lcd_Port_Init();
	
    Lcd_Init();
    Lcd_EnvidOnOff(1);		//turn on vedio
   
	Lcd_ClearScr(0xffff);		//fill all screen with some color


	Lcd_PicDraw(0,0,480,270,caculate,0,caculate);	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -