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

📄 lcdlib.c

📁 三星2413芯片的测试代码,对进行驱动开发很有帮助.
💻 C
📖 第 1 页 / 共 3 页
字号:
void Lcd_MoveViewPort(int vx,int vy,int type)
{
    U32 addr;
    switch(type)
    {
    	// 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.  

    case MODE_STN_1BIT:
    case MODE_CSTN_1BIT_P:
    	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:
    case MODE_CSTN_2BIT_P:
	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:
    case MODE_CSTN_4BIT_P:
	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:
    case MODE_CSTN_8BIT_P:
	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<32)
    	    while((rLCDCON1>>18)<=1); // if x<32
	#else	
    	    while((rLCDCON1>>18)==0); // if x>32
	#endif
    	addr=(U32)frameBuffer12Bit+(vx*2)+vy*(SCR_XSIZE_CSTN*2); // Move 6Byte(4pixel)
	rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
	rLCDSADDR2= M5D(((addr+(SCR_XSIZE_CSTN*LCD_YSIZE_CSTN*2))>>1));
	CLR_IF();
    break;
    	
	case MODE_CSTN_16BIT:
		SET_IF(); 
#if (LCD_XSIZE_CSTN<32)
		while((rLCDCON1>>18)<=1); // if x<32
#else 
		while((rLCDCON1>>18)==0); // if x>32
#endif
		addr=(U32)frameBuffer16Bit+(vx*2)+vy*(SCR_XSIZE_CSTN*2); 
		rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
		rLCDSADDR2= M5D(((addr+(SCR_XSIZE_CSTN*LCD_YSIZE_CSTN*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_24BIT_240320:
    	SET_IF(); 
	#if (LCD_XSIZE_TFT_240320<16)
    	    while((rLCDCON1>>18)<=1); // if x<16
	#else	
    	    while((rLCDCON1>>18)==0); // if x>16
	#endif
        addr=(U32)frameBuffer24BitTft240320+(vx*4)+vy*(SCR_XSIZE_TFT_240320*4);
	rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
	rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320*4))>>1));
	CLR_IF();
    break;

    case MODE_TFT_16BIT_320240:
    	SET_IF(); 
	#if (LCD_XSIZE_TFT_320240<32)
    	    while((rLCDCON1>>18)<=1); // if x<32
	#else	
    	    while((rLCDCON1>>18)==0); // if x>32
	#endif
        addr=(U32)frameBuffer16BitTft320240+(vx*2)+vy*(SCR_XSIZE_TFT_320240*2);
	rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
	rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_320240*LCD_YSIZE_TFT_320240*2))>>1));
	CLR_IF();
    break;

    case MODE_TFT_24BIT_320240:
    	SET_IF(); 
	#if (LCD_XSIZE_TFT_320240<16)
    	    while((rLCDCON1>>18)<=1); // if x<16
	#else	
    	    while((rLCDCON1>>18)==0); // if x>16
	#endif
        addr=(U32)frameBuffer24BitTft320240+(vx*4)+vy*(SCR_XSIZE_TFT_320240*4);
	rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
	rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_320240*LCD_YSIZE_TFT_320240*4))>>1));
	CLR_IF();
    break;    

    default:
    break;
    }   
}    
    
void SetGPIOforLDI(void)
{
#ifdef V14
	//GPIO Configuration for setting LDI
	rGPBDN |= (0x1<<6);
	rGPGDN |= (0x7<<5);
	rGPBDAT |= (0x1<<6);
	rGPGDAT |= (0x7<<5);
	rGPBCON = (rGPBCON & ~(0x3<<12))|(0x1<<12);
	rGPGCON = (rGPGCON & ~(0x3f<<10))|(0x15<<10);
#else
//GPIO Configuration for setting LDI
	rGPEDN |= (0x3<<12);
	rGPGDN |= (0x1<<2);
	rGPEDAT |= (0x3<<12);
	rGPGDAT |= (0x1<<2);
	rGPECON = (rGPECON & ~(0xf<<24))|(0x5<<24);
	rGPGCON = (rGPGCON & ~(0x3<<4))|(0x1<<4);
#endif	
}
    
void delayLoop(int count) 
{ 
    int j; 
    for(j = 0; j < count; j++)  ; 
}


void WriteLDI_LTS350(int address, int data)
{
 	unsigned char	dev_id_code=0x1D;
    int     j;
	//unsigned char DELAY=50;
	unsigned char DELAY=100;
		
	
	LCD_DEN_Hi; 		//	EN = High					CS high
	LCD_DCLK_Hi;							//	SCL High
	LCD_DSERI_Hi;							//	Data Low

	delayLoop(DELAY);

	LCD_DEN_Lo; 		//	EN = Low				CS Low
	delayLoop(DELAY);
	
	for (j = 5; j >= 0; j--)
	{	
		LCD_DCLK_Lo;							//	SCL Low

		if ((dev_id_code >> j) & 0x0001)	// DATA HIGH or LOW
		{
			LCD_DSERI_Hi;		
		}
		else
		{
			LCD_DSERI_Lo;
		}

		delayLoop(DELAY);

		LCD_DCLK_Hi;			// CLOCK = High
		delayLoop(DELAY);

	}
	
	// RS = "0" : index data
	LCD_DCLK_Lo;			// CLOCK = Low
	LCD_DSERI_Lo;
	delayLoop(DELAY);
	LCD_DCLK_Hi;			// CLOCK = High
	delayLoop(DELAY);

	// Write
	LCD_DCLK_Lo;			// CLOCK = Low
	LCD_DSERI_Lo;
	delayLoop(DELAY);
	LCD_DCLK_Hi;			// CLOCK = High
	delayLoop(DELAY);

	for (j = 15; j >= 0; j--)
	{
		LCD_DCLK_Lo;							//	SCL Low

		if ((address >> j) & 0x0001)	// DATA HIGH or LOW
		{
			LCD_DSERI_Hi;		
		}
		else
		{
			LCD_DSERI_Lo;
		}

		delayLoop(DELAY);

		LCD_DCLK_Hi;			// CLOCK = High
		delayLoop(DELAY);

	}
	LCD_DSERI_Hi;
	delayLoop(DELAY);
	
	LCD_DEN_Hi; 				// EN = High
	delayLoop(DELAY*10);

	LCD_DEN_Lo; 		//	EN = Low				CS Low
	delayLoop(DELAY);
	
	for (j = 5; j >= 0; j--)
	{	
		LCD_DCLK_Lo;							//	SCL Low

		if ((dev_id_code >> j) & 0x0001)	// DATA HIGH or LOW
		{
			LCD_DSERI_Hi;		
		}
		else
		{
			LCD_DSERI_Lo;
		}

		delayLoop(DELAY);

		LCD_DCLK_Hi;			// CLOCK = High
		delayLoop(DELAY);

	}
	
	// RS = "1" instruction data
	LCD_DCLK_Lo;			// CLOCK = Low
	LCD_DSERI_Hi;
	delayLoop(DELAY);
	LCD_DCLK_Hi;			// CLOCK = High
	delayLoop(DELAY);

	// Write
	LCD_DCLK_Lo;			// CLOCK = Low
	LCD_DSERI_Lo;
	delayLoop(DELAY);
	LCD_DCLK_Hi;			// CLOCK = High
	delayLoop(DELAY);

	for (j = 15; j >= 0; j--)
	{
		LCD_DCLK_Lo;							//	SCL Low

		if ((data >> j) & 0x0001)	// DATA HIGH or LOW
		{
			LCD_DSERI_Hi;		
		}
		else
		{
			LCD_DSERI_Lo;
		}

		delayLoop(DELAY);

		LCD_DCLK_Hi;			// CLOCK = High
		delayLoop(DELAY);

	}
	
	LCD_DEN_Hi; 				// EN = High
	delayLoop(DELAY);

}



void WriteLDI_LTS222(int address, int data)
{
    	int     j;
	//unsigned char DELAY=100;
	unsigned char DELAY=10;

	LCD_DEN_Hi; 		//	EN = High					CS high
//	LCD_DCLK_Lo;					
	LCD_DCLK_Hi;							//	SCL High
	LCD_DSERI_Lo;							//	Data Low


	delayLoop(DELAY);

	LCD_DEN_Lo; 		//	EN = Low				CS Low
	delayLoop(DELAY);

	LCD_DCLK_Lo;							//	SCL Low

	delayLoop(DELAY);

	for (j = 7; j >= 0; j--)
	{

		if ((address >> j) & 0x0001)	// DATA HIGH or LOW
			LCD_DSERI_Hi;
		else
			LCD_DSERI_Lo;

		delayLoop(DELAY);

		LCD_DCLK_Hi;			// CLOCK = High
		delayLoop(DELAY);

		if(j != 0)
		{
			LCD_DCLK_Lo;
			delayLoop(DELAY);			// CLOCK = Low
		}
	}

	LCD_DSERI_Lo;							// Data Low
	delayLoop(DELAY);

	LCD_DEN_Hi; 		//	EN = High
	delayLoop(DELAY);

	LCD_DEN_Lo; 		//	EN = Low
	delayLoop(DELAY);

	
	LCD_DCLK_Lo;
	delayLoop(DELAY);			// CLOCK = Low
	
	for (j = 7; j >= 0; j--)
	{

		if ((data >> j) & 0x0001)	// DATA HIGH or LOW
			LCD_DSERI_Hi;
		else
			LCD_DSERI_Lo;

		delayLoop(DELAY);

		LCD_DCLK_Hi;			// CLOCK = High
		delayLoop(DELAY);

		if(j != 0)
		{
			LCD_DCLK_Lo;
			delayLoop(DELAY);			// CLOCK = Low
		}
	}

	LCD_DEN_Hi; 				// EN = High
	delayLoop(DELAY);

}


void InitLDI_LTV350(void)
{


	SetGPIOforLDI();
	
#ifdef V14
	// LCD Reset
	rGPGDAT |= (1<<0);	// Reset High
	rGPGCON &= ~(3<<0);
	rGPGCON |= (1<<0);
	
	Delay(500);
	rGPGDAT &= ~(1<<0);	// Reset Low
	Delay(1000);
	//Delay(100);
	rGPGDAT |= (1<<0);	// Reset High
	Delay(100);
#else
	LCD_RESET_Hi;
	Delay(500);
	LCD_RESET_Lo;
	Delay(1000);
	LCD_RESET_Hi;
	Delay(100);
#endif

	
	
	
	LCD_DEN_Hi;
	LCD_DCLK_Hi;
	LCD_DSERI_Hi;
	  
	Delay(10);
	
    
    WriteLDI_LTS350(0x09,0x0000);
    
    Delay(200); // more than 10ms
    
    WriteLDI_LTS350(0x09,0x4000);    
    WriteLDI_LTS350(0x0a,0x2000);    
    
    WriteLDI_LTS350(0x09,0x4055);
    
    Delay(1000); // more than 50ms
    
	WriteLDI_LTS350(0x01,0x409d);
    WriteLDI_LTS350(0x02,0x0204); // note 1    
    WriteLDI_LTS350(0x03,0x0100);
    WriteLDI_LTS350(0x04,0x3000);
    WriteLDI_LTS350(0x05,0x4003);
    WriteLDI_LTS350(0x06,0x000a); // note 2 060707
    WriteLDI_LTS350(0x07,0x0021); // note 2 060707
	WriteLDI_LTS350(0x08,0x0c00);
    WriteLDI_LTS350(0x10,0x0103);
    WriteLDI_LTS350(0x11,0x0301);
    WriteLDI_LTS350(0x12,0x1f0f);
    WriteLDI_LTS350(0x13,0x1f0f);
    WriteLDI_LTS350(0x14,0x0707);
    WriteLDI_LTS350(0x15,0x0307);
    WriteLDI_LTS350(0x16,0x0707);
    WriteLDI_LTS350(0x17,0x0000);
    WriteLDI_LTS350(0x18,0x0004);
    WriteLDI_LTS350(0x19,0x0000);

	
    Delay(1000); // more than 2 frames
    

    WriteLDI_LTS350(0x09,0x4a55);
    WriteLDI_LTS350(0x05,0x5003);
    
}


void InitLDI_LTS222(void)
{

⌨️ 快捷键说明

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