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

📄 lcdlib.c

📁 三星s3c2460开发板完整功能测试代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	unsigned int compkey, colval;

	redkey=greenkey=bluekey=0xff;
	redcol=greencol=bluecol=0x0;

	switch(displaytype&0xf) {
		case 3: //8BPP palettized.
			if(((rLCDCON2>>9)&0x3)==1) {//666
				redkey&=(0x3);
				greenkey&=(0x3);
				bluekey&=(0x3);
				redcol=(0xfc);
				greencol=0;
				bluecol=0;
			}	
			else if(((rLCDCON2>>9)&0x3)==2) {//565
				redkey&=(0x7);
				greenkey&=(0x3);
				bluekey&=(0x7);				
				redcol=(0xf8);
				greencol=0;
				bluecol=0;
			}
			else if(((rLCDCON2>>9)&0x3)==3) {//5551
				redkey &= (0x7);
				greenkey &= (0x7);
				bluekey &= (0x6);
				redcol=(0xf8);
				greencol=0;
				bluecol=1;				
			}	
			break;
		case 4: //8BPP non-palettized.
			redkey &= (0x1f);
			greenkey &= (0x1f);
			bluekey &= (0x3f);
			redcol=(0xc0);
			greencol=0;
			bluecol=0;			
			break;
		case 5: //16BPP 565
			redkey &= (0x7);
			greenkey &= (0x3);
			bluekey &= (0x7);
			redcol=(0xf8);
			greencol=0;
			bluecol=0;			
			break;
		case 6: //16BPP 5551
			redkey &= (0x7);
			greenkey &= (0x7);
			bluekey &= (0x6);	
			redcol=(0xf8);
			greencol=0;
			bluecol=1;			
			break;
		case 7: //24BPP
			redkey &= (0x3);
			greenkey &= (0x3);
			bluekey &= (0x3);
			redcol=(0xfc);
			greencol=0;
			bluecol=0;			
			break;
		default:
			break;		
		}
	compkey=(redkey<<16)|(greenkey<<8)|(bluekey);
	colval=(redcol<<16)|(greencol<<8)|(bluecol);

	rLCDKEYCON=(rLCDKEYCON&~(0x1ffffff))|(0<<24)|(0xffffff&compkey);
	rLCDKEYVAL=(0xffffff&colval);
	
}

void LcdSetColorKey(unsigned int direction, unsigned int compkey, unsigned int colval)
{

	rLCDKEYCON=(rLCDKEYCON&~(0x1ffffff))|((0x1&direction)<<24)|(0xffffff&compkey);
	rLCDKEYVAL=(0xffffff&colval);
	

}

void MoveViewPort(unsigned int displaytype, unsigned int whichframebuffer)
{
	unsigned int vframewidth, framewidth, vframeheight, frameheight;
	int vx=0,vy=0,vd;
	vd=((displaytype&0xf)==0x0)*32+((displaytype&0xf)==0x1)*16+((displaytype&0xf)==0x2)*8+((displaytype&0xf)==0x3)*4
        +((displaytype&0xf)==0x4)*4+((displaytype&0xf)==0x5)*2+((displaytype&0xf)==0x6)*2 +((displaytype&0xf)==0x7)*1;        

	switch(displaytype&0xff00) {
		case 0x1100:
		case 0x2100:	
			vframewidth=BG_VXSIZE_176220;
			framewidth=BG_XSIZE_176220;
			vframeheight=BG_VYSIZE_176220;
			frameheight=BG_YSIZE_176220;
			break;
		case 0x1200:
		case 0x2200:
			vframewidth=BG_VXSIZE_240320;
			framewidth=BG_XSIZE_240320;
			vframeheight=BG_VYSIZE_240320;
			frameheight=BG_YSIZE_240320;			
			break;
		case 0x1400:
		case 0x2400:
			vframewidth=BG_VXSIZE_640480;
			framewidth=BG_XSIZE_640480;
			vframeheight=BG_VYSIZE_640480;			
			frameheight=BG_YSIZE_640480;			
			break;
		case 0x1800:
		case 0x2800:
			vframewidth=BG_VXSIZE_800600;
			framewidth=BG_XSIZE_800600;
			vframeheight=BG_VYSIZE_800600;
			frameheight=BG_YSIZE_800600;			
			break;
		case 0x4100:
			vframewidth=FG_VXSIZE_176220;
			framewidth=FG_XSIZE_176220;
			vframeheight=FG_VYSIZE_176220;			
			frameheight=FG_YSIZE_176220;
			break;
		case 0x4200:
			vframewidth=FG_VXSIZE_240320;
			framewidth=FG_XSIZE_240320;
			vframeheight=FG_VYSIZE_240320;				
			frameheight=FG_YSIZE_240320;
			break;
		case 0x4400:
			vframewidth=FG_VXSIZE_640480;
			framewidth=FG_XSIZE_640480;
			vframeheight=FG_VYSIZE_640480;				
			frameheight=FG_YSIZE_640480;
			break;			
		case 0x4800:
			vframewidth=FG_VXSIZE_800600;
			framewidth=FG_XSIZE_800600;
			vframeheight=FG_VYSIZE_800600;				
			frameheight=FG_YSIZE_800600;
			break;			
		default:
			break;			
	}


	while(1) {
		switch(getchar()) {
			case 'i':
				if(vy>=vd)vy-=vd;    	   	
				break;
			case 'j':
				if(vx>=vd)vx-=vd;
				break;
			case 'k':
				if(vx<=(vframewidth-framewidth-vd))vx+=vd;   	    
				break;
			case 'm':
				if(vy<=(vframeheight-frameheight-vd))vy+=vd;   	    
				break;
			case 0x0a:
				return;
			default:
				break;
		}
		printf("vx=%3d,vy=%3d\n",vx,vy);
		LcdMoveViewPort(vx,vy, displaytype, whichframebuffer);
	}

}


void LcdMoveViewPort(int vx,int vy, unsigned int displaytype, unsigned int whichframebuffer)
{
	unsigned int addr;
	unsigned int vframewidth, frameheight;
	unsigned int bytefactor;


	switch(displaytype&0xf) {
		case 0x0:
			bytefactor=1;
			break;
		case 0x1:
			bytefactor=2;
			break;
		case 0x2:
			bytefactor=4;
			break;
		case 0x3:
			bytefactor=8;
			break;
		case 0x4:	
			bytefactor=8;
			break;
		case 0x5:
			bytefactor=16;
			break;
		case 0x6:
			bytefactor=16;
			break;
		case 0x7:
			bytefactor=32;
			break;			
		default:
			break;
	}			

	switch(displaytype&0xff00) {
		case 0x1100:
		case 0x2100:	
			vframewidth=BG_VXSIZE_176220;
			frameheight=BG_YSIZE_176220;
			break;
		case 0x1200:
		case 0x2200:
			vframewidth=BG_VXSIZE_240320;
			frameheight=BG_YSIZE_240320;			
			break;
		case 0x1400:
		case 0x2400:
			vframewidth=BG_VXSIZE_640480;
			frameheight=BG_YSIZE_640480;			
			break;
		case 0x1800:
		case 0x2800:
			vframewidth=BG_VXSIZE_800600;
			frameheight=BG_YSIZE_800600;			
			break;
		case 0x4100:
			vframewidth=FG_VXSIZE_176220;
			frameheight=FG_YSIZE_176220;
			break;
		case 0x4200:
			vframewidth=FG_VXSIZE_240320;
			frameheight=FG_YSIZE_240320;
			break;
		case 0x4400:
			vframewidth=FG_VXSIZE_640480;
			frameheight=FG_YSIZE_640480;
			break;			
		case 0x4800:
			vframewidth=FG_VXSIZE_800600;
			frameheight=FG_YSIZE_800600;
			break;			
		default:
			break;			
	}	

	switch(whichframebuffer) {
		case BGBUFFER1:
			// The processor mode should be superviser mode.  
			SET_IF();
			while(((rLCDCON2&(0x7ff<<15))>>15)!=1);
			addr=(LCDFRAMEBUFFERBG1+(vx*bytefactor/8)+vy*(vframewidth*bytefactor/8));
			rLCDSADDRB1= addr;
			rLCDEADDRB1=LCDBASEL(addr+(vframewidth*frameheight*bytefactor/8));
			CLR_IF();
			break;
		case BGBUFFER2:
			// The processor mode should be superviser mode.  
			SET_IF();
			while(((rLCDCON2&(0x7ff<<15))>>15)!=1);
			addr=(LCDFRAMEBUFFERBG2+(vx*bytefactor/8)+vy*(vframewidth*bytefactor/8));
			rLCDSADDRB2= addr;
			rLCDEADDRB2=LCDBASEL(addr+(vframewidth*frameheight*bytefactor/8));
			CLR_IF();
			break;
		case FGBUFFER1:
			// The processor mode should be superviser mode.  
			SET_IF();
			while(((rLCDCON2&(0x7ff<<15))>>15)!=1);
			addr=(LCDFRAMEBUFFERFG1+(vx*bytefactor/8)+vy*(vframewidth*bytefactor/8));
			rLCDSADDRF1= addr;
			rLCDEADDRF1=LCDBASEL(addr+(vframewidth*frameheight*bytefactor/8));
			CLR_IF();
			break;
		case FGBUFFER2:
			// The processor mode should be superviser mode.  
			SET_IF();
			while(((rLCDCON2&(0x7ff<<15))>>15)!=1);
			addr=(LCDFRAMEBUFFERFG2+(vx*bytefactor/8)+vy*(vframewidth*bytefactor/8));
			rLCDSADDRF2= addr;
			rLCDEADDRF2=LCDBASEL(addr+(vframewidth*frameheight*bytefactor/8));
			CLR_IF();
			break;
		default:
			break;
	}

}    



void SLcdGpioSet(unsigned char type, unsigned char data)
{
	unsigned int GPDATBuf = 0;
	
	rGPHCON = (rGPHCON & ~(0xff<<24)) | (0x2<<26); // MISO, CLK, nSS are input, MOSI is output setting
	
	switch (type)
	{
	case nCS:
		if(data) GPDATBuf |= (1<<15);
		else GPDATBuf &= ~(1<<15);
		break;
	case SCLK:
		if(data) GPDATBuf |= (1<<14);
		else GPDATBuf &= ~(1<<14);
		break;
	case SDI:
		if(data) GPDATBuf |= (1<<12);
		else GPDATBuf &= ~(1<<12);
		break;
	case ALL:
		if(data) GPDATBuf |= (0xd<<12);
		else GPDATBuf &= ~(0xd<<12);
		break;
	default:
		break;
	}

	rGPHDAT = GPDATBuf;
}

void SLcdRegSet(unsigned char IndexReg, unsigned short Inst)
{
	SLcdSpiSet(0, 0, (unsigned short)IndexReg);	// Set Index Register
	SLcdSpiSet(1, 0, (unsigned short)Inst);		// Write Instruction
}

void SLcdSpiSet(unsigned char RS, unsigned char RW, unsigned short data)
{
	unsigned int buf = 0x740000;		// device id
	unsigned char i;

	buf |= (RS<<17);
	buf |= (RW<<16);
	buf += data;

	SLcdGpioSet(nCS, 0);	// transfer start

	Delay(1);		// 1 -> 120us

	for(i=0; i<24; i++) {
		SLcdGpioSet(SCLK, 0);	// sclk low

		if(buf & (1<<(23-i))) SLcdGpioSet(SDI, 1);
		else SLcdGpioSet(SDI, 0);

		SLcdGpioSet(SCLK, 1);	// sclk high
	}

	SLcdGpioSet(nCS, 1);		// transfer end

	Delay(1);
}

void SLcdPowerOn(void)
{
	SLcdInit1();

	SLcdPowerSet();

	SLcdInit2();

	SLcdRGBModeChange();

	SLcdDisplayOn();

	SLcdRegSet(0x21, 0x0000);
	SLcdSpiSet(0, 0, (unsigned short)0x22);
}

void SLcdPowerOff(void)
{
	SLcdInternalModeChange();

	SLcdDisplayOff();

	SLcdRegSet(0x10, 0x0000);

	SLcdRegSet(0x0a, 0x0100);
}

void SLcdInit1(void)
{
	SLcdRegSet(0x01, 0x0917);	// 0x0117 <-> 0x0917
	SLcdRegSet(0x02, 0x0700);
	SLcdRegSet(0x03, 0x1230);
	SLcdRegSet(0x04, 0x0000);
	SLcdRegSet(0x05, 0x0000);
	SLcdRegSet(0x07, 0x0005);
	SLcdRegSet(0x08, 0x0907);	// 0x0306 <-> 0x0808 -> VFP=7H, VBP=9H, VLW=4H, so 0x0907
	SLcdRegSet(0x0b, 0xec0a);	// 0xe800 <-> 0xec0a
	SLcdRegSet(0x0c, 0x0002);
	SLcdRegSet(0x0d, 0x0734);	// 0x0700 <-> 0x0734
	SLcdRegSet(0x40, 0x0000);
}

void SLcdInit2(void)
{
	SLcdRegSet(0x30, 0x0000);
	SLcdRegSet(0x31, 0x0000);
	SLcdRegSet(0x32, 0x0000);
	SLcdRegSet(0x33, 0x0000);
	SLcdRegSet(0x34, 0x0707);
	SLcdRegSet(0x35, 0x0707);
	SLcdRegSet(0x36, 0x0707);
	SLcdRegSet(0x37, 0x0000);
	SLcdRegSet(0x3f, 0x0000);
	SLcdRegSet(0x41, 0x0000);
	SLcdRegSet(0x42, 0xbf00);
	SLcdRegSet(0x43, 0xc2c0);
	SLcdRegSet(0x44, 0xaf00);
	SLcdRegSet(0x45, 0xbf00);
}

void SLcdPowerSet(void)
{
	SLcdRegSet(0x12, 0x0001);
	SLcdRegSet(0x13, 0x0404);	// 0x0804 <-> 0x0404
	SLcdRegSet(0x14, 0x151e);	// 0x1118 <-> 0x151e

	SLcdRegSet(0x0a, 0x0100);
	SLcdRegSet(0x0a, 0x0101);
	SLcdRegSet(0x0a, 0x0102);
	SLcdRegSet(0x0a, 0x0106);
	SLcdRegSet(0x0a, 0x0107);

	SLcdRegSet(0x10, 0x2814);
	SLcdRegSet(0x11, 0x9010);	// 0x8000 <-> 0x9010

	SLcdRegSet(0x0a, 0x0100);
	SLcdRegSet(0x0a, 0x0101);

	//Delay(333);	// 40000 us / 120 us = 333,  S3C2460X
	Delay(400);	// 40000 us / 100 us = 400

	SLcdRegSet(0x14, 0x351e);	// 0x3118 <-> 0x351e

	SLcdRegSet(0x0a, 0x0100);
	SLcdRegSet(0x0a, 0x0102);

	//Delay(333);	// 40 ms, S3C2460X
	Delay(400);	// 40 ms

	SLcdRegSet(0x13, 0x0414);	// 0x0814 <-> 0x0414

	SLcdRegSet(0x0a, 0x0101);
}

void SLcdDisplayOn(void)
{
	SLcdRegSet(0x07, 0x0005);

	//Delay(333);	// 40 ms, S3C2460X
	Delay(400);	// 40 ms

	SLcdRegSet(0x07, 0x0025);

	SLcdRegSet(0x0a, 0x0100);

	SLcdRegSet(0x07, 0x0027);

	SLcdRegSet(0x07, 0x0037);
}

void SLcdDisplayOff(void)
{
	SLcdRegSet(0x07, 0x0036);

	Delay(333);	// 40ms

	SLcdRegSet(0x07, 0x0026);

	Delay(333);	// 40ms

	SLcdRegSet(0x07, 0x0004);

	SLcdRegSet(0x0a, 0x0100);
}

void SLcdInternalModeChange(void)
{
	SLcdRegSet(0x0c, 0x0002);

	Delay(167);	// 20000 us / 120 us = 167
}

void SLcdRGBModeChange(void)
{
	SLcdRegSet(0x21, 0x0000);
	
	SLcdRegSet(0x0c, 0x0112);

	SLcdSpiSet(0, 0, (unsigned short)0x22);

	//Delay(167);	// 20 ms, S3C2460X
	Delay(200);	// 20 ms
}

void SLcdSleep(void)
{
	SLcdInternalModeChange();

	SLcdDisplayOff();

	SLcdRegSet(0x10, 0x0000);

	SLcdRegSet(0x0a, 0x0100);

	SLcdRegSet(0x10, 0x0002);

	SLcdRegSet(0x0a, 0x0100);
}

void SLcdSleepWakeUp(void)
{
	SLcdRegSet(0x10, 0x0000);

	SLcdRegSet(0x0a, 0x0100);

	SLcdPowerSet();

	SLcdDisplayOn();

	SLcdRGBModeChange();
}

void SLcdStangBy(void)
{
	SLcdInternalModeChange();

	SLcdDisplayOff();

	SLcdRegSet(0x10, 0x0000);

	SLcdRegSet(0x0a, 0x0100);

	SLcdRegSet(0x10, 0x0001);
}

void SLcdStandByWakeUp(void)
{
	SLcdRegSet(0x00, 0x0001);

	Delay(83);	// 10000 / 120 = 83

	SLcdRegSet(0x10, 0x0000);

	SLcdInit1();

	SLcdPowerSet();

	SLcdInit2();

	SLcdRGBModeChange();

	SLcdDisplayOn();

	SLcdRegSet(0x21, 0x0000);
	SLcdSpiSet(0, 0, (unsigned short)0x22);
}    

//040616
void delayLoop(int count) 
{ 
    int j; 
    for(j = 0; j < count; j++)  ; 
}

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

	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

⌨️ 快捷键说明

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