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

📄 lcdlib.c

📁 嵌入式2410板子上的LCD显示
💻 C
📖 第 1 页 / 共 3 页
字号:

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

/*********************************************************************************************
* name:		Lcd_MoveViewPort
* func:		screen scrolling  
* para:		int vx      --  horizontal pixel to move
*           int vy      --  vertical pixel to move
*           int type    --  lcd display mode.
* ret:		none
* modify:
* comment:		
*********************************************************************************************/

void Lcd_MoveViewPort(int vx,int vy,int type)
{
    UINT32T 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=(UINT32T)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=(UINT32T)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=(UINT32T)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=(UINT32T)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
        	
        	// Move 6Byte(4pixel)
        	addr=(UINT32T)frameBuffer12Bit+(vx*3/2)+vy*(SCR_XSIZE_CSTN*3/2); 
        	
        	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=(UINT32T)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=(UINT32T)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=(UINT32T)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=(UINT32T)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=(UINT32T)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=(UINT32T)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=(UINT32T)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=(UINT32T)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=(UINT32T)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=(UINT32T)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 + -