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

📄 lcd_auto.c

📁 keil c51平台,此代码可用于学习TFT LCD TV 搜台等,(本人自己修改)
💻 C
📖 第 1 页 / 共 5 页
字号:
        stGUD0.RTD_R_BRIGHT     = 50;
        stGUD0.RTD_G_BRIGHT     = 50;
        stGUD0.RTD_B_BRIGHT     = 50;*/    //V203
        Set_Bright_Contrast();

        Save_GUD0();
/*
        if (0 != stGUD2.AD_G_GAIN && 255 != stGUD2.AD_G_GAIN && 0 != stGUD2.AD_G_OFFSET && 255 != stGUD2.AD_G_OFFSET)
        {
            stGUD2.AD_G_GAIN    += 1;
            stGUD2.AD_G_OFFSET  += 1;
        }
        SetADC_GainOffset();
*/
        Save_GUD2();
    }

    bAutoInProgress = 0;

    return Result;
}

unsigned char Tune_Balance(void)
{
    unsigned char   Color, Count, Result, Margin, FineTune, Offset_Stop;
    
    FineTune    = 0;

//    RTDCodeW(ADC_DEFAULT);
    
    // Get usVer_Start, usVer_End, usH_Start, usH_Start
    if (ERROR_SUCCEED != Measure_PositionN(0x40))   return ERROR_ABORT;

    if (ERROR_SUCCEED != Measure_Color(SELECT_RED, COLOR_MAX))      return ERROR_ABORT;
    if (0x60 > Data[0])     return ERROR_ABORT;
    
    Margin  = Data[0];

    if (ERROR_SUCCEED != Measure_Color(SELECT_GREEN, COLOR_MAX))    return ERROR_ABORT;
    if (0x60 > Data[0])     return ERROR_ABORT;

    Margin  = Margin > Data[0] ? Data[0] : Margin;

    if (ERROR_SUCCEED != Measure_Color(SELECT_BLUE, COLOR_MAX))     return ERROR_ABORT;
    if (0x60 > Data[0])     return ERROR_ABORT;

    Margin  = Margin > Data[0] ? Data[0] : Margin;

    Margin  = (Margin - 0x20) & 0xfc;

    // Get usVer_Start, usVer_End, usH_Start, usH_Start
    if (ERROR_SUCCEED != Measure_PositionN(Margin))   return ERROR_ABORT;


#if(1)
    SetADC_Offset();
#else
	SetADC_GainOffset();
#endif

	Offset_Stop = 0;
    Color   = SELECT_BLUE;
    do
    {
        Count   = 0x30;
        
        do
        {
#if (1)
            
           if(Offset_Stop == 0)
           { 
			   ///////////////////////////////
			   // Minimum Adjustment (0x02) //
			   ///////////////////////////////
			   if (ERROR_SUCCEED != Measure_Color(Color, COLOR_MIN))   return ERROR_ABORT;
			   Margin  = Data[0];

			   if (0x0a < Margin)
			   {
				   Change_ADC_Offset(Color, 0x08, 0);          // Increase Offset; Decrease Brightness
			   }
			   else if (0x02 < Margin)
			   {
				   Change_ADC_Offset(Color, Margin - 0x02, 0); // Increase Offset; Decrease Brightness
			   }
			   else if (0x02 > Margin)
			   {
				   if (0x00 == Margin && 0 == FineTune)
					   Change_ADC_Offset(Color, 0x06, 1);              // Decrease Offset; Increase Brightness
				   else
				   {
					   Change_ADC_Offset(Color, 0x02 - Margin, 1);     // Decrease Offset; Increase Brightness

					   if(Color == SELECT_RED)
					   {
						   Offset_Stop = 1;
						   SetADC_Gain();
						   Color   = SELECT_BLUE << 1;
					   }
					   break;
				   }
			   }
		   }
		   else
		   {
			   ///////////////////////////////
			   // Maximum Adjustment (0xf2) //
			   ///////////////////////////////
			   if (ERROR_SUCCEED != Measure_Color(Color, COLOR_MAX))   return ERROR_ABORT;
			   Margin  = Data[0];

			   if (0xf2 < Margin) 
			   {
				   Result  = Margin - 0xf2;
				   
				   // Non-zero return value of Change_ADC_Gain() means ADC gain reaches maximum.
				   if (Change_ADC_Gain(Color, Result, 0))              // Increase Gain; Decrease Contrast
				   {
					   if (Change_ADC_Offset(Color, 4, 0))     break;  // Increase Offset; Decrease Brightness
				   }
			   }
			   else if (0xf2 > Margin)
			   {
				   Result  = 0xf2 - Margin;

				   // Non-zero return value of Change_ADC_Gain() means ADC gain reaches minimum.                
				   if (Change_ADC_Gain(Color, Result, 1)) 		   // Decrease Gain; Increase Contrast
				   {
					   if (Change_ADC_Offset(Color, 4, 1))     break;  // Decrease Offset; Increase Brightness
				   }
			   }
			   else
				   break;
		   }

		   if (8 < Count && 0xf3 >= Result && 0xf1 <= Result && 0x03 >= Margin && 0x01 <= Margin)
		   {
			   FineTune    = 1;
			   Count       = 8;
		   }
#endif
			

#if(0)
            ///////////////////////////////
            // Maximum Adjustment (0xf2) //
            ///////////////////////////////
            if (ERROR_SUCCEED != Measure_Color(Color, COLOR_MAX))   return ERROR_ABORT;
            Margin  = Data[0];

            if (0xf2 < Margin)
            {
                Result  = Margin - 0xf2;
                
                // Non-zero return value of Change_ADC_Gain() means ADC gain reaches maximum.
                if (Change_ADC_Gain(Color, Result, 0))              // Increase Gain; Decrease Contrast
                {
                    if (Change_ADC_Offset(Color, 4, 0))     break;  // Increase Offset; Decrease Brightness
                }
            }
            else if (0xf2 > Margin)
            {
                Result  = 0xf2 - Margin;

                // Non-zero return value of Change_ADC_Gain() means ADC gain reaches minimum.
                if (Change_ADC_Gain(Color, Result, 1))              // Decrease Gain; Increase Contrast
                {
                    if (Change_ADC_Offset(Color, 4, 1))     break;  // Decrease Offset; Increase Brightness
                }
            }

            Result  = Margin;

            ///////////////////////////////
            // Minimum Adjustment (0x02) //
            ///////////////////////////////
            
            if (ERROR_SUCCEED != Measure_Color(Color, COLOR_MIN))   return ERROR_ABORT;
            Margin  = Data[0];

            if (0x0a < Margin)
            {
                Change_ADC_Offset(Color, 0x08, 0);          // Increase Offset; Decrease Brightness
            }
            else if (0x02 < Margin)
            {
                Change_ADC_Offset(Color, Margin - 0x02, 0); // Increase Offset; Decrease Brightness
            }
            else if (0x02 > Margin)
            {
                if (0x00 == Margin && 0 == FineTune)
                    Change_ADC_Offset(Color, 0x06, 1);              // Decrease Offset; Increase Brightness
                else
                    Change_ADC_Offset(Color, 0x02 - Margin, 1);     // Decrease Offset; Increase Brightness

            }
            else if (0xf2 == Result)
            {
                break;
            }

            // Prevent redundant fine tune
            if (8 < Count && 0xf3 >= Result && 0xf1 <= Result && 0x03 >= Margin && 0x01 <= Margin)
            {
                FineTune    = 1;
                Count       = 8;
            }
#endif

#if(0)
            ///////////////////////////////
            // Maximum Adjustment (0xfd) //
            ///////////////////////////////
            if (ERROR_SUCCEED != Measure_Color(Color, COLOR_MAX))   return ERROR_ABORT;
            Margin  = Data[0];

            if (0xfd < Margin)
            {
                Result  = (0xff == Margin && 0 == FineTune) ? 0x06 : Margin - 0xfd;
                
                // Non-zero return value of Change_ADC_Gain() means ADC gain reaches maximum.
                if (Change_ADC_Gain(Color, Result, 0))              // Increase Gain; Decrease Contrast
                {
                    if (Change_ADC_Offset(Color, 4, 0))     break;  // Increase Offset; Decrease Brightness
                }
            }
            else if (0xfd > Margin)
            {
                Result  = (0xf1 > Margin) ? 0x0c : 0xfd - Margin;

                // Non-zero return value of Change_ADC_Gain() means ADC gain reaches minimum.
                if (Change_ADC_Gain(Color, Result, 1))              // Decrease Gain; Increase Contrast
                {
                    if (Change_ADC_Offset(Color, 4, 1))     break;  // Decrease Offset; Increase Brightness
                }
            }

            Result  = Margin;

            ///////////////////////////////
            // Minimum Adjustment (0x02) //
            ///////////////////////////////
            
            if (ERROR_SUCCEED != Measure_Color(Color, COLOR_MIN))   return ERROR_ABORT;
            Margin  = Data[0];

            if (0x0a < Margin)
            {
                Change_ADC_Offset(Color, 0x08, 0);          // Increase Offset; Decrease Brightness
            }
            else if (0x02 < Margin)
            {
                Change_ADC_Offset(Color, Margin - 0x02, 0); // Increase Offset; Decrease Brightness
            }
            else if (0x02 > Margin)
            {
                if (0x00 == Margin && 0 == FineTune)
                    Change_ADC_Offset(Color, 0x06, 1);              // Decrease Offset; Increase Brightness
                else
                    Change_ADC_Offset(Color, 0x02 - Margin, 1);     // Decrease Offset; Increase Brightness
            }
            else if (0xfd == Result)
            {
                break;
            }

            // Prevent redundant fine tune
            if (8 < Count && 0xfe >= Result && 0xfc <= Result && 0x03 >= Margin && 0x01 <= Margin)
            {
                FineTune    = 1;
                Count       = 8;
            }
#endif

        }
        while (--Count);

        Color   = Color >> 1;
    }
    while (Color);

    return ERROR_SUCCEED; 
}

unsigned char Measure_Color(unsigned char color, unsigned char margin)
{
    RTDSetByte(MARGIN_B_7D, (SELECT_RED == color) ? COLORS_RED : (SELECT_GREEN == color) ? COLORS_GREEN : COLORS_BLUE);


    Data[0] = 9;
    Data[1] = Y_INC;
    Data[2] = H_BND_STA_L_75;

    Data[3] = (unsigned char)(usH_Start + MEAS_H_STA_OFFSET - 1);
    Data[4] = (unsigned char)(usH_End + MEAS_H_END_OFFSET);
    Data[5] = ((unsigned char)((usH_Start + MEAS_H_STA_OFFSET - 1) >> 4) & 0x70) | ((unsigned char)((usH_End + MEAS_H_END_OFFSET) >> 8) & 0x0f);

    if (COLOR_MIN == margin)
    {
        Data[3] = 0x80;
        Data[4] = 0x00;
        Data[5] = 0x12;

        Data[6] = 9 < usVer_Start ? 9 : usVer_Start - 1;
        Data[7] = Data[6] + 1;
        Data[8] = 0;
    }
    else
    {
        Data[6] = (unsigned char)(usVer_Start + 1);
        Data[7] = (unsigned char)(usVer_End + 1);
        Data[8] = ((unsigned char)((usVer_Start + 1) >> 4) & 0x70) | ((unsigned char)((usVer_End + 1) >> 8) & 0x0f);
    }

    Data[9] = 0;
    RTDWrite(Data);

    if (COLOR_MIN == margin)
    	RTDSetByte(AUTO_ADJ_CTRL_7F, COLOR_MIN | 0x01); // Start the auto-adjust
	else
    	RTDSetByte(AUTO_ADJ_CTRL_7F, COLOR_MAX | 0x01); // Start the auto-adjust

    Wait_Finish();

    if (ERROR_SUCCEED != Data[0])   return ERROR_ABORT;

    RTDRead(AUTO_BAL_RESULT_88, 1, N_INC);  // Store result in Data[0]
   
    if (COLOR_MIN == margin)	Data[0]	^= 0xff;


/*
#if (1)

    Data[0] = 9;
    Data[1] = Y_INC;
    Data[2] = H_BND_STA_L_75;

    Data[3] = (unsigned char)(usH_Start + MEAS_H_STA_OFFSET - 1);
    Data[4] = (unsigned char)(usH_End + MEAS_H_END_OFFSET);
    Data[5] = ((unsigned char)((usH_Start + MEAS_H_STA_OFFSET - 1) >> 4) & 0x70) | ((unsigned char)((usH_End + MEAS_H_END_OFFSET) >> 8) & 0x0f);

	Data[6] = (unsigned char)(usVer_Start + 1);
    Data[7] = (unsigned char)(usVer_End + 1);
    Data[8] = ((unsigned char)((usVer_Start + 1) >> 4) & 0x70) | ((unsigned char)((usVer_End + 1) >> 8) & 0x0f);
    Data[9] = 0;
    RTDWrite(Data);

    if (COLOR_MIN == margin)
    	RTDSetByte(AUTO_ADJ_CTRL_7F, COLOR_MIN | 0x01); // Start the auto-adjust
	else
    	RTDSetByte(AUTO_ADJ_CTRL_7F, COLOR_MAX | 0x01); // Start the auto-adjust

    Wait_Finish();

    if (ERROR_SUCCEED != Data[0])   return ERROR_ABORT;

    RTDRead(AUTO_BAL_RESULT_88, 1, N_INC);  // Store result in Data[0]
   
    if (COLOR_MIN == margin)	Data[0]	^= 0xff;

#else

    Data[0] = 9;
    Data[1] = Y_INC;
    Data[2] = H_BND_STA_L_75;

    Data[3] = (unsigned char)(usH_Start + MEAS_H_STA_OFFSET - 1);
    Data[4] = (unsigned char)(usH_End + MEAS_H_END_OFFSET);
    Data[5] = ((unsigned char)((usH_Start + MEAS_H_STA_OFFSET - 1) >> 4) & 0x70) | ((unsigned char)((usH_End + MEAS_H_END_OFFSET) >> 8) & 0x0f);

    if (COLOR_MIN == margin)
    {
        Data[3] = 0x80;
        Data[4] = 0x00;
        Data[5] = 0x12;

        Data[6] = 9 < usVer_Start ? 9 : usVer_Start - 1;
        Data[7] = Data[6] + 1;
        Data[8] = 0;
    }
    else
    {
        Data[6] = (unsigned char)(usVer_Start + 1);
        Data[7] = (unsigned char)(usVer_End + 1);
        Data[8] = ((unsigned char)((usVer_Start + 1) >> 4) & 0x70) | ((unsigned char)((usVer_End + 1) >> 8) & 0x0f);
    }

    Data[9] = 0;
    RTDWrite(Data);

    RTDSetByte(AUTO_ADJ_CTRL_7F, COLOR_MAX | 0x01); // Start the auto-adjust

    Wait_Finish();

    if (ERROR_SUCCEED != Data[0])   return ERROR_ABORT;

    RTDRead(AUTO_BAL_RESULT_88, 1, N_INC);  // Store result in Data[0]
    
#endif
*/

    return ERROR_SUCCEED;
}

unsigned char Change_ADC_Gain(unsigned char color, unsigned char delta, unsigned char inc)
{
    if (inc)
    {
        inc = 0;

        if (color & SELECT_RED)
        {
            if (stGUD2.AD_R_GAIN > delta)
                stGUD2.AD_R_GAIN    -= delta;
            else
            {
                stGUD2.AD_R_GAIN    = 0;
                inc |= SELECT_RED;
            }
        }
        if (color & SELECT_GREEN)
        {
            if (stGUD2.AD_G_GAIN > delta)
                stGUD2.AD_G_GAIN    -= delta;
            else
            {
                stGUD2.AD_G_GAIN    = 0;
                inc |= SELECT_GREEN;
            }
        }
        if (color & SELECT_BLUE)
        {
            if (stGUD2.AD_B_GAIN > delta)
                stGUD2.AD_B_GAIN    -= delta;
            else
            {
                stGUD2.AD_B_GAIN    = 0;
                inc |= SELECT_BLUE;
            }
 

⌨️ 快捷键说明

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