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

📄 lcdlib.c

📁 s3c2410开发板的测试代码,包括lcd
💻 C
📖 第 1 页 / 共 2 页
字号:
    else
		rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off
}    

/*
*********************************************************
* 函数介绍:本函数是Lpc3600 enable函数。				
* 输入参数:无
* 输出参数:无
* 返回值  :无
*********************************************************
*/
void Lcd_Lpc3600Enable(void)
{
    rLPCSEL&=~(7);
    rLPCSEL|=(7); // 240320,Enable LPC3600
}    

/*
*********************************************************
* 函数介绍:本函数是LCD_PWREN enable函数。				
* 输入参数:pwren--LCD_PWREN output signal enable/disable.
*           invpwren--This bit indicates the PWREN signal polarity.
* 输出参数:无
* 返回值  :无
*********************************************************
*/
void Lcd_PowerEnable(int invpwren,int pwren)
{
    //GPG4 is setted as LCD_PWREN
    rGPGUP=rGPGUP&(~(1<<4))|(1<<4); // Pull-up disable
    rGPGCON=rGPGCON&(~(3<<8))|(3<<8); //GPG4=LCD_PWREN
    //Enable LCD POWER ENABLE Function
    rLCDCON5=rLCDCON5&(~(1<<3))|(pwren<<3);   // PWREN
    rLCDCON5=rLCDCON5&(~(1<<5))|(invpwren<<5);   // INVPWREN
}    

/*
*********************************************************
* 函数介绍:本函数是移动显示点函数。				
* 输入参数:type--LCD类型
* 输出参数:无
* 返回值  :无
*********************************************************
*/
void MoveViewPort(int type)
{
    int vx=0,vy=0,vd;
    vd=(type==MODE_STN_1BIT)*16+(type==MODE_STN_2BIT)*8+(type==MODE_STN_4BIT)*4
        +(type==MODE_CSTN_8BIT)*2+(type==MODE_CSTN_12BIT)*4 
        +(type==MODE_TFT_1BIT_240320)*16+(type==MODE_TFT_8BIT_240320)*2+(type==MODE_TFT_16BIT_240320)*1
        +(type==MODE_TFT_1BIT_640480)*16+(type==MODE_TFT_8BIT_640480)*2+(type==MODE_TFT_16BIT_640480)*1+(type==MODE_TFT_24BIT_640480)/2
        +(type==MODE_TFT_1BIT_800600)*16+(type==MODE_TFT_8BIT_800600)*2+(type==MODE_TFT_16BIT_800600)*1;        
    while(1)
    {
    	switch(Uart_Getch())
    	{
	    	case 'i':
		    	if(vy>=vd)vy-=vd;    	   	
	        	break;

	    	case 'j':
	    	    if(vx>=vd)vx-=vd;
	    		break;

	    	case 'k':
			    //if((type==MODE_TFT_1BIT_800600)|(type==MODE_TFT_8BIT_800600)|(type==MODE_TFT_16BIT_800600))   
			    if((type&0x4000)&&(type&0x400))		  
			    {
		             if(vx<=(SCR_XSIZE_TFT_800600-LCD_XSIZE_TFT_800600-vd))vx+=vd;   	    
			    }
			    //else if((type==MODE_TFT_1BIT_640480)|(type==MODE_TFT_8BIT_640480)|(type==MODE_TFT_16BIT_640480)|(type==MODE_TFT_24BIT_640480))   
			    else if((type&0x4000)&&(type&0x200))		  
			    {
		             if(vx<=(SCR_XSIZE_TFT_640480-LCD_XSIZE_TFT_640480-vd))vx+=vd;   	    
			    }
		            //else if((type==MODE_TFT_8BIT_240320)|(type==MODE_TFT_16BIT_240320))   
			    else if((type&0x4000)&&(type&0x100)) 
			    {
		             if(vx<=(SCR_XSIZE_TFT_240320-LCD_XSIZE_TFT_240320-vd))vx+=vd;   	    
			    }
	            //else if((type==MODE_CSTN_8BIT)|(type==MODE_CSTN_12BIT))   
	            else if(type&0x2000)   
	            {
	                if(vx<=(SCR_XSIZE_CSTN-LCD_XSIZE_CSTN-vd))vx+=vd;   	    
	            }
	            else
	            {
	                if(vx<=(SCR_XSIZE_STN-LCD_XSIZE_STN-vd))vx+=vd;   	    
	            }
	   	    	break;

	    	case 'm':
			    if((type&0x4000)&&(type&0x400))
	            {
	                if(vy<=(SCR_YSIZE_TFT_800600-LCD_YSIZE_TFT_800600-vd))vy+=vd; 
	                else if(vy==592)vy+=8;
	            }
			    else if((type&0x4000)&&(type&0x200))
	            {
	                if(vy<=(SCR_YSIZE_TFT_640480-LCD_YSIZE_TFT_640480-vd))vy+=vd;   	    
	            }
			    else if((type&0x4000)&&(type&0x100))
	            {
	                if(vy<=(SCR_YSIZE_TFT_240320-LCD_YSIZE_TFT_240320-vd))vy+=vd;   	    
	            }
	            else if(type&0x2000)   
	            {
	                if(vy<=(SCR_YSIZE_CSTN-LCD_YSIZE_CSTN-vd))vy+=vd;   	    
	            }
	            else
	            {
	                if(vy<=(SCR_YSIZE_STN-LCD_YSIZE_STN-vd))vy+=vd;   	    
	            }
		   	    break;

	    	case '\r':
	   	    	return;

	    	default:
		    	break;
		}
		Uart_Printf("vx=%3d,vy=%3d\n",vx,vy);
		Lcd_MoveViewPort(vx,vy,type);
    }
}

/*
*********************************************************
* 函数介绍:本函数是LCD_移动显示点函数函数。				
* 输入参数:type--LCD类型
*           vx--X坐标
*           vy--Y坐标
* 输出参数:无
* 返回值  :无
*********************************************************
*/
void Lcd_MoveViewPort(int vx,int vy,int type)
{
    U32 addr;
    switch(type)
    {
		case MODE_STN_1BIT:
		// LCDBASEU,LCDBASEL register has to be changed before 12 words before the end of VLINE.
		// In mono mode, x=320 is 10 words, So, We can't change LCDBASEU,LCDBASEL 
		// during LINECNT=1~0 at mono mode. 
		// The processor mode should be superviser mode.  
			SET_IF();
			#if (LCD_XSIZE_STN<512)
				while((rLCDCON1>>18)<=1); // if x<512
			#else	
				while((rLCDCON1>>18)==0); // if x>512 ((12+4)*32) 
			#endif
				addr=(U32)frameBuffer1Bit+(vx/8)+vy*(SCR_XSIZE_STN/8);
				rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
				rLCDSADDR2= M5D( ((addr+(SCR_XSIZE_STN*LCD_YSIZE_STN/8))>>1) );
				CLR_IF();
			break;
		
		case MODE_STN_2BIT:
			SET_IF(); 
			#if (LCD_XSIZE_STN<256)
				while((rLCDCON1>>18)<=1); // if x<256
			#else	
				while((rLCDCON1>>18)==0); // if x>256
			#endif
				addr=(U32)frameBuffer2Bit+(vx/4)+vy*(SCR_XSIZE_STN/4);
				rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
				rLCDSADDR2= M5D(((addr+(SCR_XSIZE_STN*LCD_YSIZE_STN/4))>>1));
				CLR_IF();
			break;
		
		case MODE_STN_4BIT:
			SET_IF(); 
			#if (LCD_XSIZE_STN<128)
				while((rLCDCON1>>18)<=1); // if x<128
			#else	
				while((rLCDCON1>>18)==0); // if x>128
			#endif
				addr=(U32)frameBuffer4Bit+(vx/2)+vy*(SCR_XSIZE_STN/2);
				rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
				rLCDSADDR2= M5D(((addr+(SCR_XSIZE_STN*LCD_YSIZE_STN/2))>>1));
				CLR_IF();
			break;
		
		case MODE_CSTN_8BIT:
			SET_IF(); 
			#if (LCD_XSIZE_CSTN<64)
				while((rLCDCON1>>18)<=1); // if x<64
			#else	
				while((rLCDCON1>>18)==0); // if x>64
			#endif
				addr=(U32)frameBuffer8Bit+(vx/1)+vy*(SCR_XSIZE_CSTN/1);
				rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
				rLCDSADDR2= M5D(((addr+(SCR_XSIZE_CSTN*LCD_YSIZE_CSTN))>>1));
				CLR_IF();
			break;
		
		case MODE_CSTN_12BIT:
			SET_IF(); 
			#if (LCD_XSIZE_CSTN<43)
				while((rLCDCON1>>18)<=1); // if x<43
			#else	
				while((rLCDCON1>>18)==0); // if x>43
			#endif
				addr=(U32)frameBuffer12Bit+(vx*3/2)+vy*(SCR_XSIZE_CSTN*3/2); // Move 6Byte(4pixel)
				rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
				rLCDSADDR2= M5D(((addr+(SCR_XSIZE_CSTN*LCD_YSIZE_CSTN*3/2))>>1));
				CLR_IF();
			break;
		
		case MODE_TFT_1BIT_240320:
			SET_IF(); 
			#if (LCD_XSIZE_TFT_240320<512)
				while((rLCDCON1>>18)<=1); // if x<512
			#else	
				while((rLCDCON1>>18)==0); // if x>512
			#endif
				addr=(U32)frameBuffer8BitTft240320+(vx/8)+vy*(SCR_XSIZE_TFT_240320/8);
				rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
				rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320/8))>>1));
				CLR_IF();
			break;
		
		case MODE_TFT_8BIT_240320:
			SET_IF(); 
			#if (LCD_XSIZE_TFT_240320<64)
				while((rLCDCON1>>18)<=1); // if x<64
			#else	
				while((rLCDCON1>>18)==0); // if x>64
			#endif
				addr=(U32)frameBuffer8BitTft240320+(vx/1)+vy*(SCR_XSIZE_TFT_240320/1);
				rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
				rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320))>>1));
				CLR_IF();
			break;
		
		case MODE_TFT_16BIT_240320:
			SET_IF(); 
			#if (LCD_XSIZE_TFT_240320<32)
				while((rLCDCON1>>18)<=1); // if x<32
			#else	
				while((rLCDCON1>>18)==0); // if x>32
			#endif
				addr=(U32)frameBuffer16BitTft240320+(vx*2)+vy*(SCR_XSIZE_TFT_240320*2);
				rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
				rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320*2))>>1));
				CLR_IF();
			break;
		
		case MODE_TFT_1BIT_640480:
			SET_IF();
			#if (LCD_XSIZE_TFT_640480<512)
				while((rLCDCON1>>18)<=1); // if x<512
			#else	
				while((rLCDCON1>>18)==0); // if x>512 ((12+4)*32) 
			#endif
				addr=(U32)frameBuffer1BitTft640480+(vx/8)+vy*(SCR_XSIZE_TFT_640480/8);
				rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
				rLCDSADDR2= M5D( ((addr+(SCR_XSIZE_TFT_640480*LCD_YSIZE_TFT_640480/8))>>1) );
				CLR_IF();
			break;
		
		case MODE_TFT_8BIT_640480:
			SET_IF(); 
			#if (LCD_XSIZE_TFT_640480<64)
				while((rLCDCON1>>18)<=1); // if x<64
			#else	
				while((rLCDCON1>>18)==0); // if x>64
			#endif
				addr=(U32)frameBuffer8BitTft640480+(vx/1)+vy*(SCR_XSIZE_TFT_640480/1);
				rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
				rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_640480*LCD_YSIZE_TFT_640480))>>1));
				CLR_IF();
			break;
		
		case MODE_TFT_16BIT_640480:
			SET_IF(); 
			#if (LCD_XSIZE_TFT_640480<32)
				while((rLCDCON1>>18)<=1); // if x<32
			#else	
				while((rLCDCON1>>18)==0); // if x>32
			#endif
				addr=(U32)frameBuffer16BitTft640480+(vx*2)+vy*(SCR_XSIZE_TFT_640480*2);
				rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
				rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_640480*LCD_YSIZE_TFT_640480*2))>>1));
				CLR_IF();
			break;
		
		case MODE_TFT_24BIT_640480:
			SET_IF(); 
			#if (LCD_XSIZE_TFT_640480<16)
				while((rLCDCON1>>18)<=1); // if x<16
			#else	
				while((rLCDCON1>>18)==0); // if x>16
			#endif
				addr=(U32)frameBuffer24BitTft640480+(vx*4)+vy*(SCR_XSIZE_TFT_640480*4);
				rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
				rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_640480*LCD_YSIZE_TFT_640480*4))>>1));
				CLR_IF();
			break;
		
		case MODE_TFT_1BIT_800600:
			SET_IF();
			#if (LCD_XSIZE_TFT_800600<512)
				while((rLCDCON1>>18)<=1); // if x<512
			#else	
				while((rLCDCON1>>18)==0); // if x>512 ((12+4)*32) 
			#endif
				addr=(U32)frameBuffer1BitTft800600+(vx/8)+vy*(SCR_XSIZE_TFT_800600/8);
				rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
				rLCDSADDR2= M5D( ((addr+(SCR_XSIZE_TFT_800600*LCD_YSIZE_TFT_800600/8))>>1) );
				CLR_IF();
			break;
		
		case MODE_TFT_8BIT_800600:
			SET_IF(); 
			#if (LCD_XSIZE_TFT_800600<64)
				while((rLCDCON1>>18)<=1); // if x<64
			#else	
				while((rLCDCON1>>18)==0); // if x>64
			#endif
				addr=(U32)frameBuffer8BitTft800600+(vx/1)+vy*(SCR_XSIZE_TFT_800600/1);
				rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
				rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_800600*LCD_YSIZE_TFT_800600))>>1));
				CLR_IF();
			break;
		
		case MODE_TFT_16BIT_800600:
			SET_IF(); 
			#if (LCD_XSIZE_TFT_800600<32)
				while((rLCDCON1>>18)<=1); // if x<32
			#else	
				while((rLCDCON1>>18)==0); // if x>32
			#endif
				addr=(U32)frameBuffer16BitTft800600+(vx*2)+vy*(SCR_XSIZE_TFT_800600*2);
				rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
				rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_800600*LCD_YSIZE_TFT_800600*2))>>1));
				CLR_IF();
			break;
		
		default:
			break;
    }   
}    
    

⌨️ 快捷键说明

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