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 + -
显示快捷键?