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

📄 lcd_auto.c

📁 液晶显示器程序代码
💻 C
📖 第 1 页 / 共 5 页
字号:
               ucResult = (ucPhase == 0x00) ? 0x7c : ucPhase - 0x04;
           }
           ucDetect -= 1;
           
           ulTemp2 = ulTemp0;
           ulTemp0 = ((unsigned long *)Data)[3];

        }while(ucDetect);


#else   //FAST AUTO method 2
		// Set phase 30
		Set_Phase(0x78);
		Delay_Xms(1);
		
		RTDSetByte(AUTO_ADJ_CTRL_7F, 0x77);

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

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

		// Set phase 0
		//Set_Phase(0x00 | ucDetect);
        Set_Phase(0x00);
		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    = 0x08;
		ucPhase     = 0x08;//2 step rought scan
		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(3);
       
//			((unsigned long *)Data)[0]  = ulTemp1 + ulTemp2 + ((unsigned long *)Data)[1];

           ((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);


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

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

			ucPhase = ucPhase + 0x08;
		}
		while (0x78 != ucPhase);


//		((unsigned long *)Data)[0]  = ulTemp1 + ulTemp2 + ((unsigned long *)Data)[3];
//		((unsigned long *)Data)[1]  = ((unsigned long *)Data)[3] + ulTemp1 + ((unsigned long *)Data)[2];


       ((unsigned long *)Data)[0]//phase26+phase28+phase30
        = 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);
       
		

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


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

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


        ucPhase = ucResult >= 0x08 ? (ucResult - 0x08) : (ucResult + 0x80 - 0x08);
        ulTemp0 = 0;
        ulTemp1 = 0;
        ulTemp2 = 0;
        ucDetect = 3;

        Set_Phase(ucPhase); //set Phase(n-2)
		Delay_Xms(1);
		
		RTDSetByte(AUTO_ADJ_CTRL_7F, 0x77);

		Wait_Finish();
		if (ERROR_SUCCEED != Data[0])   return Data[0];
        Read_Auto_Info(1);
        ulTemp1 = ((unsigned long*)Data)[1];

        ucPhase = (ucPhase == 0x7c) ? 0x00 : ucPhase + 0x04; //set Phase(n-1)
        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(2);
        ulTemp2 = ((unsigned long*)Data)[2];


        do //detail scan by one step from phase(n-2) ~ pnase (n+2)
        {
           ucPhase = (ucPhase == 0x7c) ? 0x00 : ucPhase + 0x04;
           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(3);

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

           if(((unsigned long*)Data)[0] > ulTemp0)
           {
               ulTemp0 = ((unsigned long*)Data)[0];
               ucResult = (ucPhase == 0x00) ? 0x7c : ucPhase - 0x04;
           }
           ucDetect -= 1;
           
           ulTemp1 = ulTemp2;
           ulTemp2 = ((unsigned long *)Data)[3];

        }while(ucDetect);
        
//        ucDebug_Value1 = ucResult;
#endif        

		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;

    unsigned char ucTemp1;
	unsigned int usTemp;


    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 - 1;
        Set_V_Position();
    }

//   RTDCodeW(ADC_DEFAULT);

/////////original formula////////////////////////////////////////////
    //Set the H Position center(without IHS_Delay)
/*
   	stMUD.H_POSITION = 128; 
    
	if(128 >= stMUD.H_POSITION)
    {
    ucTemp = 128 - stMUD.H_POSITION; 
    
	if(stMUD.CLOCK > 128)
	   ucTemp1 = 128;
	else
	   ucTemp1 = stMUD.CLOCK;

    //According to the H_Position adjust the IHS pre-delay
	ucH_Min_Margin = 128 - ucTemp - (64 - (ucTemp1 >> 1));
    //Return the IPH_ACT_STA to the original one first,and compensate the IHS pre-delay
    //The h position must be equal after change the IHS delay and IPH_ACT_STA
	usIPH_ACT_STA = usIPH_ACT_STA + 50 - ucTemp - (64 - (ucTemp1 >> 1));
	usTemp = usIPH_ACT_STA;

	Set_H_Position();
    }
	*/
///////////////////////////////////////////////////////////////////    

////////////////////////////////////////////////////////////////////
    //Set the H Position center(without IHS_Delay)

   	stMUD.H_POSITION = 128; 
    
	
    //ucTemp = 128 - stMUD.H_POSITION; 
    
	if(stMUD.CLOCK > 128)
	   ucTemp1 = 128;
	else
	   ucTemp1 = stMUD.CLOCK;

    //According to the H_Position adjust the IHS pre-delay
	ucH_Min_Margin = 128 - (64 - (ucTemp1 >> 1));
    //Return the IPH_ACT_STA to the original one first,and compensate the IHS pre-delay
    //The h position must be equal after change the IHS delay and IPH_ACT_STA
    usIPH_ACT_STA   = CAP_WIN[ucMode_Curr][1];
    
    if(ucMode_Curr < MODE_0800x0600x75HZ)
		Data[0] = 2;
    else if(ucMode_Curr < MODE_1280x1024x75HZ)
		Data[0] = 5;
    else
		Data[0] = 3;

//    usIPH_ACT_STA   = usIPH_ACT_STA + Data[0] - PROGRAM_HDELAY;

	//usIPH_ACT_STA = usIPH_ACT_STA + 50 - (64 - (ucTemp1 >> 1));
    usIPH_ACT_STA = CAP_WIN[ucMode_Curr][1] + Data[0] - PROGRAM_HDELAY - (64 - (ucTemp1 >> 1));
	
    usTemp = usIPH_ACT_STA;

	Set_H_Position();
        
    RTDSetByte(STATUS0_01, 0x00);  // Clear status
    RTDSetByte(STATUS1_1F, 0x00);  // Clear status

    
///////////////////////////////////////////////////////////////////    

    ///////////////////////////////
    //   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);

//////////////////////////////////////////////////////////////////////////////
/*
    if(ucH_Min_Margin == (128 - ucTemp - (64 - (ucTemp1 >> 1))))
	{
        if(usTemp != usIPH_ACT_STA)
		{  //if usIPH_ACT_STA has been modified, turn back to original set value
           //stMUD.H_POSIITON also have to follow up the change of usIPH_ACT_STA
		   stMUD.H_POSITION = stMUD.H_POSITION - (usTemp - usIPH_ACT_STA);
		   usIPH_ACT_STA = usTemp - 50 + ucTemp + (64 - (ucTemp1 >> 1));
		}
		else
		    usIPH_ACT_STA   = usIPH_ACT_STA - 50 + ucTemp + (64 - (ucTemp1 >> 1));

		ucH_Min_Margin  = 128 - 50;   
		Set_H_Position();
	}
	Set_Phase(stMUD.PHASE);
	*/
////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////

    if(ucH_Min_Margin == (128 - (64 - (ucTemp1 >> 1))))
	{
        if(usTemp != usIPH_ACT_STA)
		{  //if usIPH_ACT_STA has been modified, turn back to original set value
           //stMUD.H_POSIITON also have to follow up the change of usIPH_ACT_STA
		   //Data[3] = 78 - usIPH_ACT_STA; Save the usIPH_ACT_STA compensate value
		   stMUD.H_POSITION = stMUD.H_POSITION - (usTemp - usIPH_ACT_STA);
		   usIPH_ACT_STA = usTemp - 50 + (64 - (ucTemp1 >> 1));
		   Data[3] = 0x80 | (78 - stMUD.H_POSITION);	    
         
		}
		else
		{
		    usIPH_ACT_STA   = usIPH_ACT_STA - 50 + (64 - (ucTemp1 >> 1));
			Data[3] = 0;
		}

		// Save Frame-Sync Settings
           Data[0] = 4;
           Data[1] = ADDR_EROM1;
           Data[2] = (ucMode_Curr - 1);          
		   
           

		 if(0x80 < stMUD.H_POSITION)
         {
             if(stMUD.H_POSITION - 0x80 < 10)
             {
                 usIPH_ACT_STA += (stMUD.H_POSITION - 0x80);
                 Data[3] += (stMUD.H_POSITION - 0x80);
                 stMUD.H_POSITION = 0x80;                            
              }

         }
         else if(0x80 > stMUD.H_POSITION)
         {
              if(0x80 - stMUD.H_POSITION < 10)
              {
                 usIPH_ACT_STA -= (0x80 - stMUD.H_POSITION);

			     Data[3] = (0x80 - stMUD.H_POSITION ) | 0x80;
                 stMUD.H_POSITION = 0x80;

              }
         }

		I2CWrite(Data);
        Delay_Xms(SET_2404_DELAY);

		ucH_Min_Margin  = 128 - 50;   
		Set_H_Position();
        
	}
	Set_Phase(stMUD.PHASE);
    if (ERROR_SUCCEED == (Result & 0x80))   Save_MUD(ucMode_Curr);

    RTDSetByte(STATUS0_01, 0x00);  // Clear status
    RTDSetByte(STATUS1_1F, 0x00);  // Clear status

/////////////////////////////////////////////////////////////////////////////////

    // Restore ADC Gain/Offset
//  SetADC_GainOffset();
   
    bAutoInProgress = 0;
    Set_Phase(stMUD.PHASE);
	
    return Result;
}

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

    bAutoInProgress = 1;

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

⌨️ 快捷键说明

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