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

📄 auto.c

📁 keil C51 LCD 驱动源码,其中还有I2C驱动,ADC驱动,键盘操作等,是一个完整的keil源代码,供大家参考
💻 C
📖 第 1 页 / 共 5 页
字号:
  Purpose  : adjust ADC phase value
  Input    :
  Output   : Word  PhaseValue          ADC phase value
  External : Byte  TruBuf[]            i2c i/o buffer
             Byte  SlvAdr              i2c slave address
             Byte  ByteCnt             i2c i/o byte count
             Byte  maxLeftValue        maximum left color value
             Byte  maxRightValue       maximum right color value
  Return   :
***************************************************************************/
Bool auto_phase_adjust()
{
#if (GOOD_AUTO==0)
 #if   (SMOOTH_PHASE==2)    /* find high ASOD and smooth curve phase */
    Byte i,j,k,l;
    Long IDATA total,aplval,aplval1;
    Long IDATA aplary[5];
    
    auto_set_asod();
    total = 0;
    for( i=0; i<5; i++ )
        aplary[i] = 0;
        
    for( i=k=0; i<36; i++ )
    {
       if( isVGAabsent() )   return FALSE; //break;
       auto_adc_phase( i%32 );
       auto_short_delay(2);

       auto_wait_asod();
       auto_get_zurac(ZRC_ASUM,8);
       
       aplval = 0;
       for(j=0; j<3; j++)
          aplval = aplval * 256 + TrmBuf[j];
       for(j=0; j<4; j++)
          if( TrmBuf[j]!=TrmBuf[4+j] )   break;
       if( j!=4 )
       {
          auto_wait_asod();
          auto_get_zurac(ZRC_ASUM,8);
          aplval1 = 0;
          for(j=0; j<3; j++)
             aplval1 = aplval1 * 256 + TrmBuf[j];

          for(j=0; j<4; j++)
             if( TrmBuf[j]!=TrmBuf[4+j] )  break;

          if( j==4 )
          {
             aplval = aplval1;
          }
          else
          {
             if( aplval > aplval1 )
                aplval = aplval1 / 2;
             else
                aplval = aplval / 2;
          }
       }
 #if  FINETUNE_PHASE      
       if( auto_get_width() > autoInfo[ModeCounter].width_def )
          aplval = (aplval*3) / 4;
       auto_set_asod();
 #endif      
       aplary[i%5] = aplval;
       aplval = 0;
       for(j=l=0; j<5; j++)
       {
          aplval += aplary[j];
          if (aplary[j]>=aplary[l])  l = j;
       }
       aplval = aplval-(aplary[l]-aplval/5);   // Alf
       
       if( aplval > total )
       {
          total = aplval;
          k = i;
       }
    }
    PhaseValue = (k+30) % 32;
    
    auto_adc_phase(PhaseValue);
    if( isVGAabsent() )   return FALSE;
    return TRUE;
 #elif (SMOOTH_PHASE==1)    /* find high ASOD and smooth curve phase */
    Byte i,j,k;
    Long IDATA aplval0,aplval1,aplval2;
    Long IDATA aplary[3];

    auto_set_asod();
    aplval2 = 0;
    for( i=0; i<34; i++ )
    {
       if( isVGAabsent() )   break;
       auto_adc_phase( i%32 );
       auto_short_delay(2);

       auto_wait_asod();
       auto_get_zurac(ZRC_ASUM,8);

       aplval0 = 0;
       for(j=0; j<3; j++)
          aplval0 = aplval0 * 256 + TrmBuf[j];

       for(j=0; j<4; j++)
          if( TrmBuf[j]!=TrmBuf[4+j] )   break;
       if( j!=4 )
       {
          auto_wait_asod();
          auto_get_zurac(ZRC_ASUM,8);
          aplval1 = 0;
          for(j=0; j<3; j++)
             aplval1 = aplval1 * 256 + TrmBuf[j];

          for(j=0; j<4; j++)
             if( TrmBuf[j]!=TrmBuf[4+j] )  break;

          if( j==4 )
          {
             aplval0 = aplval1;
          }
          else
          {
             if( aplval0 > aplval1 )
                aplval0 = aplval1 / 2;
             else
                aplval0 = aplval0 / 2;
          }
       }
 #if  FINETUNE_PHASE      
       if( auto_get_width() > autoInfo[ModeCounter].width_def )
          aplval0 = aplval0 / 2;
       auto_set_asod();
 #endif
       aplary[i%3] = aplval0;
       if( i >= 2 )
       {
          j = (i - 1) % 3;
          k = (i + 1) % 3;

          if( aplary[j] > aplary[k] )
             aplval1 = aplary[j] - aplary[k];
          else
             aplval1 = aplary[k] - aplary[j];

          if( aplary[j] > aplval0 )
             aplval1 += (aplary[j] - aplval0);
          else
             aplval1 += (aplval0 - aplary[j]);

          aplval1 = aplval1 * 4;              /* enlarge the effect of difference */
          if( aplary[j] > aplval1 )
             aplval1 = aplary[j] - aplval1;    /* Sum - Difference */
          else
             aplval1 = 0;

          if( aplval1 > aplval2 )
          {
              PhaseValue = (i - 1) % 32;
              aplval2 = aplval1;
          }
       }
    }

    auto_adc_phase(PhaseValue);
    if( isVGAabsent() )   return FALSE;
    return TRUE;
 #else    /* find highest ASOD phase */
    Byte i,j,k;
    Long IDATA aplval0,aplval1,aplval2;

    aplval1 = 0;
    PhaseValue = autoBval;
    k = (PhaseValue + 29) % 32;
    for( i=0; i<7; i++ )      /* check phase boundary(-3..+3) */
    {
       if( isVGAabsent() )   break;

       auto_adc_phase( k );
       auto_short_delay(2);

       auto_wait_asod();
       auto_get_zurac(ZRC_ASUM,8);

       aplval0 = 0;
       for(j=0; j<3; j++)
       {
          aplval0 = aplval0 * 256 + TrmBuf[j];
       }

       for(j=0; j<4; j++)
          if( TrmBuf[j]!=TrmBuf[4+j] )   break;
       if( j!=4 )
       {
          auto_wait_asod();
          auto_get_zurac(ZRC_ASUM,8);
          aplval2 = 0;
          for(j=0; j<3; j++)
             aplval2 = aplval2 * 256 + TrmBuf[j];

          for(j=0; j<4; j++)
             if( TrmBuf[j]!=TrmBuf[4+j] )  break;

          if( j==4 )
          {
             aplval0 = aplval2;
          }
          else
          {
             if( aplval0 > aplval2 )
                aplval0 = aplval2 / 2;
             else
                aplval0 = aplval0 / 2;
          }
       }

       if( aplval0 > aplval1 )
       {
          aplval1 = aplval0;
          PhaseValue = k;           /* best phase, maximum ASUM */
       }
       k = (k+1) % 32;
    }

    if( PhaseValue==0 )  PhaseValue = 1;
    auto_adc_phase(PhaseValue);

    if( isVGAabsent() )   return FALSE;
    return TRUE;
 #endif
#else  /* GOOD_AUTO==1 */
 #if   (SMOOTH_PHASE==2)    /* find high ASOD and smooth curve phase */
    Byte i,j,k,l;
    Long IDATA total,aplval;
    Long IDATA aplary[5];
    
    auto_set_asod();
    total = 0;
    for( i=0; i<5; i++ )
        aplary[i] = 0;
        
    for( i=k=0; i<36; i++ )
    {
       if( isVGAabsent() )   break;
       auto_adc_phase( i%32 );
       auto_short_delay(2);

       auto_wait_asod();
       auto_get_zurac(ZRC_ASUM,8);
       
       aplval = 0;
       for(j=0; j<3; j++)
          aplval = aplval * 256 + TrmBuf[j];
 #if  FINETUNE_PHASE      
       if( auto_get_width() > autoInfo[ModeCounter].width_def )
          aplval = (aplval*3) / 4;
       auto_set_asod();
 #endif       
       aplary[i%5] = aplval;
       aplval = 0;
       for(j=l=0; j<5; j++)
       {
          aplval += aplary[j];
          if (aplary[j]>=aplary[l])  l = j;
       }
       aplval = aplval-(aplary[l]-aplval/5);   // Alf
       
       if( aplval > total )
       {
          total = aplval;
          k = i;
       }
    }
    PhaseValue = (k+30) % 32;
    
    auto_adc_phase(PhaseValue);
    if( isVGAabsent() )   return FALSE;
    return TRUE;
 #elif (SMOOTH_PHASE==1)    /* find high ASOD and smooth curve phase */
    Byte i,j,k;
    Long IDATA aplval0,aplval1,aplval2;
    Long IDATA aplary[3];

    auto_set_asod();
    aplval2 = 0;
    for( i=0; i<34; i++ )
    {
       if( isVGAabsent() )   break;
       auto_adc_phase( i%32 );
       auto_wait_asod();
       auto_get_zurac(ZRC_ASUM,4);

       aplval0 = 0;
       for(j=0; j<3; j++)
          aplval0 = aplval0 * 256 + TrmBuf[j];
 #if  FINETUNE_PHASE      
       if( auto_get_width() > autoInfo[ModeCounter].width_def )
          aplval0 = aplval0 / 2;
       auto_set_asod();
 #endif
       aplary[i%3] = aplval0;
       if( i >= 2 )
       {
          j = (i - 1) % 3;
          k = (i + 1) % 3;

          if( aplary[j] > aplary[k] )
             aplval1 = aplary[j] - aplary[k];
          else
             aplval1 = aplary[k] - aplary[j];

          if( aplary[j] > aplval0 )
             aplval1 += (aplary[j] - aplval0);
          else
             aplval1 += (aplval0 - aplary[j]);

          aplval1 = aplval1 * 4;              /* enlarge the effect of difference */
          if( aplary[j] > aplval1 )
             aplval1 = aplary[j] - aplval1;    /* Sum - Difference */
          else
             aplval1 = 0;

          if( aplval1 > aplval2 )
          {
              PhaseValue = (i - 1) % 32;
              aplval2 = aplval1;
          }
       }
    }
    auto_adc_phase(PhaseValue);
    if( isVGAabsent() )   return FALSE;
    return TRUE;
 #else    /* find highest ASOD phase */
    Byte i,j,k;
    Long IDATA aplval0,aplval1,aplval2;

    aplval1 = 0;
    PhaseValue = autoBval;
    k = (PhaseValue + 29) % 32;
    for( i=0; i<7; i++ )      /* check phase boundary(-3..+3) */
    {
       if( isVGAabsent() )   break;

       auto_adc_phase( k );
       auto_wait_asod();
       auto_get_zurac(ZRC_ASUM,4);

       aplval0 = 0;
       for(j=0; j<3; j++)
       {
          aplval0 = aplval0 * 256 + TrmBuf[j];
       }

       if( aplval0 > aplval1 )
       {
          aplval1 = aplval0;
          PhaseValue = k;           /* best phase, maximum ASUM */
       }
       k = (k+1) % 32;
    }

    if( PhaseValue==0 )  PhaseValue = 1;
    auto_adc_phase(PhaseValue);

    if( isVGAabsent() )   return FALSE;
    return TRUE;
 #endif
#endif
}

/***************************************************************************
  Function : auto_set_hvpos
  Purpose  : adjust horizontal display position
  Input    :
  Output   : Word  HorPositionValue    horizontal position value
  External : Byte  TruBuf[]            i2c i/o buffer
             Byte  SlvAdr              i2c slave address
             Byte  ByteCnt             i2c i/o byte count
             Word  maxLeftLine         line index of maximum left color value
             Byte  ModeCounter         VGA mode index
  Return   :
***************************************************************************/
void auto_set_hvpos()
{
#if (GOOD_AUTO==0)
    Bool  HPosOK,VPosOK;
    Byte  DATA  i;
    Word  IDATA shtemp1,shtemp2,shtemp3,shtemp4;
    Word  IDATA svtemp1,svtemp2,svtemp3,svtemp4;
    Word  IDATA shtemp5,shtemp6;

    HPosOK = 0;
    VPosOK = 0;

    auto_min_threshold( MIN_THRESHOLD );
    for( i=0; i<20; i++)
    {
       auto_set_mline(0);
       auto_wait_mline(0);
       auto_get_zurac(ZRC_AVSTART,8);
       if( HPosOK==0 )
       {
          shtemp1 = MAKEWORD(TrmBuf[5],TrmBuf[4]);
          shtemp2 = MAKEWORD(TrmBuf[7],TrmBuf[6]);
       }
       if( VPosOK==0 )
       {
           svtemp1 = MAKEWORD(TrmBuf[1],TrmBuf[0]);
           svtemp2 = MAKEWORD(TrmBuf[3],TrmBuf[2]);
       }

       auto_set_mline(0);
       auto_wait_mline(0);
       auto_get_zurac(ZRC_AVSTART,8);
       if( HPosOK==0 )
       {
          shtemp3 = MAKEWORD(TrmBuf[5],TrmBuf[4]);
          shtemp4 = MAKEWORD(TrmBuf[7],TrmBuf[6]);
       }
       if( VPosOK==0 )
       {
          svtemp3 = MAKEWORD(TrmBuf[1],TrmBuf[0]);
          svtemp4 = MAKEWORD(TrmBuf[3],TrmBuf[2]);
       }

       if( HPosOK==0 )
       {
          if( (shtemp1==shtemp3) && (shtemp2==shtemp4) && (shtemp1!=0x07FF) )

⌨️ 快捷键说明

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