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

📄 lcd_main.c

📁 keil c51平台,此代码可用于学习TFT LCD 之TCON,SCALER,OSD,(本人自己修改)
💻 C
📖 第 1 页 / 共 5 页
字号:
        Data[3] = Data[1];
        Data[2] = Data[2] & 0x8f;
        usHsync = ((unsigned int *)Data)[1];    // Current usHsync timing
        usVsync = ((unsigned int *)Data)[2];    // Current usVsync timing

        // Polarity must be correct
        if ((bVpole_Curr != bVpole_Prev) || (bHpole_Curr != bHpole_Prev))
        {
            RTDRead(VGIP_SIGINV_05, 0x01, N_INC);
            
            Data[0] &= 0xd7;    // HS_RAW & VS positive

            if (!bHpole_Curr)   Data[0] |= 0x20;

            if (!bVpole_Curr && SYNC_SS == ucSync_Type)     Data[0] |= 0x08;    // Seperate sync
            
            RTDSetByte(VGIP_SIGINV_05, Data[0]);

            ucMode_Found    = MODE_NOSUPPORT;
        }
        else
        {
            if (0x07ff <= usHsync || 0x07ff <= usVsync || 0 == usHsync || 0 == usVsync)     // Check overflow
            {
                ucMode_Found    = MODE_NOSUPPORT;
            }
            else
            {
                if ((usHsync < (usStdHS - 1)) || (usHsync > (usStdHS + 3)) ||
                    (usVsync < (usStdVS - 1)) || (usVsync > (usStdVS + 3)))
                {   
                    ucMode_Found    = MODE_NOSUPPORT;
                }
                else
                {
                    ucMode_Found    = ucMode_Curr;
                }
            }
        }
    }
    
    if (MODE_NOSUPPORT == ucMode_Found)
    {
    	Reset_Mode();
    }	
    else
    {
        bStable = 1;    // Set bStable to 1 when signal timing is stable.
	LED_GREEN = 0X00;
	LED_RED = 0X01;	

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

        if(bFrameSync)
           RTDSetBit(ODD_CTRL_8E,0xef,0x10);
#endif
    }

}


/////////////////////////////////////////////////////////
//------------------ Detect VIDEO Mode ----------------//
/////////////////////////////////////////////////////////
#if (VIDEO_CHIP == TW_9905)
void Reset_TW9905(void)
{
    Delay_Xms(2);
    bVDC_RESET=0;
    Delay_Xms(20);
    bVDC_RESET=1;
}
void I2CWrite_TW990X(unsigned char address,unsigned char wdata)
{
    Data[0] = 4;
    Data[1] = 0x8c;
    Data[2] = address;
    Data[3] = wdata; 
    I2CWrite(Data);
}
#endif

#if(TV_NONE != TV_CHIP || VIDEO_CHIP == TW_9905)
unsigned char I2CRead_TW990X(unsigned char address)
{
    unsigned char rdata;
    I2CSendAddr(0x8c, address, 0);
    I2CSendAddr(0x8c, 0, 1);
    rdata = I2CGetByte(1);
    I2CSendStop();
    return rdata;
}
#endif

#if(TV_CHIP != TV_NONE)
void Detect_TV_Mode(void)
{
  
    ucAV_Mode = 0x02;     //PAL 50HZ
    ucMode_Curr = MODE_VIDEO50HZ;
    Delay_Xms(20);
    RTDCodeW(RTD_VIDEO_50);
    Delay_Xms(10);
    ucMode_Times=0;
    bStable         = 0; 
    Display_Video_Set(); 
    Set_Panel(1); 
}
void Check_TV_Mode(void)
{
  RTDRead(VDIS_CTRL_20, 1, N_INC);
  if (0 == (Data[0] & 0x08))
   {
        // Change to Frame-sync display
    RTDSetBit(VDIS_CTRL_20, 0xf6, 0x08);
    RTDSetBit(VDIS_CTRL_20, 0xf6, 0x09);
   }
   bStable = 1;
   LED_GREEN = 0X00;
   LED_RED = 0X01;     
}
#endif

void Detect_Video_Mode(void)
{
#if (VIDEO_CHIP == TW_9905 ) 
    Data[0]=I2CRead_TW990X(0x01);
    if ((Data[0] & 0x80)==0)
    {   
        Delay_Xms(10);
        Data[0]=I2CRead_TW990X(0x1c);
        Data[0]=Data[0]>>4; 
        switch(Data[0] & 0x07)
        {
        case 0x01://PAL
        case 0x02:
        case 0x05:              
            if (MODE_VIDEO50HZ == ucMode_Found)
            {
                ucMode_Times ++;
            }
            else
            {
                ucMode_Found    = MODE_VIDEO50HZ;
                ucMode_Times    = 0;
            }
            ucAV_Mode       = 0x02;
            break;
        case 0x00:
        case 0x03:
        case 0x04:  
        case 0x06:                   
            if (MODE_VIDEO60HZ == ucMode_Found)
            {
                ucMode_Times ++;
            }
            else
            {
                ucMode_Found    = MODE_VIDEO60HZ;
                ucMode_Times    = 0;      
                
            }
            ucAV_Mode       = 0x01;
            break;
        }  //switch
    }//if        
    else
    {   
        // Non Horizontal Lock
        ucAV_Mode   = 0;
        if (ucMode_Found != MODE_NOSUPPORT)
        {
            ucMode_Found    = MODE_NOSUPPORT;
            ucMode_Times    = 0;
        }
    }
    //-------------Check result--------------
    if (MODE_NOSUPPORT != ucMode_Found)
    {   
        if (VIDEO_SEARCH_TIMES < ucMode_Times)
        {
            bLIGHT_PWR  = LIGHT_OFF;        // Turn off BackLight for reset display
            RTDSetByte(HOSTCTRL_02, 0x40);  // Wake RTD up
            ucMode_Curr = ucMode_Found;
            ucMode_Times    = 0;
            bStable         = 0;            // bStable must be cleared when mode changed
            Display_Video_Set();            
        }
    }
    else
    {      
        
        ucMode_Times ++;
        
        if (NO_MODE_TIMES < ucMode_Times && (stGUD1.INPUT_SOURCE & 0x07) != SOURCE_SV)
        {            
            bStable         = 1;    // Set bStable to 1 when signal timing is stable.
            ucMode_Times    = NO_MODE_TIMES - 1;
        }
        else if ((NO_MODE_TIMES + 8) < ucMode_Times && (stGUD1.INPUT_SOURCE & 0x07) == SOURCE_SV)
        {
            bStable         = 1;    // Set bStable to 1 when signal timing is stable.
            ucMode_Times    = NO_MODE_TIMES - 1;
        }
	LED_GREEN = 0X00;
	LED_RED = 0X00;
    }  
#if(VIDEO_CHIP != VDC_NONE)
//    Display_Video_Set();
#endif
#endif
#if (VIDEO_CHIP == VDC_SAA7114 || VIDEO_CHIP == VDC_SAA7115 )
    I2CRead(ADDR_VIDEO, 0x1f, 0x01);
    
    //------ Check Horizontal Lock & Frequency ------
    if (0 == (Data[0] & 0x40))
    {   
        if ((Data[0] & 0x20) && (0x01 != (ucAV_Mode & 0x0f)))
        {
            // Field rate changed to 60Hz
            ucAV_Mode       = 0x01;
            ucMode_Found    = MODE_NOSUPPORT;
            ucMode_Times    = 0;
            
            Data[0] = 4;
            Data[1] = ADDR_VIDEO;
            Data[2] = 0x0e;
            Data[3] = 0x08;     // Start color search from NTSC-M
            I2CWrite(Data);
        }
        else if ((0 == (Data[0] & 0x20)) && (0x02 != (ucAV_Mode & 0x02)))
        {
            // Field rate changed to 50Hz
            ucAV_Mode       = 0x02; 
            ucMode_Found    = MODE_NOSUPPORT;
            ucMode_Times    = 0;
            
            Data[0] = 4;
            Data[1] = ADDR_VIDEO;
            Data[2] = 0x0e;
            Data[3] = 0x08;     // Start color search from PAL-BDGHI
            I2CWrite(Data);
        }
        else
        {    
            //------ Check Lock Color ------
            if (0x01 == (Data[0] & 0x01))
            {   
                // Lock Color
                if (ucAV_Mode & 0x01)
                {
                    if (MODE_VIDEO60HZ == ucMode_Found)
                    {
                        ucMode_Times ++;
                    }
                    else
                    {
                        ucMode_Found    = MODE_VIDEO60HZ;
                        ucMode_Times    = 0;
                    }
                }
                else
                {
                    if (MODE_VIDEO50HZ == ucMode_Found)
                    {
                        ucMode_Times ++;
                    }
                    else
                    {
                        ucMode_Found    = MODE_VIDEO50HZ;
                        ucMode_Times    = 0;
                    }
                }
            }
            else
            {
                // Non Lock Color
                if (MODE_NOSUPPORT != ucMode_Found)
                {
                    ucMode_Found    = MODE_NOSUPPORT;
                    ucMode_Times    = 0;
                }
                
                Data[0] = 4;
                Data[1] = ADDR_VIDEO;
                Data[2] = 0x0e;
                
                if (0x03 == (ucAV_Mode & 0x03))
                {
                    // SECAM -> PAL-BDGHI(50Hz)
                    Data[3] = 0x08;
                    I2CWrite(Data);                    
                    ucAV_Mode   = 0x02;
                }
                else
                {
                    if (ucMode_Times & 0x01)    // Every 2-times , change color
                    {
                        switch (ucAV_Mode & 0x70)
                        {
                        case 0x00:  
                            Data[3] = 0x18; // NTSC-4.43(50Hz)  // PAL-4.43(60Hz)
                            I2CWrite(Data);
                            ucAV_Mode   = (ucAV_Mode & 0x0f) | 0x10;
                            break;
                        case 0x10:
                            Data[3] = 0x28; // PAL-N(50Hz)      // NTSC-4.43(60Hz)
                            I2CWrite(Data);
                            ucAV_Mode   = (ucAV_Mode & 0x0f) | 0x20;
                            break;
                        case 0x20:
                            Data[3] = 0x38; // NTSC-N(50Hz)     // PAL-M(60Hz)
                            I2CWrite(Data);
                            ucAV_Mode   = (ucAV_Mode & 0x0f) | 0x30;
                            break;
                        case 0x30:
                            if (ucAV_Mode & 0x02)
                            {
                                // NTSC-N -> SECAM (50Hz)
                                Data[3]     = 0x5c;
                                I2CWrite(Data);
                                ucAV_Mode   = 0x03;
                            }
                            else
                            {   
                                // PAL-M -> NTSC_M (60Hz)
                                Data[3]     = 0x08;
                                I2CWrite(Data);
                                ucAV_Mode   = ucAV_Mode & 0x0f | 0x00;
                            }    
                        default:
                            break;
                        }//end of "switch (ucAV_Mode & 0x70)"
                    }//end of "if (ucMode_Times & 0x01)"    
                }//end of "if (0x03 == (ucAV_Mode & 0x03)) else"
            }//end of "Non Lock color
        }//end of "Check Lock Color"
    }//end of "if (0==(Data[0] & 0x40))"
    else
    {   
        // Non Horizontal Lock
        ucAV_Mode   = 0;
        
        if (ucMode_Found != MODE_NOSUPPORT)
        {
            ucMode_Found    = MODE_NOSUPPORT;
            ucMode_Times    = 0;
        }
    }
    
    //-------------Check result--------------
    if (MODE_NOSUPPORT != ucMode_Found)
    {   
        if (VIDEO_SEARCH_TIMES < ucMode_Times)
        {
            
            bLIGHT_PWR  = LIGHT_OFF;        // Turn off BackLight for reset display
            
            RTDSetByte(HOSTCTRL_02, 0x40);  // Wake RTD up
            RTDCodeW(OSD_Reset);            // Clear OSD
            
            if (SOURCE_YUV == (stGUD1.INPUT_SOURCE & 0x07))
                ucMode_Curr = (ucAV_Mode & 0x02) ? MODE_YUV50HZ : MODE_YUV60HZ;
            else
                ucMode_Curr = ucMode_Found;
            
            ucMode_Times    = 0;
            bStable         = 0;            // bStable must be cleared when mode changed
            
            Display_Video_Set();            
        }
    }
    else
    {
        ucMode_Times ++;
        
        if (ucAV_Mode)
        {
            // Force to display although we cannot lock color
            if (VIDEO_SEARCH_TIMES < ucMode_Times 
                && (NO_COLOR_TIMES < ucMode_Times || SOURCE_YUV == (stGUD1.INPUT_SOURCE & 0x07)))
            {
                
                bLIGHT_PWR  = LIGHT_OFF;        // Turn off BackLight for reset display
                RTDSetByte(HOSTCTRL_02, 0x40);  // Wake RTD up
                RTDCodeW(OSD_Reset);            // Clear OSD
                
                ucAV_Mode       = (ucAV_Mode & 0x02) ? 0x82 : 0x81;
                
                if (SOURCE_YUV != (stGUD1.INPUT_SOURCE & 0x07))
                    ucMode_Curr = (ucAV_Mode & 0x02) ? MODE_VIDEO50HZ : MODE_VIDEO60HZ;
                else
                    ucMode_Curr = (ucAV_Mode & 0x02) ? MODE_YUV50HZ : MODE_YUV60HZ;
                
                ucMode_Times    = 0;
                bStable         = 0;    // bStable must be cleared when mode changed
                
                Display_Video_Set();
            }
        }
        else

⌨️ 快捷键说明

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