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

📄 lcdlib.c

📁 2410开发测试程序
💻 C
📖 第 1 页 / 共 2 页
字号:
		rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off
}	

void Lcd_Lpc3600Enable(void)
{
	rLPCSEL&=~(7);
	rLPCSEL|=(7); // 240320,Enable LPC3600
}	

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
}	

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);
	}
}

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 + -