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

📄 lcd_auto.c

📁 keil c51平台,此代码可用于学习TFT LCD TV 搜台等,(本人自己修改)
💻 C
📖 第 1 页 / 共 5 页
字号:
{
    unsigned char idata ucDetect, ucPhase, ucResult;
    unsigned long idata ulTemp0, ulTemp1, ulTemp2;

/*
    //reduce the bandwidth of ADC to prevent overshoot
    if(ucMode_Curr <= MODE_1280x1024x75HZ)
       RTDSetByte(ADC_REG_TEST_E9, 0x08);
    else if(ucMode_Curr < MODE_1024x0768x70HZ)
       RTDSetByte(ADC_REG_TEST_E9, 0x00);
    else
       RTDSetByte(ADC_REG_TEST_E9, 0x10);
*/

    if (ERROR_SUCCEED != Measure_PositionN(NM))    return ERROR_ABORT;

    // Set auto-tracking window
    Data[0]     = 6;
    Data[1]     = Y_INC;
    Data[2]     = H_BND_STA_L_75;
    Data[3]     = (unsigned char)(usH_Start + MEAS_H_STA_OFFSET - 2);
    Data[4]     = (unsigned char)(usH_End + MEAS_H_END_OFFSET + 1);
    Data[5]     = ((unsigned char)((usH_Start + MEAS_H_STA_OFFSET - 2) >> 4) & 0x70) | ((unsigned char)((usH_End + MEAS_H_END_OFFSET + 1) >> 8) & 0x0f);
    Data[6]     = 0;
    RTDWrite(Data);

    RTDSetByte(DIFF_THRED_7E, 0x30);

    ulTemp0     = 0;
    ucDetect    = 0x7b;
    do
    {
        ucResult    = COLORS_RED;
        ucPhase     = COLORS_RED;
        do
        {
            RTDSetByte(MARGIN_B_7D, ucPhase);
            RTDSetByte(AUTO_ADJ_CTRL_7F, ucDetect);

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

            Read_Auto_Info(1);
            if (ulTemp0 < ((unsigned long *)Data)[1])
            {
                ulTemp0     = ((unsigned long *)Data)[1];
                ucResult    = ucPhase;

                if (0x8000 < ulTemp0)   break;
            }

            if (COLORS_GREEN == ucPhase)
                ucPhase = COLORS_BLUE;
            else if (COLORS_RED == ucPhase)
                ucPhase = COLORS_GREEN;
            else
                break;
        }
        while (1);

        if (0 != ulTemp0 || 0x7b != ucDetect)   break;

        ucDetect    = 0x77;
    }
    while (1);

    // Abort if no suitable color is found
    if (0 == ulTemp0)   return ERROR_NOTACTIVE;

    // Select color for auto-phase tracking
    RTDSetByte(MARGIN_B_7D, NM | ucResult);

    // Find suitable threshold
    // We use phase 8 and 24 to find out it

    ucPhase = 0x20;
    Set_Phase(ucPhase);

    ucResult    = 0x28;
    NM          = 0x00;
    do
    {
        do
        {
            ucResult    += 0x20;

            RTDSetByte(DIFF_THRED_7E, ucResult);
            RTDSetByte(AUTO_ADJ_CTRL_7F, ucDetect);

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

            Read_Auto_Info(1);

            if ((unsigned long)0x1000 > ((unsigned long *)Data)[1])
            {
                ucResult    -= 0x20;
                break;
            }
        }
        while (0x88 > ucResult);

        if (0x88 == ucResult)
        {
            NM  = ucResult;
            break;
        }
        else
        {
            if (0x20 == ucPhase)
            {
                NM  = ucResult;

                ucPhase = 0x60;
                Set_Phase(ucPhase);
            }
            else
            {
                if (NM < ucResult)      NM  = ucResult;
                
                break;
            }
        }
    }
    while (1);

    // Set threshold
    if(NM < 136) NM = 136;
    RTDSetByte(DIFF_THRED_7E, NM);
		
		// Set phase 31
		Set_Phase(0x7c);
		Delay_Xms(1);
		
		RTDSetByte(AUTO_ADJ_CTRL_7F, 0x77);

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

		Read_Auto_Info(3);
		ulTemp2     = ((unsigned long *)Data)[3];

		// Set phase 0
		Set_Phase(0x00 | ucDetect);
		Delay_Xms(1);
		
		RTDSetByte(AUTO_ADJ_CTRL_7F, 0x77);

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

		Read_Auto_Info(2);

		ulTemp1     = ((unsigned long *)Data)[2];
		ulTemp0     = 0;
		ucResult    = 0x04;
		ucPhase     = 0x04;

		do
		{
			Set_Phase(ucPhase);
			Delay_Xms(1);

			RTDSetByte(AUTO_ADJ_CTRL_7F, 0x77);
			
			Wait_Finish();
			if (ERROR_SUCCEED != Data[0])   return Data[0];

            Read_Auto_Info(1);

            ((unsigned long *)Data)[0]  
            = ulTemp2 + ulTemp1 + ((unsigned long *)Data)[1]
            - ((ulTemp1 > ulTemp2 ? ulTemp1 - ulTemp2 : ulTemp2 - ulTemp1) / 2)
            - ((ulTemp1 > ((unsigned long *)Data)[1] ? ulTemp1 - ((unsigned long *)Data)[1] : ((unsigned long *)Data)[1] - ulTemp1) / 2);


			if (ulTemp0 < ((unsigned long *)Data)[0])
			{
				ulTemp0     = ((unsigned long *)Data)[0];
				ucResult    = ucPhase - 0x04;
			}

			ulTemp2 = ulTemp1;
			ulTemp1 = ((unsigned long *)Data)[1];

			ucPhase = ucPhase + 0x04;
		}
		while (0x7c != ucPhase);

       ((unsigned long *)Data)[0]
        = ulTemp2 + ulTemp1 + ((unsigned long *)Data)[3]
        - ((ulTemp1 > ulTemp2 ? ulTemp1 - ulTemp2 : ulTemp2 - ulTemp1) / 2)
        - ((ulTemp1 > ((unsigned long *)Data)[3] ? ulTemp1 - ((unsigned long *)Data)[3] : ((unsigned long *)Data)[3] - ulTemp1) / 2);

       ((unsigned long *)Data)[1]
        = ulTemp1 + ((unsigned long *)Data)[3] + ((unsigned long *)Data)[2]
        - ((((unsigned long *)Data)[3] > ulTemp1 ? ((unsigned long *)Data)[3] - ulTemp1 : ulTemp1 - ((unsigned long *)Data)[3]) / 2)
        - ((((unsigned long *)Data)[3] > ((unsigned long *)Data)[2] ? ((unsigned long *)Data)[3] - ((unsigned long *)Data)[2] : ((unsigned long *)Data)[2] - ((unsigned long *)Data)[3]) / 2);

		if (ulTemp0 < ((unsigned long *)Data)[0])
		{
			ulTemp0     = ((unsigned long *)Data)[0];
			ucResult    = 0x78;
		}

		if (ulTemp0 < ((unsigned long *)Data)[1])
		{
			ulTemp0     = ((unsigned long *)Data)[1];
			ucResult    = 0x7c;
		}

		ucPhase     = (ucResult - 0x08) & 0x7c;
		Set_Phase(ucPhase);

		ulTemp0     = 0;
		ulTemp1     = 0;
		ulTemp2     = 0;
		((unsigned long *)Data)[2]  = 0;
        ((unsigned long *)Data)[3]  = 0;

		NM          = 4;
		do
		{
			ucDetect    = COLORS_RED;
            
			do
			{
				RTDSetByte(MARGIN_B_7D, ucDetect);
				RTDSetByte(AUTO_ADJ_CTRL_7F, 0x77);

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

                Read_Auto_Info(1);
				/*
				if (2 <= NM)                ulTemp0 += ((unsigned long *)Data)[1];

				if (3 >= NM && 1 <= NM)     ulTemp1 += ((unsigned long *)Data)[1];

				if (2 >= NM)                ulTemp2 += ((unsigned long *)Data)[1];
				*/
			switch (NM)
            {
            case 4 :
                ulTemp0 += ((unsigned long *)Data)[1];
                break;
            case 3 :
                ulTemp1 += ((unsigned long *)Data)[1];
                break;
            case 2 :
                ulTemp2 += ((unsigned long *)Data)[1];
                break;
            case 1 :
                ((unsigned long *)Data)[2] += ((unsigned long *)Data)[1];
                break;
            default :
                ((unsigned long *)Data)[3] += ((unsigned long *)Data)[1];
                break;
            }            
			}        
			while (ucDetect--);

			ucPhase = (ucPhase + 0x04) & 0x7c;

			Set_Phase(ucPhase);

		}while (NM--);

		 ulTemp0 = ulTemp0 + ulTemp1 + ulTemp2
        - ((ulTemp1 > ulTemp0 ? ulTemp1 - ulTemp0 : ulTemp0 - ulTemp1) / 2)
        - ((ulTemp1 > ulTemp2 ? ulTemp1 - ulTemp2 : ulTemp2 - ulTemp1) / 2);

    ulTemp1 = ulTemp1 + ulTemp2 + ((unsigned long *)Data)[2]
        - ((ulTemp2 > ulTemp1 ? ulTemp2 - ulTemp1 : ulTemp1 - ulTemp2) / 2)
        - ((ulTemp2 > ((unsigned long *)Data)[2] ? ulTemp2 - ((unsigned long *)Data)[2] : ulTemp2 - ((unsigned long *)Data)[2]) / 2);

    ulTemp2 = ulTemp2 + ((unsigned long *)Data)[2] + ((unsigned long *)Data)[3]
        - ((((unsigned long *)Data)[2] > ulTemp2 ? ((unsigned long *)Data)[2] - ulTemp2 : ulTemp2 - ((unsigned long *)Data)[2]) / 2)
        - ((((unsigned long *)Data)[2] > ((unsigned long *)Data)[3] ? ((unsigned long *)Data)[2] - ((unsigned long *)Data)[3] : ((unsigned long *)Data)[3] - ((unsigned long *)Data)[2]) / 2);


		// Using the largest value for phase
		if (ulTemp0 > ulTemp1)
		{
			ucResult    = (ulTemp0 > ulTemp2) ? (ucResult - 0x04) & 0x7c : (ucResult + 0x04) & 0x7c;
		}
		else if (ulTemp2 > ulTemp1)
		{
			ucResult    = (ucResult + 0x04) & 0x7c;
		}

		stMUD.PHASE = ucResult;
		Set_Phase(stMUD.PHASE);


/*
    //restore the bandwidth setup of ADC
    if(ucMode_Curr < MODE_1024x0768x70HZ)
    	RTDSetByte(ADC_REG_TEST_E9, 0x08);
    else 
        RTDSetByte(ADC_REG_TEST_E9, 0x10);
*/
    return ERROR_SUCCEED;
}

unsigned char Auto_Config(void)
{
    unsigned char   Result, Noise, Curr_PosH, Curr_PosV, Curr_Clock, Curr_Phase;

    bAutoInProgress = 1;
    
    Curr_PosH   = stMUD.H_POSITION;     // Save current stMUD.H_POSITION
    Curr_PosV   = stMUD.V_POSITION;     // Save current stMUD.V_POSITION
    Curr_Clock  = stMUD.CLOCK;          // Save current stMUD.CLOCK
    Curr_Phase  = stMUD.PHASE;          // Save current stMUD.PHASE

    if (ucV_Max_Margin < stMUD.V_POSITION)
    {
        stMUD.V_POSITION    = ucV_Max_Margin;
        Set_V_Position();
    }

//    RTDCodeW(ADC_DEFAULT);

    ///////////////////////////////
    //   Measure  NOISE_MARGIN   //
    ///////////////////////////////
    Result  = Min_Noise_Margin();
    Noise   = Data[0];
    
    //--------Auto_Clock-----------
    if (ERROR_SUCCEED == (Result & 0x80))
    {   
        stMUD.CLOCK = (stMUD.CLOCK) & 0xfc; // stMUD.CLOCK must be times of 4

        if (stMUD.CLOCK != Curr_Clock)  Set_Clock();

        ///////////////////////////////
        //       Adjust Clock        //
        ///////////////////////////////
        Result  = Auto_Clock_Do(Noise);
        
        if (ERROR_SUCCEED != (Result & 0x80))
        {
            if (stMUD.CLOCK != Curr_Clock)
            {
                // Fail to find out suitable clock. Restore original clock and H position.
                stMUD.H_POSITION    = Curr_PosH;
                stMUD.CLOCK         = Curr_Clock;

                Set_Clock();
                Set_H_Position();
            }
        }
        else
        {
            stMUD.H_POSITION    = usH_Start + 128 + 64 - usIPH_ACT_STA - (stMUD.CLOCK >> 1);

            if (ucH_Max_Margin < stMUD.H_POSITION)
                stMUD.H_POSITION    = ucH_Max_Margin;
            else if (ucH_Min_Margin > stMUD.H_POSITION)
                stMUD.H_POSITION    = ucH_Min_Margin;

            Set_H_Position();
        }
    }

    //---------Auto_Phase-----------
    if (ERROR_SUCCEED == (Result & 0x80))
    {   
        Result      = Auto_Phase_Do(Noise);

        if (ERROR_SUCCEED != (Result & 0x80))
        {
            // Restore Phase
            stMUD.PHASE = Curr_Phase;
            Set_Phase(stMUD.PHASE);

            if (ERROR_NOTACTIVE == Result)      Result  = ERROR_SUCCEED;
        }
    }

    //---------Auto_Position-----------
    if (ERROR_SUCCEED == (Result & 0x80))    
    {   
        ///////////////////////////////
        //    Adjust (H/V)Position   //
        ///////////////////////////////
        Result  = Auto_Position_Do(Noise);

        // Because Auto_Position_Do() never returns bit-7 error, we don't have to check here.
    }
    else
    {
        stMUD.V_POSITION    = Curr_PosV;
        Set_V_Position();
    }
    
    if (ERROR_SUCCEED == (Result & 0x80))   Save_MUD(ucMode_Curr);

    // Restore ADC Gain/Offset
    SetADC_GainOffset();

    bAutoInProgress = 0;

    return Result;
}

unsigned char Auto_Balance(void)
{
    unsigned char Result, Curr_PosV;

    bAutoInProgress = 1;

    Curr_PosV   = stMUD.V_POSITION;     // Save current stMUD.V_POSITION

    if (ucV_Max_Margin < stMUD.V_POSITION)
    {
        stMUD.V_POSITION    = ucV_Max_Margin;
        Set_V_Position();
    }

    // Do ADC gain/offset adjust
    Result  = Tune_Balance();

    // Restore vertical position
    if (Curr_PosV != stMUD.V_POSITION)
    {
        stMUD.V_POSITION    = Curr_PosV;
        Set_V_Position();
    }

    if (ERROR_SUCCEED != Result)
    {
        // Restore ADC Gain/Offset
        Load_GUD2();
        SetADC_GainOffset();
    }
    else
    {
    /*    stGUD0.CONTRAST         = 50;
        stGUD0.RTD_R_CONTRAST   = 50;
        stGUD0.RTD_G_CONTRAST   = 50;
        stGUD0.RTD_B_CONTRAST   = 50;

⌨️ 快捷键说明

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