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

📄 modedet.c

📁 keil C51 LCD 驱动源码,其中还有I2C驱动,ADC驱动,键盘操作等,是一个完整的keil源代码,供大家参考
💻 C
📖 第 1 页 / 共 3 页
字号:
    // Force screen background color to black
    MUTEEnable();
    
    PowerPanel(1);          // Panel power-on
    ShortDelay(100);            //algu 1120 40->100
    InitialOsd();
    OsdInitCtrl();          // OSD control register data

    PowerBacklight(1);      // BackLight on
    FgNoSignal   = 1;
//  FgMenuChange = 1;
    OSDNumber    = OSDTitle;

//algu 1121    FgOsdAct     = 1;
    FgFreeRun    = 1;
}

void ZuracAutoFreeRun( Byte auto_on )   //tonny
{
#if FREERUN_AUTO
    Byte  bval;
    Word IDATA clock,hpos,vpos;

    if( auto_on )
    {
//     PowerBacklight(0);           // BackLight off
//     ZuracWriteByte(0x04,0x10);   // Flush Screen to BLACK
  #if  BLUE_AUTO
       OsdEnable(0);                // disable osd display
       OsdClearAll();               // OSD control register data
  #endif
//     ShortDelay(10);
//     ZuracWriteByte(0x04,0x20);   // disable output
//     PowerPanel(0);               // Panel power-off
       clock = ClockValue;
       hpos = HorPositionValue;
       vpos = VerPositionValue;
       FreeRunInit();               // free run initial
       ClockValue = clock;
       HorPositionValue = hpos;
       VerPositionValue = vpos;
       ShortDelay(40);
       PowerPanel(1);               // Panel power-on
       ShortDelay(10);
       ZuracWriteByte(0x04,0x10);   // Flush Screen to blue
       ShortDelay(40);
       PowerBacklight(1);           // BackLight on

       // set RGB 24/48 input port
       if( ModeInputport[ModeCounter]==2 )  bval = 0x01;  // bit[1]==0,RGB 48 bit input
       else                                 bval = 0x03;  // bit[1]==1,RGB 24 bit input
  #if  (ADC_CHIP==ADI_9883)
       bval |= 0x80;                // bit[7]==1 invert input clock
  #endif
       ZuracWriteByte(0x02,bval);

  #if  BLUE_AUTO
       OsdMenuItem(L3_AUTO_ADJUST);
       ZuracWriteByte(0x04,0x12);   // Flush Screen to blue
       OsdWrite(0xC3,0x20);
       OsdOpenUp();
  #endif
       FgFreeRun = 1;
    }
    else
    {
       PowerBacklight(0);           // BackLight off
    //   HScaling = 32;
    //   OsdEnable( 0 );
       OsdClearAll();
       OSDNumber = L0_NOOSD;
    //   Delay(25);
       ZuracWriteByte(0x04,0x10);   // Normal Screen
       FgFreeRun = 0;
       PowerPanel(0);               // Panel power-off
       EepromTimingRecall( ModeCounter );
       Ttfc( ModeCounter,1 );
       Zurac0Atoggle();
       ShortDelay(20);
       PowerPanel(1);               // Panel power-on
       

//     HorPositionValue++;
//     SetHorPosition(INCREASE,0);
//     HorPositionValue--;
//     SetHorPosition(DECREASE,0);
       ShortDelay(100);         //algu 1122 40->100

       PowerBacklight(1);           // BackLight on

    }
#else  // set Blue screen only
    if( auto_on )
    {
 #if  BLUE_AUTO
       OsdEnable(0);
       OsdClearAll();               /* OSD control register data */
       OsdMenuItem(L3_AUTO_ADJUST);
       ZuracWriteByte(0x04,0x12);   /* Flush Screen to blue */
       OsdWrite(0xC3,0x20);
       OsdOpenUp();
 #endif
    }
    else
    {
       HScaling = 32;
       FgScalerAct = FgScalerAdj = 1;
       OsdEnable( 0 ); 
       OSDNumber = L0_NOOSD;
 #if  BLUE_AUTO
       ZuracWriteByte(0x04,0x00);   /* Normal Screen */
 #endif
    }
#endif
}

/************************************************************************/
/* Function    : SetModeChangeStatus                                    */
/* Description : set mode change status                                 */
/*       Input : None                                                   */
/*      Output : none                                                   */
/************************************************************************/
void SetModeChangeStatus( void )
{
#if  ZURAC_HWMD
    if ( FgSogSignal || FgSepSignal || FgCompSignal )
    { 
        CurHFreq = HWMD_HfCounter();        /* get HfCounter */
        CurVFreq = HWMD_VfCounter();        /* get VfCounter */
 
 #if ((OUTPUT_MODE==OUTPUT_SXGA) && (PANEL_DEFAULT==PANEL_ACER))
        HS1frCount = ((long)(CurVFreq+2) * 352) / (long)(CurHFreq-2);
        HS2frCount = ((long)(CurVFreq-2) * 352) / (long)(CurHFreq+2);
         
        HS2frCount = HS1frCount + HS2frCount;
        HS1frCount = HS2frCount / 2; 
 #else
        HS1frCount = ((long)CurVFreq * 352) / (long)CurHFreq;
 #endif       
        
        CurHFreq = HWMD_HFrequency();       /* get HFrequency */
        CurVFreq = HWMD_VFrequency();       /* get VFrequency */
    //  HS1frCount = ((long)CurHFreq * 1000) / (long)CurVFreq;
        FgModeChange = 1;
        if ( FgSepSignal || FgCompSignal )
        {
            FgNoSignal   = 0;
        }
        else
        {
            SyncSource = 0xA0;
            HWMD_ChangeSource();
            HWMD_ReadStatus();
            ShortDelay(100);
            HWMD_ReadStatus();
            if( FgHWMDInt )
            {
                FgHWMDInt = 0;
                EX0 = 1;             // enable INT0 interrupt
            }
            MuteTimer = 0;
            FgModeDetect = 0;
            if( LastHCountH==HCountH  && LastVCountH==VCountH && 
                LastHPol==CurrentHPol && LastVPol==CurrentVPol )
            {     
                FgModeChange = 0;
            }
            else
            {
                FgNoSignal = 0;
                LastHCountH = HCountH;
                LastVCountH = VCountH;
                LastHPol = CurrentHPol;
                LastVPol = CurrentVPol;
            }
        }
        if( CurHFreq > 20000 )  FgNoSignal = 1;
//      /* Check Hsync frequency : 15KHz - 93KHz */
//      if((CurHFreq < 1500) || (CurHFreq > 9300))  FgNoSignal = 1;
//      /* Check Vsync frequency :  40Hz - 90Hz  */
//      if((CurVFreq < 4000) || (CurVFreq > 8750))  FgNoSignal = 1;
        if( InputSource==INPUT_DIGITAL )
        {
            if( DVI_DET_PIN==0 || DVIENN_PIN==0 )   FgNoSignal = 1;        
        } 
    }
#endif
}
 
#if  DIGITAL_DOS_MODE
Byte ModeGetDOSMode( void )
{
    Byte i,vn,vd;
    Word IDATA wval0,wval1,wval2;

    i = ModeCounter;        // backup mode number
    if( ModeCounter==0 ||                     /* 640x350/70 */
        ModeCounter==DosModeTable[0][0] ||    /* 720x400/70 */
        ModeCounter==DosModeTable[0][1] )     /* 640x400/70 */
    {
        ModeCounter = DosModeTable[0][0];     
        wval2 = 14268;      // Vsynctime = 1000000 / 70.086 = 14.268 ms
    }
    else
    {
        ModeCounter = DosModeTable[1][0];     /* 720x400/85 */
        wval2 = 11759;      // Vsynctime = 1000000 / 85.039 = 11.759 ms
    }
    
    PowerBacklight(0);      // Backlight power-off
    PowerPanel(0);          // Panel power-off
    PowerScaler(1);         // Zurac power-on
    
    EepromTimingDefault(ModeCounter);
    Ttfc(ModeCounter, 1);
//    Zurac0AToggle();
    ModeCounter = i;

    i  = 4 * mode_factor[9];
    vn = scale_factor_table[i+2];      // scale factor
    vd = scale_factor_table[i+3];

    // Enlarge Vn & Vd to maximum
    for( i=1; i<64; i++ )
    {
       if( (vn * i) > 64 )
          break;
    }
    --i;
    vn = vn * i;
    vd = vd * i;

    wval0 = (Word) (449 * (Word)vn) / (Word)vd;
    wval2 = (Word) (((Long)wval2 * 16) / wval0);

    // set Vsf
    ZuracWriteByte(0x6F,vn);
    ZuracWriteByte(0x70,vd);

    // Set PV start/total & H Sync pulse width
    ZuracWriteWord(0x34,0x0028);        // output v-start
    ZuracWriteWord(0x38,wval0);         // output total 
    ZuracWriteByte(0x3A,0xFF);          // output Hsync width
    ZuracWriteWord(0x44,0x0028);        // background v-start

    ZuracWriteByte(0xD0,0x80);          // disable interrupt
    Delay(40);
    HWMD_ReadStatus();
    ShortDelay(5);
    HWMD_ReadStatus();

    ZuracWriteByte(0xD0,0xC4);          // select DE, disable INT and count by line
    HWMD_ReadStatus();
    ShortDelay(5);
    HWMD_ReadStatus();

    vn  = IP;                           // save IP value
    IP  = 0x24;                         // INT1 & Timer2 highest priority
    EX1 = 1;                            // enable INT1(Vsync) interrupt
    for( i=0,wval1=0; i<4; i++ )
    {
       Delay(10);
       wval1  += PHsync16;
    }
    wval1 /= 4;                         // output 16 PHsync average time

    wval0 = HWMD_VfCounter();           // get input DE lines count
    
    ZuracWriteByte(0xD0,0x83);          // select sep SYNC, disable INT
    Delay(15);
    HWMD_ReadStatus();
    ShortDelay(5);
    HWMD_ReadStatus();
    
    ZuracWriteByte(0xD0,0xA3);          // select sep SYNC, disable INT
    EX1 = 0;                            // disable INT1 interrupt
    ET2 = 0;                            // disable Timer2 interrupt
    IP  = vn;                           // restore IP value

    if( wval1 > wval2 )                 // get 16 PHsync time difference
        wval1 = wval1 - wval2;          
    else    
        wval1 = wval2 - wval1;
        
    if( wval1 <= 10 )                   // 16 PHsync time difference L.E. 10us
        i = 2;   /* 720x400 */
    else if( wval0<=410 && wval0>=390 ) // input DE lines count 
        i = 1;   /* 640x400 */
    else
        i = 0;   /* 640x350 */
    
    return i;
}
#endif

/************************************************************************/
/* Function    : RangeDetect                                            */
/* Description : Detect H,V frequency                                   */
/*       Input : None                                                   */
/*      Output : 1 -> invalid                                           */
/*             : 0 -> valid                                             */
/************************************************************************/
//#define HFREQMIN17      2400//alf 1107 //2900
//#define HFREQMAX17      9000
//#define VFREQMIN17      4850
//#define VFREQMAX17      8400          //algu 1113 //8650


//algu 1122
//return 0->normal mode, 1->Fail-Safe mode, 2->Over-Range, 3->No Signal, 4->Unknow Mode

Byte    RangeDetect()
{
        if (  CurHFreq>=2900 && CurHFreq<=8100  && CurVFreq>=4900 && CurVFreq<=7600)    //normal mode
        {
                if( ModeCounter < TOTAL_MODE_NUMBER )          /* filter out non-supported mode */
                {
                        if( ModeSupport[ModeCounter]==0 )
                        {
                                ModeCounter = TOTAL_MODE_NUMBER;        /* make this mode as unknown mode */
                                return Unknow_Mode;             
                        }
                        else if( ModeSupport[ModeCounter]==2 )
                        {
                                #if (ADC_IS_48_BIT==0)   /* filter out scaling down mode */   //mk0614
//algu 1130                             ModeCounter = TOTAL_MODE_NUMBER;
                                return Fail_Safe_Mode;  
                                #endif
                        }
                        return Normal_Mode;
                }
                return Unknow_Mode;
        }               
        else if ( CurHFreq>=2900 && CurHFreq<=8100  && CurVFreq>7600 && CurVFreq<=8600 )        // Fail-Safe mode
        {
                if( ModeCounter < TOTAL_MODE_NUMBER )          /* filter out non-supported mode */
                {
                        if( ModeSupport[ModeCounter]==0 )
                        {
                                ModeCounter = TOTAL_MODE_NUMBER;        /* make this mode as unknown mode */
                                return Unknow_Mode;             
                        }
                        else if( ModeSupport[ModeCounter]==2 )
                        {
                                #if (ADC_IS_48_BIT==0)   /* filter out scaling down mode */   //mk0614
//algu 1130                             ModeCounter = TOTAL_MODE_NUMBER;
                                return Fail_Safe_Mode;  
                                #endif
                        }
                return Fail_Safe_Mode;
                }
                return Unknow_Mode;
        }
        else if ( CurHFreq>=1000 && CurVFreq>=1000 )
        {
                return  Over_Range_Mode;
        }
        else
        {
                return  No_Signal_Mode;
        }       
                

}

⌨️ 快捷键说明

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