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

📄 lcd_main.c

📁 keil c51平台,此代码可用于学习TFT LCD TV 搜台等,(本人自己修改)
💻 C
📖 第 1 页 / 共 5 页
字号:
            }
            else
            {

                bLIGHT_PWR  = LIGHT_OFF;        // Turn off BackLight for reset display

                RTDSetByte(HOSTCTRL_02, 0x40);  // Wake RTD up
                RTDCodeW(OSD_Reset);            // Clear OSD

                ucMode_Curr     = ucMode_Found; // Search mode OK
                ucMode_Times    = 0;            // Reset mode timer
                bStable         = 0;            // bStable must be cleared when mode changed

                Display_DVI_Set();              // Set VGA Mode registers
#if (RTDDEBUG)
                if (ucMode_PrevAct == ucMode_Curr)
                {
                    if (0xff > ucMode_QuitCnt)      ucMode_QuitCnt += 1;
                }
                else
                {
                    ucMode_PrevAct  = ucMode_Curr;
                    ucMode_QuitCnt  = 0;
                    ucDebug         = 0;
                }
#endif                
            }
        }
    }
#else
     Display_DVI_Set();
#endif
}

unsigned char Seek_DVI_Mode(unsigned char mode)
{
#if(TMDS_ENABLE)
    unsigned char   Wait_Time_Cnt;

    RTDSetByte(SYNC_POR_4C, 0x03);  // Measure data enable width and height

    Wait_Time_Cnt  = 60;       
    do
    {   
        Delay_Xms(1);
        RTDRead(SYNC_POR_4C, 0x07, Y_INC);
    }
    while ((Data[0] & 0x02) && (--Wait_Time_Cnt));

    Data[7] = Data[5];
    Data[6] = Data[6] & 0x0f;
    Data[5] = Data[3];
    Data[4] = Data[4] & 0x87;
    Data[3] = Data[1];
    Data[2] = Data[2] & 0x8f;

    // Measure Failed !!!
    if ((0 == ((unsigned int *)Data)[1]) || (0x07ff <= ((unsigned int *)Data)[1]) ||
        (0 == ((unsigned int *)Data)[2]) || (0x07ff <= ((unsigned int *)Data)[2]) ||
        (0 == Wait_Time_Cnt))
    {
        RTDSetByte(SYNC_POR_4C, 0x00);

        return MODE_NOSUPPORT;
    }

    // Save IH_TOTAL in usADC_Clock
    usADC_Clock     = ((unsigned int *)Data)[1] * 2;

    // Save input data enable width and height
    usIPV_ACT_LEN   = ((unsigned int *)Data)[2];
    usIPH_ACT_WID   = ((unsigned int *)Data)[3] * 2;

    // We don't support input image less than 350 active lines
    if (350 > usIPV_ACT_LEN)    return MODE_NOSUPPORT;

    // We only support 8N active width
    usIPH_ACT_WID   = (2 < (usIPH_ACT_WID & 0x0007)) ? ((usIPH_ACT_WID + 8) & 0xfff8) : (usIPH_ACT_WID & 0xfff8);

    // We only support active width not larger than 1280
    if (1280 < usIPH_ACT_WID)   usIPH_ACT_WID   = 1280;

    // Calculate maximum usIPV_ACT_LEN limitation
    ((unsigned int *)Data)[0]   = (unsigned long)(usVsync - 1) * DISP_LEN / MIN_DV_TOTAL;

    if (((unsigned int *)Data)[0] < usIPV_ACT_LEN)      usIPV_ACT_LEN   = ((unsigned int *)Data)[0];

    if (MODE_NOSUPPORT == mode)
    {
        mode    = MODE_UNDEFINED0;
    }
    else if (CAP_WIN[mode][2] != usIPH_ACT_WID || CAP_WIN[mode][4] != usIPV_ACT_LEN)
    {
        switch (usIPV_ACT_LEN)
        {
        case 350 :
            if (MODE_0640x0350x70HZ <= mode && MODE_0720x0400x70HZ >= mode)
            {
                mode    = (716 > usIPH_ACT_WID) ? MODE_0640x0350x70HZ : MODE_0720x0350x70HZ;
            }
            else if (MODE_0640x0350x85HZ <= mode && MODE_0720x0400x85HZ >= mode)
            {
                mode    = MODE_0640x0350x85HZ;
            }
            else if (MODE_0640x0480x50HZ == mode)
            {
                mode    = MODE_VGA350x50Hz;
            }
            else if (MODE_0640x0480x60HZ == mode)
            {
                mode    = MODE_VGA350x60Hz;
            }
            else
            {
                mode    = MODE_UNDEFINED0;
            }
            break;
        case 400 :
            if (MODE_0640x0350x70HZ <= mode && MODE_0720x0400x70HZ >= mode)
            {
                mode    = (716 > usIPH_ACT_WID) ? MODE_0640x0400x70HZ : MODE_0720x0400x70HZ;
            }
            else if (MODE_0640x0350x85HZ <= mode && MODE_0720x0400x85HZ >= mode)
            {
                mode    = (716 > usIPH_ACT_WID) ? MODE_0640x0400x85HZ : MODE_0720x0400x85HZ;
            }
            else if (MODE_0640x0480x50HZ == mode)
            {
                mode    = MODE_VGA400x50Hz;
            }
            else if (MODE_0640x0480x60HZ == mode)
            {
                mode    = MODE_VGA400x60Hz;
            }
            else if (MODE_USER720x400 != mode)
            {
                mode    = MODE_UNDEFINED0;
            }
            break;
        case 480 :
            if ((MODE_USER640x480 != mode) && ((MODE_0640x0480x50HZ > mode) || (MODE_0640x0480x85HZ < mode)))
                mode    = MODE_UNDEFINED0;
            break;
        case 600 :
            if ((MODE_USER800x600 != mode) && ((MODE_0800x0600x56HZ > mode) || (MODE_0800x0600x85HZ < mode)))
                mode    = MODE_UNDEFINED0;
            break;
        case 624 :
            if (MODE_0832x0624x75HZ != mode)    
                mode    = MODE_UNDEFINED0;
            break;
        case 768 :
            if ((MODE_USER1024x768 != mode) && ((MODE_1024x0768x60HZ > mode) || (MODE_1024x0768x85HZ < mode)))
                mode    = MODE_UNDEFINED0;
            break;
        case 800 :
            if (MODE_1024x0800x84HZ != mode)
                mode    = MODE_UNDEFINED0;
            break;
        case 864 :
            if ((MODE_USER1152x864 != mode) && (MODE_1152x0864x75HZ != mode))   
                mode    = MODE_UNDEFINED0;
            break;
        case 870 :
            if (MODE_1152x0870x75HZ != mode)
                mode    = MODE_UNDEFINED0;
            break;
        case 900 :
            if ((MODE_USER1152x900 != mode) && ((MODE_1152x0900x66HZ > mode) || (MODE_1152x0900x76HZ < mode)))
                mode    = MODE_UNDEFINED0;
            break;
        case 960 :
            if ((MODE_USER1280x960 != mode) && ((MODE_1280x0960x60HZ > mode) || (MODE_1280x0960x85HZ < mode)))
                mode    = MODE_UNDEFINED0;
            break;
        case 1024 :
            if ((MODE_USER1280x1024 != mode) && ((MODE_1280x1024x60HZ > mode) || (MODE_1280x1024x85HZ < mode)))
                mode    = MODE_UNDEFINED0;
            break;
        case 1600 :
            if ((MODE_USER1600x1200 != mode) && (MODE_1600x1200x60HZ != mode))
                mode    = MODE_UNDEFINED0;
            break;
        default :
            mode    = MODE_UNDEFINED0;
            break;
        }
    }

    if (MODE_UNDEFINED0 == mode)
    {
        // First, we try user-mode to fit the undefined mode for full-screen display.
        Wait_Time_Cnt   = MODE_USER720x400;
        do
        {
            if (Mode_Preset[Wait_Time_Cnt][2] < CAP_WIN[Wait_Time_Cnt][4])   // V scale-down
            {
                // Larger scale-down ratio may need a larger DH_TOTAL. 
                // So usIPV_ACT_LEN should not be too larger than pre-set capture window length
                if (Mode_Preset[Wait_Time_Cnt][2] > usIPV_ACT_LEN || (CAP_WIN[Wait_Time_Cnt][4] + 24) < usIPV_ACT_LEN)   continue;
            }
            else
            {
                if (Mode_Preset[Wait_Time_Cnt][2] < usIPV_ACT_LEN)   continue;
            }

            ((unsigned int *)Data)[0]   = (unsigned long)2458 * Mode_Preset[Wait_Time_Cnt][0] * Mode_Preset[Wait_Time_Cnt][2]
                                        / ((unsigned long)100 * usIPV_ACT_LEN * usHsync);
            
            // Return if we find out a suitable user-mode.
            if (MAX_DCLK > ((unsigned int *)Data)[0])   return Wait_Time_Cnt;
        }
        while (MODE_USER1600x1200 >= ++Wait_Time_Cnt);

        // If failed, we try partial-screen display.

        if (DISP_LEN < usIPV_ACT_LEN)   // Scale-down
        {
            ((unsigned int *)Data)[0]   = (unsigned long)2458 * Mode_Preset[MODE_UNDEFINED1][0] * DISP_LEN 
                                        / ((unsigned long)100 * usIPV_ACT_LEN * usHsync);

            if (MAX_DCLK < ((unsigned int *)Data)[0])
            {
                ((unsigned int *)Data)[1]   = (unsigned long)2458 * Mode_Preset[MODE_UNDEFINED1][0] * MIN_DV_TOTAL
                                            / ((unsigned long)100 * (usVsync - 1) * usHsync);

                if (MAX_DCLK < ((unsigned int *)Data)[1])
                {
                    // Decrease usIPV_ACT_LEN to DISP_LEN and go further to check if it can be displayed.
                    usIPV_ACT_LEN   = DISP_LEN;
                }
                else
                {                 
                    mode    = MODE_UNDEFINED1 | 0x80;   // Scale-down and partial-V display
                }
            }
            else
                mode    = MODE_UNDEFINED1;              // Scale-down and full-V display
        }

        if (DISP_LEN >= usIPV_ACT_LEN)  // Scale-up
        {
            ((unsigned int *)Data)[0]   = (unsigned long)2458 * Mode_Preset[MODE_UNDEFINED0][0] * DISP_LEN 
                                        / ((unsigned long)100 * usIPV_ACT_LEN * usHsync);

            if (MAX_DCLK < ((unsigned int *)Data)[0])
            {
                if (MIN_DV_TOTAL >= (usVsync - 1))
                {
                    ((unsigned int *)Data)[1]   = (unsigned long)2458 * Mode_Preset[MODE_UNDEFINED0][0] * MIN_DV_TOTAL 
                                                / ((unsigned long)100 * (usVsync - 1) * usHsync);
                }
                else
                {
                    ((unsigned int *)Data)[1]   = (unsigned long)2458 * Mode_Preset[MODE_UNDEFINED0][0]
                                                / ((unsigned long)100 * usHsync);
                }

                if (MAX_DCLK < ((unsigned int *)Data)[1])
                    mode    = MODE_NOSUPPORT;           // Cannot display
                else
                    mode    = MODE_UNDEFINED0 | 0x80;   // Scale-up and partial-screen display
            }
            else
                mode    = MODE_UNDEFINED0;          // Scale-up and full-screen display
        }
    }

    return  mode;
#else
    mode    = MODE_UNDEFINED0;
    return  0;
#endif
}

//-------------------  Check DVI Mode  -------------------//
void Check_DVI_Mode(void)
{    
#if(TMDS_ENABLE)
    RTDRead(SYNC_POR_4C, 0x05, Y_INC);

    if (Data[0] & 0x02)
    {
        RTDSetByte(SYNC_POR_4C, 0x00);      // Reset Sync Processor

        ucMode_Found    = MODE_NOSUPPORT;
    }
    else			
    {
        bVpole_Curr = (bit)(Data[0] & 0x08);    // Current usVsync polarity
        bHpole_Curr = (bit)(Data[0] & 0x04);    // Current usHsync polarity

        Data[5] = Data[3];
        Data[4] = Data[4] & 0x87;
        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] &= 0xf3;  // VS & HS positive

            if (!bVpole_Curr)    Data[0] |= 0x08;
            if (!bHpole_Curr)    Data[0] |= 0x04;
            
            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.
#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)
{
    if(bChanel_Show)
        bBlueScreen = 0;	//V229

    if ((Detect_Video_Signal()==MODE_VIDEO50HZ || Detect_Video_Signal()==MODE_VIDEO60HZ) && !bBlueScreen)	//V229
    {   
	if (Detect_Video_Signal()==MODE_VIDEO50HZ )	//V210
        {
        	ucAV_Mode = 0x02;     		//PAL 50HZ
        	ucMode_Curr = MODE_VIDEO50HZ;
        	Delay_Xms(20);
        	RTDCodeW(RTD_VIDEO_50);
        	Delay_Xms(10);
        	ucMode_Times=0;
        	Display_Video_Set(); 
        }
        else
        {
        	ucAV_Mode = 0x01;     		//NTSC 60HZ
        	ucMode_Curr = MODE_VIDEO60HZ;
        	Delay_Xms

⌨️ 快捷键说明

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