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

📄 lcdlib.c

📁 三星2413芯片的测试代码,对进行驱动开发很有帮助.
💻 C
📖 第 1 页 / 共 3 页
字号:
//====================================================================
// File Name : lcdlib.c
// Function  : S3C2412 LCD configuration low-level codes
// Date      : Apr. 21, 2006
// Version   : S3C2412
//====================================================================


#include <stdio.h>
#include <stdlib.h>

#include "def.h"
#include "2413addr.h"
#include "lcdlib.h"
#include "demo256.h"

#define V14

#ifdef V14
#define LCD_DEN		(1<<6)   //GPB6,  nSS
#define LCD_DSERI	(1<<6)  //GPG6, SPIMOSI
#define LCD_DCLK	(1<<7)  //GPG7, SPICLK
#define LCD_RESET   (1<<5)	//GPG5, RESET
#define LCD_DEN_Lo		(rGPBDAT&= ~LCD_DEN)
#define LCD_DEN_Hi		(rGPBDAT |=	LCD_DEN)
#define LCD_DCLK_Lo		(rGPGDAT &= ~LCD_DCLK)
#define LCD_DCLK_Hi		(rGPGDAT |=	LCD_DCLK)
#define LCD_DSERI_Lo	(rGPGDAT &= ~LCD_DSERI)
#define LCD_DSERI_Hi	(rGPGDAT |=	LCD_DSERI)
#define LCD_RESET_Lo	(rGPGDAT &= ~LCD_RESET)
#define LCD_RESET_Hi	(rGPGDAT |= LCD_RESET)
#else
#define LCD_DEN		(1<<2)   //GPG2,  nSS
#define LCD_DSERI	(1<<12)  //GPE12, SPIMOSI
#define LCD_DCLK	(1<<13)  //GPE13, SPICLK
#define LCD_RESET     (0)
#define LCD_DEN_Lo		(rGPGDAT&= ~LCD_DEN)
#define LCD_DEN_Hi		(rGPGDAT |=	LCD_DEN)
#define LCD_DCLK_Lo		(rGPEDAT &= ~LCD_DCLK)
#define LCD_DCLK_Hi		(rGPEDAT |=	LCD_DCLK)
#define LCD_DSERI_Lo	(rGPEDAT &= ~LCD_DSERI)
#define LCD_DSERI_Hi	(rGPEDAT |=	LCD_DSERI)
#define LCD_RESET_Lo	(0)
#define LCD_RESET_Hi	(1)
#endif





//Mono STN
U32 (*frameBuffer1Bit)[SCR_XSIZE_STN/32];
//Gray
U32 (*frameBuffer2Bit)[SCR_XSIZE_STN/16];
U32 (*frameBuffer4Bit)[SCR_XSIZE_STN/8];
//Color STN
U32 (*frameBuffer8Bit)[SCR_XSIZE_CSTN/4];
U32 (*frameBuffer12Bit)[SCR_XSIZE_CSTN/2];
U32 (*frameBuffer16Bit)[SCR_XSIZE_CSTN/2];
//TFT 240320
U32 (*frameBuffer8BitTft240320)[SCR_XSIZE_TFT_240320/4];
U32 (*frameBuffer16BitTft240320)[SCR_XSIZE_TFT_240320/2];
U32 (*frameBuffer24BitTft240320)[SCR_XSIZE_TFT_240320];
//TFT 320240
U32 (*frameBuffer8BitTft320240)[SCR_XSIZE_TFT_320240/4];
U32 (*frameBuffer16BitTft320240)[SCR_XSIZE_TFT_320240/2];
U32 (*frameBuffer24BitTft320240)[SCR_XSIZE_TFT_320240];

unsigned save_rGPCDN,save_rGPCDAT,save_rGPCCON;
unsigned save_rGPDDN,save_rGPDDAT,save_rGPDCON; 
unsigned save_rGPBDN,save_rGPBDAT,save_rGPBCON; 
unsigned lcd_count;

void Lcd_Init(int type)
{
    switch(type)
    {
		case MODE_TFT_8BIT_240320:
			frameBuffer8BitTft240320=(U32 (*)[SCR_XSIZE_TFT_240320/4])LCDFRAMEBUFFER;
			rLCDCON1=(CLKVAL_TFT_240320<<8)|(MVAL_USED<<7)|(3<<5)|(11<<1)|0;
			rLCDCON2=(VBPD_240320<<24)|(LINEVAL_TFT_240320<<14)|(VFPD_240320<<6)|(VSPW_240320);
			rLCDCON3=(HBPD_240320<<19)|(HOZVAL_TFT_240320<<8)|(HFPD_240320);
			rLCDCON4=(MVAL<<8)|(HSPW_240320);
			rLCDCON5=(1<<11)|(1<<9)|(1<<8);
			rLCDSADDR1=(((U32)frameBuffer8BitTft240320>>22)<<21)|M5D((U32)frameBuffer8BitTft240320>>1);
			rLCDSADDR2=M5D( ((U32)frameBuffer8BitTft240320+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320/1))>>1 );
			rLCDSADDR3=(((SCR_XSIZE_TFT_240320-LCD_XSIZE_TFT_240320)/2)<<11)|(LCD_XSIZE_TFT_240320/2);
			rLCDINTMSK|=(3);
			rTCONSEL =0;
			rTPAL=0;
		break;
		case MODE_TFT_16BIT_240320:
			frameBuffer16BitTft240320=(U32 (*)[SCR_XSIZE_TFT_240320/2])LCDFRAMEBUFFER;
			rLCDCON1=(CLKVAL_TFT_240320<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;
			rLCDCON2=(VBPD_240320<<24)|(LINEVAL_TFT_240320<<14)|(VFPD_240320<<6)|(VSPW_240320);
			rLCDCON3=(HBPD_240320<<19)|(HOZVAL_TFT_240320<<8)|(HFPD_240320);
			rLCDCON4=(MVAL<<8)|(HSPW_240320);
			rLCDCON5=(1<<11)|(1<<9)|(1<<8);
			rLCDSADDR1=(((U32)frameBuffer16BitTft240320>>22)<<21)|M5D((U32)frameBuffer16BitTft240320>>1);
			rLCDSADDR2=M5D( ((U32)frameBuffer16BitTft240320+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320*2))>>1 );
			rLCDSADDR3=(((SCR_XSIZE_TFT_240320-LCD_XSIZE_TFT_240320)/1)<<11)|(LCD_XSIZE_TFT_240320/1);
			rLCDINTMSK|=(3);
			rTCONSEL=0;
			rTPAL=0;
		break;
		case MODE_TFT_24BIT_240320:
			frameBuffer24BitTft240320=(U32 (*)[SCR_XSIZE_TFT_240320])LCDFRAMEBUFFER;
			rLCDCON1=(CLKVAL_TFT_240320<<8)|(3<<5)|(13<<1)|0;
			rLCDCON2=(VBPD_240320<<24)|(LINEVAL_TFT_240320<<14)|(VFPD_240320<<6)|(VSPW_240320);
			rLCDCON3=(HBPD_240320<<19)|(HOZVAL_TFT_240320<<8)|(HFPD_240320);
			rLCDCON4=(MVAL<<8)|(HSPW_240320);
			rLCDCON5=(0<<12)|(1<<9)|(1<<8);
			rLCDSADDR1=(((U32)frameBuffer24BitTft240320>>22)<<21)|M5D((U32)frameBuffer24BitTft240320>>1);
			rLCDSADDR2=M5D( ((U32)frameBuffer24BitTft240320+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320*4))>>1 );
			rLCDSADDR3=(((SCR_XSIZE_TFT_240320-LCD_XSIZE_TFT_240320)*2)<<11)|(LCD_XSIZE_TFT_240320*2);
			rLCDINTMSK|=(3);
			rTCONSEL&=0;
			rTPAL=0;
		break;	
		case MODE_TFT_24BIT_320240:
			frameBuffer24BitTft320240=(U32 (*)[SCR_XSIZE_TFT_320240])LCDFRAMEBUFFER;
			rLCDCON1=(CLKVAL_TFT_320240<<8)|(3<<5)|(13<<1)|0;
			rLCDCON2=(VBPD_320240<<24)|(LINEVAL_TFT_320240<<14)|(VFPD_320240<<6)|(VSPW_320240);
			rLCDCON3=(HBPD_320240<<19)|(HOZVAL_TFT_320240<<8)|(HFPD_320240);
			rLCDCON4=(MVAL<<8)|(HSPW_320240);
			rLCDCON5=(0<<12)|(1<<10)|(1<<9)|(1<<8);
			rLCDSADDR1=(((U32)frameBuffer24BitTft320240>>22)<<21)|M5D((U32)frameBuffer24BitTft320240>>1);
			rLCDSADDR2=M5D( ((U32)frameBuffer24BitTft320240+(SCR_XSIZE_TFT_320240*LCD_YSIZE_TFT_320240*4))>>1 );
			rLCDSADDR3=(((SCR_XSIZE_TFT_320240-LCD_XSIZE_TFT_320240)*2)<<11)|(LCD_XSIZE_TFT_320240*2);
			rLCDINTMSK|=(3);
			rTCONSEL=0;
			rTPAL=0;
		break;
		case MODE_TFT_16BIT_320240:
			frameBuffer16BitTft320240=(U32 (*)[SCR_XSIZE_TFT_320240/2])LCDFRAMEBUFFER;
			rLCDCON1=(CLKVAL_TFT_320240<<8)|(3<<5)|(12<<1)|0;
			rLCDCON2=(VBPD_320240<<24)|(LINEVAL_TFT_320240<<14)|(VFPD_320240<<6)|(VSPW_320240);
			rLCDCON3=(HBPD_320240<<19)|(HOZVAL_TFT_320240<<8)|(HFPD_320240);
			rLCDCON4=(MVAL<<8)|(HSPW_320240);
			rLCDCON5=(1<<11)|(1<<10)|(1<<9)|(1<<8);
			rLCDSADDR1=(((U32)frameBuffer16BitTft320240>>22)<<21)|M5D((U32)frameBuffer16BitTft320240>>1);
			rLCDSADDR2=M5D( ((U32)frameBuffer16BitTft320240+(SCR_XSIZE_TFT_320240*LCD_YSIZE_TFT_320240*2))>>1 );
			rLCDSADDR3=(((SCR_XSIZE_TFT_320240-LCD_XSIZE_TFT_320240)/1)<<11)|(LCD_XSIZE_TFT_320240/1);
			rLCDINTMSK|=(3);
			rTCONSEL=0;
			rTPAL=0;
		break;
		case MODE_CSTN_1BIT_P:
			frameBuffer1Bit=(U32 (*)[SCR_XSIZE_CSTN/32])LCDFRAMEBUFFER;
			LutSetting(MODE_CSTN_1BIT_P);
			FrcSetting();		
			CstnCommonSetting();
    	
			rLCDCON1=(CLKVAL_CSTN<<8)|(0<<7)|(2<<5)|(0<<1)|0;
			rLCDCON5=(1<<11)|(0); 

			rLCDSADDR1=(((U32)frameBuffer1Bit>>22)<<21)|M5D((U32)frameBuffer1Bit>>1);
			//rLCDSADDR2=M5D(((U32)frameBuffer1Bit+((LCD_XSIZE_CSTN/8)*LCD_YSIZE_CSTN))>>1);
			//rLCDSADDR3=(0<<11)|(LCD_XSIZE_CSTN/16);	
			rLCDSADDR2=M5D(((U32)frameBuffer1Bit+((SCR_XSIZE_CSTN/8)*LCD_YSIZE_CSTN))>>1);
			rLCDSADDR3=(((SCR_XSIZE_CSTN-LCD_XSIZE_CSTN)/16)<<11)|(LCD_XSIZE_CSTN/16);	
		break;		
		case MODE_CSTN_2BIT_P:
			frameBuffer2Bit=(U32 (*)[SCR_XSIZE_CSTN/16])LCDFRAMEBUFFER;
			LutSetting(MODE_CSTN_2BIT_P);
			FrcSetting();
		
			CstnCommonSetting();
    	
			rLCDCON1=(CLKVAL_CSTN<<8)|(0<<7)|(2<<5)|(1<<1)|0;
			rLCDCON5=(1<<11)|(0); 

			rLCDSADDR1=(((U32)frameBuffer2Bit>>22)<<21)|M5D((U32)frameBuffer2Bit>>1);
			//rLCDSADDR2=M5D(((U32)frameBuffer2Bit+((LCD_XSIZE_CSTN/4)*LCD_YSIZE_CSTN))>>1);
			//rLCDSADDR3=(0<<11)|(LCD_XSIZE_CSTN/8);
			rLCDSADDR2=M5D(((U32)frameBuffer2Bit+((SCR_XSIZE_CSTN/4)*LCD_YSIZE_CSTN))>>1);
			rLCDSADDR3=(((SCR_XSIZE_CSTN-LCD_XSIZE_CSTN)/8)<<11)|(LCD_XSIZE_CSTN/8);
				
		break;    
		case MODE_CSTN_4BIT_P:
			frameBuffer4Bit=(U32 (*)[SCR_XSIZE_CSTN/8])LCDFRAMEBUFFER;
			LutSetting(MODE_CSTN_4BIT_P);
			FrcSetting();
		
			CstnCommonSetting();
    	
			rLCDCON1=(CLKVAL_CSTN<<8)|(0<<7)|(2<<5)|(2<<1)|0;
			rLCDCON5=(1<<11)|(0); 

			rLCDSADDR1=(((U32)frameBuffer4Bit>>22)<<21)|M5D((U32)frameBuffer4Bit>>1);
			//rLCDSADDR2=M5D(((U32)frameBuffer4Bit+((LCD_XSIZE_CSTN/2)*LCD_YSIZE_CSTN))>>1);
			//rLCDSADDR3=(0<<11)|(LCD_XSIZE_CSTN/4);	
			rLCDSADDR2=M5D(((U32)frameBuffer4Bit+((SCR_XSIZE_CSTN/2)*LCD_YSIZE_CSTN))>>1);
			rLCDSADDR3=(((SCR_XSIZE_CSTN-LCD_XSIZE_CSTN)/4)<<11)|(LCD_XSIZE_CSTN/4);
		break;
		case MODE_CSTN_8BIT_P:
			frameBuffer8Bit=(U32 (*)[SCR_XSIZE_CSTN/8])LCDFRAMEBUFFER;
			LutSetting(MODE_CSTN_8BIT_P);
			FrcSetting();
		
			CstnCommonSetting();
    	
			rLCDCON1=(CLKVAL_CSTN<<8)|(0<<7)|(2<<5)|(3<<1)|0;
			rLCDCON5=(1<<11)|(0); 

			rLCDSADDR1=(((U32)frameBuffer8Bit>>22)<<21)|M5D((U32)frameBuffer8Bit>>1);
			//rLCDSADDR2=M5D(((U32)frameBuffer8Bit+((LCD_XSIZE_CSTN)*LCD_YSIZE_CSTN))>>1);
			//rLCDSADDR3=(0<<11)|(LCD_XSIZE_CSTN/4);	
			rLCDSADDR2=M5D(((U32)frameBuffer8Bit+((SCR_XSIZE_CSTN)*LCD_YSIZE_CSTN))>>1);
			rLCDSADDR3=(((SCR_XSIZE_CSTN-LCD_XSIZE_CSTN)/2)<<11)|(LCD_XSIZE_CSTN/2);
		break;
		case MODE_CSTN_8BIT:
			frameBuffer8Bit=(U32 (*)[SCR_XSIZE_CSTN/4])LCDFRAMEBUFFER;
			LutSetting(MODE_CSTN_8BIT);
			FrcSetting();
		
			CstnCommonSetting();
    	
			rLCDCON1=(CLKVAL_CSTN<<8)|(0<<7)|(2<<5)|(4<<1)|0;
			rLCDCON5=(1<<11)|(0); 

			rLCDSADDR1=(((U32)frameBuffer8Bit>>22)<<21)|M5D((U32)frameBuffer8Bit>>1);
			//rLCDSADDR2=M5D(((U32)frameBuffer8Bit+((LCD_XSIZE_CSTN)*LCD_YSIZE_CSTN))>>1);
			//rLCDSADDR3=(0<<11)|(LCD_XSIZE_CSTN/2);	
			rLCDSADDR2=M5D(((U32)frameBuffer8Bit+((SCR_XSIZE_CSTN)*LCD_YSIZE_CSTN))>>1);
			rLCDSADDR3=(((SCR_XSIZE_CSTN-LCD_XSIZE_CSTN)/2)<<11)|(LCD_XSIZE_CSTN/2);	
		break;        
		case MODE_CSTN_12BIT:
			frameBuffer12Bit=(U32 (*)[SCR_XSIZE_CSTN/2])LCDFRAMEBUFFER;
			LutSetting(MODE_CSTN_12BIT);
			FrcSetting();
		
			CstnCommonSetting();
    	
			rLCDCON1=(CLKVAL_CSTN<<8)|(0<<7)|(2<<5)|(5<<1)|0;
			rLCDCON5=(1<<11)|(1);

			rLCDSADDR1=(((U32)frameBuffer12Bit>>22)<<21)|M5D((U32)frameBuffer12Bit>>1);
			//rLCDSADDR2=M5D(((U32)frameBuffer12Bit+((LCD_XSIZE_CSTN*2)*LCD_YSIZE_CSTN))>>1);
			//rLCDSADDR3=(0<<11)|(LCD_XSIZE_CSTN);	
			rLCDSADDR2=M5D(((U32)frameBuffer12Bit+((SCR_XSIZE_CSTN*2)*LCD_YSIZE_CSTN))>>1);
			rLCDSADDR3=(((SCR_XSIZE_CSTN-LCD_XSIZE_CSTN))<<11)|(LCD_XSIZE_CSTN);	
		break;
		case MODE_CSTN_16BIT:
			frameBuffer16Bit=(U32 (*)[SCR_XSIZE_CSTN/2])LCDFRAMEBUFFER;
			LutSetting(MODE_CSTN_16BIT);
			FrcSetting();
		
			CstnCommonSetting();
				
			rLCDCON1=(CLKVAL_CSTN<<8)|(0<<7)|(2<<5)|(6<<1)|0;
			rLCDCON5=(1<<11)|(1);
    	
			rLCDSADDR1=(((U32)frameBuffer16Bit>>22)<<21)|M5D((U32)frameBuffer16Bit>>1);
			//rLCDSADDR2=M5D(((U32)frameBuffer16Bit+((LCD_XSIZE_CSTN*2)*LCD_YSIZE_CSTN))>>1);
			//rLCDSADDR3= (0<<11)|(LCD_XSIZE_CSTN);
			rLCDSADDR2=M5D(((U32)frameBuffer16Bit+((SCR_XSIZE_CSTN*2)*LCD_YSIZE_CSTN))>>1);
			rLCDSADDR3=(((SCR_XSIZE_CSTN-LCD_XSIZE_CSTN))<<11)|(LCD_XSIZE_CSTN);	
			rTPAL=0;	
		break;
		case MODE_STN_1BIT:
			frameBuffer1Bit=(U32 (*)[SCR_XSIZE_STN/32])LCDFRAMEBUFFER;
			LutSetting(MODE_STN_1BIT);
			FrcSetting();		
		
			StnCommonSetting();
    	
			rLCDCON1=(CLKVAL_STN_MONO<<8)|(1<<7)|(1<<5)|(0<<1)|0;
			rLCDCON5=(1<<11)|(0); 

			rLCDSADDR1=(((U32)frameBuffer1Bit>>22)<<21)|M5D((U32)frameBuffer1Bit>>1);
			//rLCDSADDR2=M5D(((U32)frameBuffer1Bit+((LCD_XSIZE_STN/8)*LCD_YSIZE_STN))>>1);
			//rLCDSADDR3=(0<<11)|(LCD_XSIZE_STN/16);
			rLCDSADDR2=M5D(((U32)frameBuffer1Bit+((SCR_XSIZE_STN/8)*LCD_YSIZE_STN))>>1);
			rLCDSADDR3=(((SCR_XSIZE_STN-LCD_XSIZE_STN)/16)<<11)|(LCD_XSIZE_STN/16);	
		break;
		case MODE_STN_2BIT:
			frameBuffer2Bit=(U32 (*)[SCR_XSIZE_STN/16])LCDFRAMEBUFFER;
			LutSetting(MODE_STN_2BIT);
			FrcSetting();
					
			StnCommonSetting();
    	
			rLCDCON1=(CLKVAL_STN_GRAY<<8)|(1<<7)|(1<<5)|(1<<1)|0;
			rLCDCON5=(1<<11)|(0); 
			rLCDCON3 = (rLCDCON3& ~(0xff))|(LINEBLANK_GRAY);

			rLCDSADDR1=(((U32)frameBuffer2Bit>>22)<<21)|M5D((U32)frameBuffer2Bit>>1);
			//rLCDSADDR2=M5D(((U32)frameBuffer2Bit+((LCD_XSIZE_STN/4)*LCD_YSIZE_STN))>>1);
			//rLCDSADDR3=(0<<11)|(LCD_XSIZE_STN/8);	
			rLCDSADDR2=M5D(((U32)frameBuffer2Bit+((SCR_XSIZE_STN/4)*LCD_YSIZE_STN))>>1);
			rLCDSADDR3=(((SCR_XSIZE_STN-LCD_XSIZE_STN)/8)<<11)|(LCD_XSIZE_STN/8);				
		break;
		case MODE_STN_4BIT:
			frameBuffer4Bit=(U32 (*)[SCR_XSIZE_STN/8])LCDFRAMEBUFFER;
			LutSetting(MODE_STN_4BIT);
			FrcSetting();
					
			StnCommonSetting();
    	
	    	rLCDCON1=(CLKVAL_STN_GRAY<<8)|(1<<7)|(1<<5)|(2<<1)|0;
	    	rLCDCON5=(1<<11)|(0); 
	    	rLCDCON3 = (rLCDCON3& ~(0xff))|(LINEBLANK_GRAY);


	    	rLCDSADDR1=(((U32)frameBuffer4Bit>>22)<<21)|M5D((U32)frameBuffer4Bit>>1);
	    	//rLCDSADDR2=M5D(((U32)frameBuffer4Bit+((LCD_XSIZE_STN/2)*LCD_YSIZE_STN))>>1);
	    	//rLCDSADDR3=(0<<11)|(LCD_XSIZE_STN/4);	
	    	rLCDSADDR2=M5D(((U32)frameBuffer4Bit+((SCR_XSIZE_STN/2)*LCD_YSIZE_STN))>>1);
			rLCDSADDR3=(((SCR_XSIZE_STN-LCD_XSIZE_STN)/4)<<11)|(LCD_XSIZE_STN/4);	
    	break;
    
    	default:
    	break;
    }	
}


void Lcd_Port_Init(void)
{
    save_rGPCCON=rGPCCON;
    save_rGPCDAT=rGPCDAT;
    save_rGPCDN=rGPCDN;
    save_rGPDCON=rGPDCON;
    save_rGPDDAT=rGPDDAT;
    save_rGPDDN=rGPDDN;
    save_rGPBCON=rGPBCON;
    save_rGPBDN=rGPBDN;
    save_rGPBDAT=rGPBDAT;
    rGPCDAT &= ~(1<<4);
    rGPCDN=0xffff; // Disable Pull-up register
    rGPCCON=0xaaaaa9a8; //Initialize VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND 
    rGPDDN=0xffff; // Disable Pull-up register
    rGPDCON=0xaaaaaaaa; //Initialize VD[23:8]
    rGPBDN |= (0x1<<5);
	rGPBCON = (rGPBCON & ~(0x3<<10))|(0x1<<10);

}


void Lcd_Port_Return(void)
{
    rGPCCON=save_rGPCCON;
    rGPCDAT=save_rGPCDAT;
    rGPCDN=save_rGPCDN;
    rGPDCON=save_rGPDCON;
    rGPDDAT=save_rGPDDAT;
    rGPDDN=save_rGPDDN;
}

void Lcd_Palette8Bit_Init(void)
{
    int i;	
    U32 *palette;
    rLCDCON5|=(1<<11); // 5:6:5 Palette Setting
    palette=(U32 *)0x4d000400;
    for(i=0;i<256;i++)
	*palette++=DEMO256pal[i];
}

void __irq IsrLcdFrame(void)
{

	rINTMSK |= BIT_LCD;
	rLCDINTMSK |= 3;
	rGPHDAT &= ~(1<<10);
	printf(".");
	rGPHDAT |= (1<<10);
	rLCDSRCPND = (1<<1);
	rLCDINTPND = (1<<1);
	ClearPending(BIT_LCD);	
	rLCDINTMSK &= ~(2);
	rINTMSK &= ~BIT_LCD;
	
}


void __irq IsrLcdFifo(void)
{

	rINTMSK |= BIT_LCD;
	rLCDINTMSK |= 3;
	printf("fi\n");
	rLCDSRCPND = (1);
	rLCDINTPND = (1);
	ClearPending(BIT_LCD);	
	rLCDINTMSK &= ~(1);
	rINTMSK &= ~BIT_LCD;
	
}


void Lcd_EnvidOnOff(int onoff)
{
    if(onoff==1)
		rLCDCON1 |=1; // ENVID=ON
    else
		rLCDCON1 &= ~(1); // ENVID Off
}    

void Lcd_CstnOnOff(int onoff)
{
    if(onoff==1)
    	rLCDCON1|=1; // ENVID=ON
    else
		rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off
}   


void Lcd_PowerEnable(int invpwren,int pwren)
{

	rGPBDN |= 0x1;
	rGPBDAT |= 0x1;
	rGPGDN |= (1<<4);
	rGPGDAT |= (1<<4);
	rGPGCON = (rGPGCON & ~(0x3<<8))|(1<<8);
	rGPBCON = (rGPBCON & ~(0x3<<10))|(0x1);
}    

void Lcd_PowerEnableCstn(int type)
{

	if(type == 1)	
		rGPBDAT |= (0x1<<5);
	else
		rGPBDAT &= ~(0x1<<5);
}

void MoveViewPort(int type)
{
    int vx=0,vy=0,vd;
	// minimum movement offset
	vd=	(type==MODE_STN_1BIT)*16+(type==MODE_STN_2BIT)*8+(type==MODE_STN_4BIT)*4
		+(type==MODE_CSTN_1BIT_P)*16+(type==MODE_CSTN_2BIT_P)*8+(type==MODE_CSTN_4BIT_P)*4+(type==MODE_CSTN_8BIT_P)*2
        +(type==MODE_CSTN_8BIT)*2+(type==MODE_CSTN_12BIT)*4+(type==MODE_CSTN_16BIT)*1
        +(type==MODE_TFT_1BIT_240320)*16+(type==MODE_TFT_8BIT_240320)*2+(type==MODE_TFT_16BIT_240320)*1+(type==MODE_TFT_24BIT_240320)
        +(type==MODE_TFT_16BIT_320240)*1+(type==MODE_TFT_24BIT_320240);        

    while(1)
    {
    	switch(getchar())
    	{
    	case 'i':
		    if(vy>=vd)vy-=vd;    	   	
        break;

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

    	case 'k':
		    if((type&0x4000)&&(type&0x800))		  
		    {
	            if(vx<=(SCR_XSIZE_TFT_320240-LCD_XSIZE_TFT_320240-vd))vx+=vd;   	    
		    }
		    else if((type&0x4000)&&(type&0x100)) 
		    {
	            if(vx<=(SCR_XSIZE_TFT_240320-LCD_XSIZE_TFT_240320-vd))vx+=vd;   	    
		    }
	        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&0x800))
            {
                if(vy<=(SCR_YSIZE_TFT_320240-LCD_YSIZE_TFT_320240-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 0x0a:
	   	    return;

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


⌨️ 快捷键说明

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