autoadj.c

来自「台湾联咏NT68663 LCD MONITOR 控制程序(完整版)」· C语言 代码 · 共 1,522 行 · 第 1/3 页

C
1,522
字号
	if(Abort)
		return;
	if(MaxMin < 0x100000){	//jacky 20050427 for Auto clock fail when gray pattern
		FuncBuf[pPHASE] = (temp + 24) & 0x3f;
		SetADC_Phase();
		return;
	}
	U_D = 0;
	R_L = 0;
	for(k=0; k<16; k++)
		{
		if(R_L)
			{
			FuncBuf[pCLOCK] += 2;
			SetADC_PLL();
			//printf("Clock divider 1 = %d\n",FuncBuf[pCLOCK]);
			WaitSetup(4);
			if(Abort)
				return;
			//Sleep(25);
			Value = CheckPhaseData();
			//printf("Clock Value %d = %x %x\n",(unsigned short)k,(unsigned short)(Value >> 16),(unsigned short)Value);
			if(Abort)
				return;
			if(MaxMin < Value)
				{
				GoodClk = FuncBuf[pCLOCK];
				MaxMin = Value;
				temp = TempPhase;
				U_D = 1;
				}
			else
				{
				if(U_D == 0)
					{
					R_L = 0;
					FuncBuf[pCLOCK] -= 2;
					U_D = 1;
					}
				else
					break;
				}
			}
		else{
			FuncBuf[pCLOCK] -= 2;
			SetADC_PLL();
			//printf("Clock divider 2 = %d\n",FuncBuf[pCLOCK]);
			WaitSetup(4);
			if(Abort)
				return;
			//Sleep(25);
			Value = CheckPhaseData();
			//printf("Clock Value %d = %x %x\n",(unsigned short)k,(unsigned short)(Value >> 16),(unsigned short)Value);
			if(Abort)
				return;
			if(MaxMin < Value)
				{
				GoodClk = FuncBuf[pCLOCK];
				MaxMin = Value;
				temp = TempPhase;
				U_D = 1;
				}
			else
				{
				if(U_D == 0)
					{
					R_L = 1;
					FuncBuf[pCLOCK] += 2;
					U_D = 1;
					}
				else
					break;
				}
			}
		}
	FuncBuf[pCLOCK] = GoodClk;
	//printf("Clock divider 3 = %d\n",FuncBuf[pCLOCK]);
	SetADC_PLL();
	FuncBuf[pPHASE] = (temp + 24) & 0x3f;
//	Repeat = 32;
	SetADC_Phase();
}

unsigned long CheckPhaseData()
{
	Byte ch;
	Word zz;
	xdata unsigned long Value,MinValueTemp,MaxValueTemp;
	MaxValueTemp = 0;
	MinValueTemp = 0xffffffff;
	FuncBuf[pPHASE] = 0;
	SetADC_Phase();
	WriteIIC563(0x106,0x02); 
   	LocalTimer = 10;
	for(FuncBuf[pPHASE]=4; FuncBuf[pPHASE]<0x42; FuncBuf[pPHASE] += 4)
		{
		while((ReadIIC563(0x106) & BIT_1) && LocalTimer != 0)
			{
			CheckModeChange();
			if(Abort)
				return 0;
			}
		SetADC_Phase();
		WriteIIC563(0x106,0x02);
	   	LocalTimer = 10;
        Value = 0x00000000;
        for(zz=0x116; zz>0x112; zz--)
			{
       		ch = ReadIIC563(zz);
            Value  = Value << 8;
            Value  = Value + ch;
        	}
		if(Value < MinValueTemp)
			{
			MinValueTemp = Value;
			TempPhase = (FuncBuf[pPHASE] - 4) & 0x3f;
			}
		if(Value > MaxValueTemp)
			MaxValueTemp = Value;
	}
	Value = MaxValueTemp - MinValueTemp;
	return Value;
}

/*
Byte AutoPhase(void)
{
unsigned short	zz;
unsigned char PhaseTemp1,PhaseTemp2,value,i,temp;
unsigned long Value,MinValueTemp,MaxValueTemp;
	if(Abort)
		return 0;
	#if PRINT_MESSAGE
		printf("Auto Phase\n");
	#endif
	MaxValueTemp = 0;
	MinValueTemp = 0xffffffff;
	PhaseTemp1 = 0;
	PhaseTemp2 = 0;
	FuncBuf[pPHASE] = 0;
	SetADC_Phase();
	WriteIIC563(0x106,0x02); // 0X01 --> 0X09
   	LocalTimer = 100;
	for(FuncBuf[pPHASE]=0; FuncBuf[pPHASE]<0x40; FuncBuf[pPHASE] = FuncBuf[pPHASE] + 2)
		{
		while((ReadIIC563(0x106) & BIT_1) && LocalTimer != 0)
			{
			if(Abort)
				return 0;
			}
		SetADC_Phase();
		WriteIIC563(0x106,0x02);
	   	LocalTimer = 100;
        Value = 0x00000000;
        for (zz=0x116; zz>0x112; zz--)
			{
       		value = ReadIIC563(zz);
            Value  = Value << 8;
            Value  = Value + value;
        	}
		i = (FuncBuf[pPHASE] - 2) & 0x3f;
		#if PRINT_MESSAGE
			printf("Phase %d = %x %x\n",(unsigned short)i,(unsigned short)(Value >> 16),(unsigned short)Value);
		#endif
		if(Value < MinValueTemp)
			{
			MinValueTemp = Value;
			PhaseTemp1 = i;
			}
		if(Value > MaxValueTemp)
			{
			MaxValueTemp = Value;
			PhaseTemp2 = i;
			}
		}
	Value = (unsigned long)FuncBuf[pHPOSITION] * H_SYNC;
	if(Value > 1000000)
		{
		i = (PhaseTemp1 + 4) & 0x3f;
		temp = 60;
		}
	else
		{
		i = (PhaseTemp1 + 26) & 0x3f;
		temp = 16;
		}
	FuncBuf[pPHASE] = i;
	SetADC_Phase();
	#if PRINT_MESSAGE
		printf("phase ok = %d\n",(unsigned short)FuncBuf[pPHASE]);
	#endif
	return temp;
}
*/
void AutoPhaseFineTune(Byte Val)
{
unsigned short   zz;
unsigned char   qq,uu,yy,i;
unsigned long   Phase_0, Phase_1, Phase_2, Phase_Pre3, Phase_Now3, Phase_Delta;
unsigned char   value;
	if(Abort)
		return;
    #if PRINT_MESSAGE
	printf("Auto Phase Fine Tune\n");
	#endif
//-------------------------at color xx , calculate phase-------------------------
    Phase_1 = 0x00000000;   // (i-1)
    Phase_2 = 0x00000000;   // (i-2)
    Phase_Pre3 = 0x00000000;   // (pre sum)->(delta)->(now sum)
    Phase_Delta = 0xffffffff;   // (min delta)
	qq = FuncBuf[pPHASE];
	WriteIIC563(0x106,0x02); // 0x01 --> 0x09
   	LocalTimer = 10;
	for(yy=1; yy<Val; yy++)
		{
	 	while((ReadIIC563(0x106) & BIT_1) && LocalTimer != 0)
			{
			CheckModeChange();
			if(Abort)
				return;
			}
		FuncBuf[pPHASE] = (qq + yy) & 0x3f;
		SetADC_Phase();
		WriteIIC563(0x106,0x02); // 0x01 --> 0x09
	   	LocalTimer = 100;
        Phase_Now3  = 0x00000000;
        for (zz=0x116; zz>0x112; zz--)
			{
       		value = ReadIIC563(zz);
            Phase_Now3  = Phase_Now3 << 8;
            Phase_Now3  = Phase_Now3 + value;
        	}
		i = (FuncBuf[pPHASE] - 1) & 0x3f;
		#if PRINT_MESSAGE
			printf("Phase %d = %x %x\n",(unsigned short)i,(unsigned short)(Phase_Now3>>16),(unsigned short)Phase_Now3);	
		#endif
        Phase_2 = Phase_1;  // Shift	
        Phase_1 = Phase_0;
        Phase_0 = Phase_Now3;
		Phase_Now3 = (Phase_0>>1) + (Phase_1>>1) + (Phase_2>>2); // Phase_Now3
		if(yy < 4)
			Phase_Pre3  = Phase_Now3;   // Phase_Pre3 = Phase_Now3
		else
			{
			if(Phase_Now3 > Phase_Pre3)
				Phase_Pre3  = Phase_Now3 - Phase_Pre3;
			else
				Phase_Pre3  = Phase_Pre3 - Phase_Now3;  // Phase_Pre3=delta
			if(Phase_Pre3 < Phase_Delta)
				{
				uu = i;           
				Phase_Delta = Phase_Pre3;
				}
			Phase_Pre3  = Phase_Now3;   // Phase_Pre3 = Phase_Now3
			}     
		}
	//FuncBuf[pPHASE] = (uu - 3) & 0x3f;
	FuncBuf[pPHASE] = (uu - 1) & 0x3f;
	SetADC_Phase();
	#if PRINT_MESSAGE
		printf("Phase ok = %d\n",(unsigned short)FuncBuf[pPHASE]);
	#endif
}

void AutoPhaseByClock()
{
	//preset mode total
	Byte PhaseTemp;
	Word H_Act,MinHActiveTemp;
	#if PRINT_MESSAGE
		printf("AutoPhaseByClock\n");
	#endif
	MinHActiveTemp = 0xffff;
	FuncBuf[pPHASE] = 0;
	SetADC_Phase();
	
	for(FuncBuf[pPHASE]=4; FuncBuf[pPHASE]<0x42; FuncBuf[pPHASE] += 4)
	{
		WriteIIC563(0x106,0x01);
	   	LocalTimer = 10;
	   	while((ReadIIC563(0x106) & BIT_0) && LocalTimer != 0)
		{
			CheckModeChange();
			if(Abort)
				return;
		}
		SetADC_Phase();
		H_Act = ReadWordIIC563(0x110) & 0x0fff;
		//H_Act = ReadIIC563(0x111) & 0x0f;
		//H_Act <<= 8;
		//H_Act |= ReadIIC563(0x110);
		
		// 20040224 Jacky
		//if(H_Act < (H_Ref - 124)){
		//	i = 0xff;
		//	break;
		//}
		//------------------------
		if(H_Act < MinHActiveTemp)
		{
			MinHActiveTemp = H_Act;
			PhaseTemp = (FuncBuf[pPHASE] - 4) & 0x3f;
		}
#if PRINT_MESSAGE
		printf("AutoPhaseByClock H_Act %d = %d\n",(unsigned short)FuncBuf[pPHASE],H_Act);
#endif
	}
	FuncBuf[pPHASE] = PhaseTemp;
	SetADC_Phase();
#if PRINT_MESSAGE
		printf("AutoPhaseByClock Phase = %d\n",(unsigned short)FuncBuf[pPHASE]);
#endif
}

#if AUTO_COLOR == GaugeGain
void SetADC_Offset(unsigned char OffSet)
{
	xdata unsigned short l;
	xdata unsigned char i,j,k,m,n,value;
	xdata unsigned long PhaseResult,Temp;

	SetADC_Offset_C();
	OffSet = ReadIIC563(0x03);
	value = ReadIIC563(0x06);
	if(OffSet > value)
		OffSet = value;
	value = ReadIIC563(0x09);
	if(OffSet > value)
		OffSet = value;
	
	WriteIIC563(0x0fa,0x00);
	for(m=0; m<3; m++)
		{
		for(k=OffSet; k<248; k=k+8)
			{
			WriteIIC563(0x0f8,0x00);
			l = 0x003 + m*3;
			WriteIIC563(l,k);	// Jacky 20041210
			//WaitSetup(5);
			i = 0x80 + (2-m)*0x08;
			WriteIIC563(0x0f8,i);
			LocalTimer = 10;
		   	while((ReadIIC563(0x0f8) & BIT_7) && LocalTimer != 0)
				{
				if(Abort)
					return;
				}
			if(LocalTimer == 0){
				Abort = 1;
				return;
			}
			j = 0;
			Temp = 0;
			for(i=0; i<8; i++)
				{
				WriteIIC563(0x0f9,i);
				value = ReadIIC563(0x0fd);
				PhaseResult = value;
				PhaseResult <<= 8;
				value = ReadIIC563(0x0fc);
				PhaseResult += value;
				PhaseResult <<= 8;
				value = ReadIIC563(0x0fb);
				PhaseResult += value;
				#if PRINT_MESSAGE
					//printf("PhaseResult %x = %x %x\n",(unsigned short)m,(unsigned short)k,(unsigned short)(PhaseResult>>8));
					printf("PhaseResult %x = %x %x %x\n",(unsigned short)m,(unsigned short)k,(unsigned short)(PhaseResult >> 16),(unsigned short)PhaseResult);
				#endif
				if(PhaseResult > Temp)
					{
					Temp = PhaseResult;
					j = i;
					}
				}
			if(Temp > (Vresolution*15))
			//if(Temp > 1024)
				{
				l = 0x003 + m*3;
				j = k+j;
				WriteIIC563(l,j);	// Jacky 20041210
				#if PRINT_MESSAGE
				printf("Offset %x = %x %x\n",(unsigned short)m,(unsigned short)k,(unsigned short)j);
				#endif
				break;
				}
			}
		k = j;
		for(n=0; n<8; n++)
			{
			WriteIIC563(0x0f8,0x00);
			l = 0x003 + 3*m;
			WriteIIC563(l,k+n);	// Jacky 20041210
			//WaitSetup(2);
			LocalTimer = 10;
			i = 0x80 + (2-m)*0x08;
			WriteIIC563(0x0f8,i);
		   	while((ReadIIC563(0x0f8) & BIT_7) && LocalTimer != 0)
				{
				if(Abort)
					return;
				}
			if(LocalTimer == 0){
				Abort = 1;
				return;
			}
			j = 0;
			Temp = 0;
			for(i=0; i<8; i++)
				{
				WriteIIC563(0x0f9,i);
				value = ReadIIC563(0x0fd);
				PhaseResult = value;
				PhaseResult <<= 8;
				value = ReadIIC563(0x0fc);
				PhaseResult += value;
				PhaseResult <<= 8;
				value = ReadIIC563(0x0fb);
				PhaseResult += value;
				#if PRINT_MESSAGE
					//printf("PhaseResult %x = %x %x\n",(unsigned short)m,(unsigned short)n,(unsigned short)(PhaseResult>>8));
					printf("PhaseResult %x = %x %x %x\n",(unsigned short)m,(unsigned short)n,(unsigned short)(PhaseResult >> 16),(unsigned short)PhaseResult);
				#endif
				if(PhaseResult > Temp)
					{
					Temp = PhaseResult;
					j = i;
					}
				}
			if(j == 0)
				break;
			}
		l = 0x003 + 3*m;
		j = k+n;	// Jacky 20041210
		WriteIIC563(l,j);
		#if PRINT_MESSAGE
			printf("Offset %x = %x %x\n",(unsigned short)m,(unsigned short)k,(unsigned short)j);
		#endif
		}
	FuncBuf[pROFFSET] = ReadIIC563(0x003);
	Write24C16(ep_ADC_R_Offset,FuncBuf[pROFFSET]);
	FuncBuf[pGOFFSET] = ReadIIC563(0x006);
	Write24C16(ep_ADC_G_Offset,FuncBuf[pGOFFSET]);
	FuncBuf[pBOFFSET]  = ReadIIC563(0x009);
	Write24C16(ep_ADC_B_Offset,FuncBuf[pBOFFSET]);

//	FuncBuf[pROFFSET] = ReadIIC563(0x003);
//	Write24C16(ep_ADC_R_Offset,FuncBuf[pROFFSET]);
//	FuncBuf[pGOFFSET] = ReadIIC563(0x006);
//	Write24C16(ep_ADC_G_Offset,FuncBuf[pGOFFSET]);
//	FuncBuf[pBOFFSET] = ReadIIC563(0x009);
//	Write24C16(ep_ADC_B_Offset,FuncBuf[pBOFFSET]);
//	WriteIIC563(0x003,Read24C16(ep_ADC_R_Offset));
//	WriteIIC563(0x006,Read24C16(ep_ADC_G_Offset));
//	WriteIIC563(0x009,Read24C16(ep_ADC_B_Offset));
}

void SetADC_Gain(unsigned char OffSet)
{
unsigned short l;
unsigned char i,j,k,m,n,value;
unsigned long PhaseResult,Temp;

	SetADC_Gain_C();
	OffSet = ReadIIC563(0x01);
	value = ReadIIC563(0x04);
	if(OffSet > value)
		OffSet = value;
	value = ReadIIC563(0x07);
	if(OffSet > value)
		OffSet = value;

	//WriteIIC563(0x0f8,0x00);
	WriteIIC563(0x0fa,0xf8);
	for(m=0; m<3; m++)
	{
		for(k=OffSet; k>7; k=k-8)
		{
			l = 0x001 + m * 3;
			WriteIIC563(l,k);
			WriteIIC563(0x0f8,0x00);
			//WaitSetup(2);
			LocalTimer = 10;
			i = 0x80 + (2-m)*0x08;
			WriteIIC563(0x0f8,i);
		   	while((ReadIIC563(0x0f8) & BIT_7) && LocalTimer != 0)
			{
				if(Abort)
					return;
			}
			if(LocalTimer == 0){
				Abort = 1;
				return;
			}
			j = 0;
			Temp = 0;
			for(i=0; i<8; i++)
				{
				WriteIIC563(0x0f9,i);
				value = ReadIIC563(0x0fd);
				PhaseResult = value;
				PhaseResult <<= 8;
				value = ReadIIC563(0x0fc);
				PhaseResult += value;
				PhaseResult <<= 8;
				value = ReadIIC563(0x0fb);
				PhaseResult += value;
				#if PRINT_MESSAGE
					printf("PhaseResult %x = %x %x\n",(unsigned short)m,(unsigned short)k,(unsigned short)(PhaseResult>>8));

⌨️ 快捷键说明

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