Lcd_msg.~c
上传用户:xmyjxjd
上传日期:2013-05-04
资源大小:1517k
文件大小:19k
开发平台:

C/C++

  1. #define __MESSAGE__
  2. #include "reg52.h"
  3. #include "HeaderMAIN_DEF.H"
  4. #include "HeaderCONFIG.H"
  5. #include "HeaderACCESS.H"
  6. #include "HeaderLCD_FUNC.H"
  7. #include "HeaderLCD_MSG.H"
  8. #include "HeaderLCD_MAIN.H"
  9. #include "HeaderLCD_OSD.H"
  10. #include "HeaderMTV512.H"
  11. #include "HeaderOSD.H"
  12. #include "HeaderFONT.H"
  13. #include "HeaderSRC_CTRL.H"
  14. #include "HeaderFRAME_SYNC.H"
  15. unsigned char GetKeyState(void)
  16. {
  17. #if(MCU_TYPE == MCU_WINBOND)
  18.     unsigned char   ucKeyState;
  19. #if (BOARD_TYPE == QA_PCB || BOARD_TYPE == DEMO_LVDS_A || KINGMICE)
  20.     ucKeyState  = bPOWER_KEY ? P3 | (IR_KEY_MASK | POWER_KEY_MASK) : (P3 | IR_KEY_MASK) & (0xff ^ POWER_KEY_MASK);
  21. #elif(BOARD_TYPE == DEMO1_PCB)
  22.     ucKeyState  = bPOWER_KEY ? P1 | (IR_KEY_MASK | POWER_KEY_MASK) : (P1 | IR_KEY_MASK) & (0xff ^ POWER_KEY_MASK);
  23. #else
  24.     ucKeyState  = (P3 & 0x78) | (P2 & 0x02) | IR_KEY_MASK;
  25. #endif
  26. #if (IRPOLLING)
  27.     {
  28.     //    unsigned char   ucIR_Curr;
  29.         
  30.         // You cannot respond to ucIR_Cmd[0] when IR command decoding (1 < ucIR_State).
  31.         // Because ucIR_Cmd[0] is not a constant during command decoding.
  32.         Data[0]   = (1 < ucIR_State) ? 0 : ucIR_Cmd[0];
  33.         if (Data[0])
  34.         {
  35.             switch (Data[0])
  36.             {
  37. #if (POWER_KEY_TYPE == TYPE_ONE_TOUCH)
  38.             // Only when power-key is one-touch style, you can use IR remote controller to switch power on/off
  39.             case IR_POWER_KEY :     ucKeyState  &= (0xff ^ POWER_KEY_MASK);     break;
  40. #endif
  41.             // Use IR to implement standard key
  42.             case IR_LEFT_KEY :      ucKeyState  &= (0xff ^ LEFT_KEY_MASK);      break;
  43.             case IR_RIGHT_KEY :     ucKeyState  &= (0xff ^ RIGHT_KEY_MASK);     break;
  44.             case IR_ENTER_KEY :     ucKeyState  &= (0xff ^ ENTER_KEY_MASK);     break;
  45.             // Other IR function key
  46.             default :        
  47.                 ucKeyState  &= (0xff ^ IR_KEY_MASK);
  48. #if (TV_CHIP != TV_NONE)
  49.                 switch (Data[0])
  50.                 {
  51.                 case IR_FUNC_SOURCE :   Data[0] = NOTIFY_IR_SOURCE;     break;
  52.                 case IR_FUNC_DISP :     Data[0] = NOTIFY_IR_DISP;       break;
  53.                 case IR_FUNC_JUMP :     Data[0] = NOTIFY_IR_JUMP;       break;
  54.                 case IR_FUNC_CHDEC :    Data[0] = NOTIFY_IR_CHDEC;      break;
  55.                 case IR_FUNC_CHINC :    Data[0] = NOTIFY_IR_CHINC;      break;
  56.                 case IR_FUNC_VOLINC :   Data[0] = NOTIFY_IR_VOLINC;     break;
  57.                 case IR_FUNC_VOLDEC :   Data[0] = NOTIFY_IR_VOLDEC;     break;
  58.                 case IR_FUNC_MENU :     Data[0] = NOTIFY_IR_MENU;       break;
  59.                 case IR_FUNC_ENTER :    Data[0] = NOTIFY_IR_ENTER;      break;
  60.                 case IR_FUNC_MUTE :     Data[0] = NOTIFY_IR_MUTE;       break;
  61.                 case IR_FUNC_NUM0 :     Data[0] = NOTIFY_IR_NUM0;       break;
  62.                 case IR_FUNC_NUM1 :     Data[0] = NOTIFY_IR_NUM1;       break;
  63.                 case IR_FUNC_NUM2 :     Data[0] = NOTIFY_IR_NUM2;       break;
  64.                 case IR_FUNC_NUM3 :     Data[0] = NOTIFY_IR_NUM3;       break;
  65.                 case IR_FUNC_NUM4 :     Data[0] = NOTIFY_IR_NUM4;       break;
  66.                 case IR_FUNC_NUM5 :     Data[0] = NOTIFY_IR_NUM5;       break;
  67.                 case IR_FUNC_NUM6 :     Data[0] = NOTIFY_IR_NUM6;       break;
  68.                 case IR_FUNC_NUM7 :     Data[0] = NOTIFY_IR_NUM7;       break;
  69.                 case IR_FUNC_NUM8 :     Data[0] = NOTIFY_IR_NUM8;       break;
  70.                 case IR_FUNC_NUM9 :     Data[0] = NOTIFY_IR_NUM9;       break;
  71.                 default :               ucKeyState  |= IR_KEY_MASK;     break;
  72.                 }
  73. #endif
  74.                 break;
  75.             }
  76.         }
  77.     }
  78. #endif
  79.     
  80.     return ((ucKeyState & ALL_KEY_MASK) | KEY_DISABLED) ^ ALL_KEY_MASK;
  81. #else
  82. unsigned char ucKeyState=0;
  83.         if(!bRIGHT_KEY)
  84.           ucKeyState=ucKeyState|RIGHT_KEY_MASK;
  85.         if(!bLEFT_KEY)
  86.           ucKeyState=ucKeyState|LEFT_KEY_MASK;
  87.         if(!bENTER_KEY)
  88.           ucKeyState=ucKeyState|ENTER_KEY_MASK;
  89.         if(!bMENU_KEY)
  90.           ucKeyState=ucKeyState|MENU_KEY_MASK;
  91.         if(!bPOWER_KEY)
  92.           ucKeyState=ucKeyState|POWER_KEY_MASK;
  93.         return ucKeyState;
  94. #endif
  95. }
  96. // Key_Trans() is used for generating key related messages, including OSD timout message.
  97. // You can just issue the message or execute system default function, like changing input source.
  98. // BE CAREFUL !! YOU CANNOT CHANGE ANY OSD STATUS REGISTERS OR CALL ANY OSD PROCESS HERE !!
  99. // You should not expect OSD_Proc() can always receive your message.
  100. // Because main program will shield OSD process from been triggered when input signal isn't stable,
  101. // and terminate OSD process when input source is changed.
  102. unsigned char Key_Trans()
  103. {
  104.     static unsigned char    idata   ucP3_Prev       = 0;
  105.     static unsigned char    idata   ucP3_Curr       = 0;
  106.     static unsigned char    idata   ucKey_Repeat    = 0;
  107.     unsigned char   ucNotify    = NOTIFY_NONE;
  108.     // Save the previous key status
  109.     ucP3_Prev   = ucP3_Curr;
  110.     // Sample the current key status
  111.     ucP3_Curr   = GetKeyState();
  112. #if (POWER_KEY_TYPE == TYPE_TWO_STATE)
  113.     // We MUST handle power-key first.
  114.     if (bPower_Status)
  115.     {
  116.         if (ucP3_Curr & POWER_KEY_MASK)
  117.             ucP3_Curr   ^= POWER_KEY_MASK;  // Go further to handle other keys (and mask power-key)
  118.         else
  119.         {
  120.             Delay_Xms(20);
  121.             ucP3_Prev   = ucP3_Curr;
  122.             ucP3_Curr   = GetKeyState();
  123.             if (ucP3_Curr & POWER_KEY_MASK)
  124.                 ucP3_Curr   ^= POWER_KEY_MASK;  // Go further to handle other keys (and mask power-key)
  125.             else
  126.                 return  NOTIFY_POWERDOWN;
  127.         }
  128.     }
  129.     else
  130.     {
  131.         if (ucP3_Curr & POWER_KEY_MASK)
  132.         {
  133.             ucKey_Issued    = 0;
  134.             Delay_Xms(20);
  135.             ucP3_Prev   = ucP3_Curr;
  136.             ucP3_Curr   = GetKeyState();
  137.             if (ucP3_Curr & POWER_KEY_MASK)
  138.                 return NOTIFY_POWERUP;
  139.             else
  140.                 return NOTIFY_NONE;
  141.         }
  142.         else
  143.             return NOTIFY_NONE;
  144.     }
  145. #else   // POWER_KEY_TYPE is TYPE_ONE_TOUCH
  146.     if (bPower_Status)
  147.     {
  148.         if (POWER_KEY_MASK & ucP3_Curr)
  149.         {
  150.             if ((ucP3_Prev ^ ucP3_Curr) & POWER_KEY_MASK)
  151.             {
  152.                 Delay_Xms(20);
  153.                 ucP3_Curr   = GetKeyState();
  154.                 if ((ucP3_Prev ^ ucP3_Curr) & POWER_KEY_MASK)   
  155.                     return NOTIFY_POWERDOWN;
  156.                 else
  157.                     return NOTIFY_NONE;
  158.             }
  159.         }
  160.     }
  161.     else
  162.     {
  163.         if (POWER_KEY_MASK & ucP3_Curr)
  164.         {
  165.             if ((ucP3_Prev ^ ucP3_Curr) & POWER_KEY_MASK)
  166.             {
  167.                 ucKey_Issued    = 0;
  168.                 Delay_Xms(20);
  169.                 ucP3_Curr   = GetKeyState();
  170.                 if ((ucP3_Prev ^ ucP3_Curr) & POWER_KEY_MASK)
  171.                     return NOTIFY_POWERUP;
  172.                 else
  173.                     return NOTIFY_NONE;
  174.             }
  175.             else
  176.                 return NOTIFY_NONE;
  177.         }
  178.     }
  179. #endif
  180.     // Generate Key Messages
  181.     switch (ucP3_Curr)
  182.     {
  183.     case MENU_KEY_MASK :
  184.         if ((ucP3_Prev ^ ucP3_Curr) & MENU_KEY_MASK)
  185.         {
  186.             ucKey_Issued    = 0;
  187.             ucNotify        = NOTIFY_MENU_KEY;
  188.         }
  189.         break;
  190.     
  191.     case ENTER_KEY_MASK :
  192.         if ((ucP3_Prev ^ ucP3_Curr) & ENTER_KEY_MASK)
  193.         {
  194.             ucKey_Issued    = 0;
  195.             //usOSD_Timer     = (unsigned int)stGUD1.OSD_TIMEOUT << 9;    // Reset OSD timeout timer
  196.             usOSD_Timer         = (unsigned int)stGUD1.OSD_TIMEOUT * 51; 
  197.             ucNotify        = NOTIFY_ENTER_KEY;                         // Post enter-key pressed message
  198.             ucKey_Repeat    = KEY_REPEAT_COUNT * 8;
  199.         }
  200.         else
  201.         {
  202.             if (ucKey_Repeat)
  203.                 ucKey_Repeat    -= 1;
  204.             else
  205.             {
  206.                 if (ucOSD_Page_Index)
  207.                 {
  208.                     usOSD_Timer = 0;
  209.                     ucNotify    = NOTIFY_CLEAR_OSD;
  210.                 }
  211.             }
  212.         }
  213.         break;
  214.     
  215.     case RIGHT_KEY_MASK :
  216.         //usOSD_Timer     = (unsigned int)stGUD1.OSD_TIMEOUT << 9;        // Reset OSD timeout timer
  217.         usOSD_Timer         = (unsigned int)stGUD1.OSD_TIMEOUT * 51; 
  218.         if ((ucP3_Prev ^ ucP3_Curr) & RIGHT_KEY_MASK)
  219.         {
  220.             ucKey_Issued    = 0;
  221.             ucNotify        = NOTIFY_RIGHT_KEY;                         // Post right-key pressed message
  222.             ucKey_Repeat    = KEY_REPEAT_COUNT;
  223.         }
  224.         else
  225.         {
  226.             if (ucKey_Repeat)
  227.                 ucKey_Repeat    -= 1;
  228.             else
  229.             {
  230.                 if (KEY_TURBO_ENABLE > ucKey_Issued)
  231.                 {
  232.                     ucKey_Issued    += 1;
  233.                     ucKey_Repeat    = KEY_REPEAT_PERIOD;
  234.                 }
  235.                 else
  236.                     ucKey_Repeat    = 0;
  237.                 ucNotify        = NOTIFY_RIGHT_KEY;                     // Post right-key repeat message
  238.             }
  239.         }
  240.         break;
  241.     
  242.     case LEFT_KEY_MASK :
  243.         //usOSD_Timer     = (unsigned int)stGUD1.OSD_TIMEOUT << 9;        // Reset OSD timeout timer
  244.         usOSD_Timer         = (unsigned int)stGUD1.OSD_TIMEOUT * 51; 
  245.         if ((ucP3_Prev ^ ucP3_Curr) & LEFT_KEY_MASK)
  246.         {
  247.             ucKey_Issued    = 0;
  248.             ucNotify        = NOTIFY_LEFT_KEY;                          // Post left-key pressed message
  249.             ucKey_Repeat    = KEY_REPEAT_COUNT;
  250.         }
  251.         else
  252.         {
  253.             if (ucKey_Repeat)
  254.                 ucKey_Repeat    -= 1;
  255.             else
  256.             {
  257.                 if (KEY_TURBO_ENABLE > ucKey_Issued)
  258.                 {
  259.                     ucKey_Issued    += 1;
  260.                     ucKey_Repeat    = KEY_REPEAT_PERIOD;
  261.                 }
  262.                 else
  263.                     ucKey_Repeat    = 0;
  264.                 ucNotify        = NOTIFY_LEFT_KEY;                      // Post left-key repeat message
  265.             }
  266.         }
  267.         break;
  268.     case IR_KEY_MASK :
  269.         ucKey_Issued    = 0;
  270.         if ((ucP3_Prev ^ ucP3_Curr) & IR_KEY_MASK)
  271.         {
  272.             if (SOURCE_TV == (stGUD1.INPUT_SOURCE & 0x07))
  273.             {
  274.                 //usOSD_Timer     = (unsigned int)stGUD1.OSD_TIMEOUT << 9;    // Reset OSD timeout timer
  275.                 usOSD_Timer         = (unsigned int)stGUD1.OSD_TIMEOUT * 51; 
  276.             }
  277.             ucNotify        = Data[0];                                      // Post IR-key pressed message
  278.             ucKey_Repeat    = KEY_REPEAT_COUNT;
  279.         }
  280.         else if (NOTIFY_IR_VOLINC == Data[0] || NOTIFY_IR_VOLDEC == Data[0])
  281.         {
  282.             if (ucKey_Repeat)
  283.                 ucKey_Repeat    -= 1;
  284.             else
  285.             {
  286.                 ucNotify        = Data[0];
  287.                 ucKey_Repeat    = KEY_REPEAT_PERIOD;
  288.             }
  289.         }
  290.         break;
  291.     
  292.     default :
  293.         // No key or more than 1 key pressed. Post no message and reset key-repeat.
  294.         ucKey_Repeat    = KEY_REPEAT_COUNT;
  295.         ucKey_Issued    = 0;
  296. #if (HIDDEN_PAGE)        
  297.         // For triggering the hidden page
  298.         if (0 == ucOSD_Page_Index && (RIGHT_KEY_MASK | LEFT_KEY_MASK) == ucP3_Curr)     ucNotify    = NOTIFY_LR_KEY;
  299. #endif
  300.         break;
  301.     }
  302.     return ucNotify;
  303. }
  304. void OSD_Dispatcher(unsigned char message)
  305. {
  306.     if (bReload)
  307.     {
  308.         // When bStable and bReload are both 1s, it is the first iteration after input signal becomes stable.
  309.         // bReload will be cleared and user's font will be reloaded.
  310.         bReload = 0;
  311.         RTDSetByte(HOSTCTRL_02, 0x40);          // Wake RTD up
  312.      RTDSetBit(OVL_CTRL_6D, 0xfe, 0x00); // Disable overlay control
  313.         RTDOSDW(OSD_Reset);                    // Clear OSD
  314.       //  RTDSetBit(OVL_CTRL_6D, 0xff, 0x02);     // Turn back to the original osd display width
  315.        // Load_Font(JAPANESS == (stGUD1.FUNCTION & 0x07) ? Font_East_J : Font_East_C, 0x00, 0x12);
  316. //Load_Font(Font_Global, 0x00, 0x154);
  317. /*
  318. Load_VLC_Font(Font_Global, 0x00, 0xa1);
  319.        if( (stGUD1.FUNCTION & 0x07) == JAPANESS )
  320.        {
  321.        Load_VLC_Font(Font_East_J, 0x573, 0x4B);
  322.        }
  323.        else
  324.        {
  325.             Load_VLC_Font(Font_East_C, 0x5a9, 0x45);
  326.        }
  327.        Load_VLC_Font(Font_Icons, 0x828, 0x70);
  328. */
  329.         if (ucOSD_Page_Index)
  330.         {
  331.             message = NOTIFY_SHOW;
  332.         }
  333.         else
  334.         {
  335.             message = NOTIFY_NONE;
  336. RTDSetBit(OVL_CTRL_6D, 0x3f, 0x00); //Red
  337. RTDSetBit(BGCOLOR_CONTROL_6C, 0x00, 0x00);
  338. RTDSetBit(OVL_CTRL_6D, 0x3f, 0x40); //Green
  339. RTDSetBit(BGCOLOR_CONTROL_6C, 0x00, 0x00);
  340. RTDSetBit(OVL_CTRL_6D, 0x3f, 0x80); //Blue
  341. RTDSetBit(BGCOLOR_CONTROL_6C, 0x00, 0x00);
  342.            if (BEGIN_MODECHANGE < usTaskCnt)    Show_Note();
  343.         }
  344.         // We always read REG[1F] to see if frame-sync is OK.
  345.         // ucStatus is the OR result of REG[1F] when OSD is open, and clear to 0 when OSD is close.
  346.         //ucStatus    = 0;
  347.     }
  348.     if (0 == ucOSD_Page_Index)
  349.     {
  350.         if (BEGIN_MODECHANGE == usTaskCnt)
  351.         {
  352.             // Disable and clear input source note text
  353.             RTDSetByte(HOSTCTRL_02, 0x40);
  354. RTDSetBit(OVL_CTRL_6D, 0xfe, 0x00);     
  355.             RTDOSDW(OSD_Reset);
  356.         }
  357.         else if ((BEGIN_SHOWHINT == usTaskCnt))
  358.         {
  359.            Show_Hint();
  360.         }
  361. //else if (1 == usTaskCnt)
  362. //{
  363. //    RTDOSDW(OSD_Reset);            // Clear OSD
  364. //}
  365.     }
  366.     else if (NOTIFY_NONE == message)
  367.     {
  368.         if (0 == usOSD_Timer && 0 != stGUD1.OSD_TIMEOUT && SOURCE_TV != (stGUD1.INPUT_SOURCE & 0x07))
  369.         {
  370.             message = NOTIFY_CLEAR_OSD;
  371.         }
  372.     }
  373.     switch (message)
  374.     {
  375.     case NOTIFY_CLEAR_OSD :
  376.         if (ucOSD_Page_Index && SOURCE_TV != (stGUD1.INPUT_SOURCE & 0x07))
  377.         {
  378.             // OSD time-out
  379.             ucOSD_Page_Index    = 0;
  380.             ucOSD_Item_Index0   = 0;
  381.             ucOSD_Item_Index1   = 0;
  382.             ucOSD_Item_Index2   = 0;
  383.             RTDSetByte(HOSTCTRL_02, 0x40);  // Wake RTD up
  384.             // Although you can add ending animation here, I don't think it is necessary.
  385. RTDSetBit(OVL_CTRL_6D, 0xfe, 0x00);
  386.             RTDOSDW(OSD_Reset);            // Clear OSD
  387.         }
  388.         break;
  389.     case NOTIFY_MENU_KEY :
  390.     case NOTIFY_IR_SOURCE :
  391.         if (SOURCE_VGA == (stGUD1.INPUT_SOURCE & 0x07))
  392.         {
  393. #if (TMDS_ENABLE) 
  394.             Change_Source(SOURCE_DVI);
  395. #else
  396.             Change_Source(SOURCE_AV);
  397. #endif
  398.         }
  399.         else if (SOURCE_DVI == (stGUD1.INPUT_SOURCE & 0x07))
  400.             Change_Source(SOURCE_AV);
  401.         else if (SOURCE_AV == (stGUD1.INPUT_SOURCE & 0x07))
  402.             Change_Source(SOURCE_SV);
  403.         else if (SOURCE_SV == (stGUD1.INPUT_SOURCE & 0x07))
  404.         {
  405. #if (VIDEO_CHIP == VDC_SAA7118)
  406.             Change_Source(SOURCE_YUV);
  407. #else
  408.             Change_Source(SOURCE_TV);
  409. #endif
  410.         }
  411.         else if (SOURCE_YUV == (stGUD1.INPUT_SOURCE & 0x07))
  412.         {
  413.             Change_Source(SOURCE_TV);
  414.         }
  415.         else
  416.         {
  417.             Change_Source(SOURCE_VGA);
  418.         }
  419.         break;
  420.     default :
  421.         {
  422.             // Save the current OSD page index
  423.             unsigned char   ucPage_Curr     = ucOSD_Page_Index;
  424.             // Send messages to OSD process
  425.             //(*OSD_Proc[ucOSD_Page_Index][stGUD1.INPUT_SOURCE & 0x07])(message);
  426.             OSD_Proc(message);
  427.             // If OSD page is changed ...
  428.             if (ucPage_Curr != ucOSD_Page_Index)
  429.             {
  430.                 if (ucOSD_Page_Index)
  431.                 {
  432.                     if (0 == ucPage_Curr)
  433.                     {
  434.                         // ucOSD_Page_Index becomes non-zero value from zero. It is the first show of OSD.
  435.                         // Maybe RTD3001 is still in power-saving mode, or we are showing some text on screen,
  436.                         // like "No Signal". So we must wake up RTD3001 and clear screen before we display OSD.
  437.                         RTDSetByte(HOSTCTRL_02, 0x40);
  438.                         RTDSetBit(VDIS_CTRL_20, 0xff, 0x01);
  439. RTDSetBit(OVL_CTRL_6D, 0xfe, 0x00);     
  440.                         RTDOSDW(OSD_Reset);
  441.                     }
  442.                     //(*OSD_Proc[ucOSD_Page_Index][stGUD1.INPUT_SOURCE & 0x07])(NOTIFY_SHOW);
  443.                     OSD_Proc(NOTIFY_SHOW);
  444. if (0 == ucPage_Curr)
  445. {
  446. //RTDCodeW(OSD_Enable);
  447. //RTDSetBit(OVL_CTRL_6D, 0xfe, 0x01);
  448. OSD_Opening();
  449. }
  450.                 }
  451.                 else
  452.                 {
  453.                     // OSD should be cleared when ucOSD_Page_Index becomes 0. 
  454.                     // Clear other OSD status registers for safety
  455.                     ucOSD_Item_Index0   = 0;
  456.                     ucOSD_Item_Index1   = 0;
  457.                     ucOSD_Item_Index2   = 0;
  458.                     RTDSetByte(HOSTCTRL_02, 0x40);  // Wake RTD up
  459.                     OSD_Ending();
  460. //RTDSetBit(OVL_CTRL_6D, 0xfe, 0x00);     
  461.                     //RTDCodeW(OSD_Reset);            // Clear OSD
  462.                 }
  463.             }
  464.             else
  465.             {
  466.                 // OSD page is not changed
  467.                 if (ucOSD_Page_Index)
  468.                 {
  469. if (NOTIFY_SHOW == message)     
  470. {
  471. RTDCodeW(OSD_Enable);
  472. RTDSetBit(OVL_CTRL_6D, 0xfe, 0x01);
  473. }
  474.                     // Change H/V Position and ADC clock may cause overflow/underflow temporarily.
  475.                     if (NOTIFY_RIGHT_KEY == message || NOTIFY_LEFT_KEY == message)
  476.                     {
  477. RTDSetByte(STATUS0_01, 0x00);  // Clear status
  478.                         RTDSetByte(STATUS1_1F, 0x00);  // Clear status
  479.                     }
  480. #if (SHOW_CHECK)
  481.                     // Just for showing debug information
  482.                     OSD_Show_Check();
  483. if( ucOSD_Item_Index0 == 5 &&  ucOSD_Page_Index == 1 &&  ucOSD_Item_Index1)
  484. {
  485. ucOSD_Page_Index = 7;
  486. OSD_Show_Check();
  487. ucOSD_Page_Index = 1;
  488. }
  489. #endif
  490.                 }
  491.                 else
  492.                 {
  493.                     // We always read REG[1F] to see if frame-sync is OK.
  494.                     // ucStatus is the OR result of REG[1F] when OSD is open, and clear to 0 when OSD is close.
  495.                     ucStatus    = 0;
  496. #if (RTDDEBUG)
  497.                     usPE_Sum    = 0;
  498. #endif
  499.                 }
  500.             }
  501.         }
  502.         break;
  503.     }
  504. }