static BYTE GetAdcKeyIndex(VOID) { BYTE KeyIndex; KeyIndex = -1; #if (defined(FUNC_LED_ADC1_KEY_MULTIPLE_EN) || defined(FUNC_LED_ADC2_KEY_MULTIPLE_EN)) //段码LED屏与ADC复用示例 #if (defined(FUNC_7PIN_SEG_LED_EN) || defined(FUNC_6PIN_SEG_LED_EN)) gLedDispRefreshFlag = FALSE; LedPinGpioInit(); #endif //切回ADC 口 #ifdef FUNC_LED_ADC1_KEY_MULTIPLE_EN baGPIOCtrl[LED_ADC1_KEY_MULTIPLE_PORT_PU] &= ~LED_ADC1_KEY_MULTIPLE_BIT; baGPIOCtrl[LED_ADC1_KEY_MULTIPLE_PORT_PD] |= LED_ADC1_KEY_MULTIPLE_BIT; #endif #ifdef FUNC_LED_ADC2_KEY_MULTIPLE_EN baGPIOCtrl[LED_ADC2_KEY_MULTIPLE_PORT_PU] &= ~LED_ADC2_KEY_MULTIPLE_BIT; baGPIOCtrl[LED_ADC2_KEY_MULTIPLE_PORT_PD] |= LED_ADC2_KEY_MULTIPLE_BIT; #endif WaitUs(40); //复用时确保AD端口稳定 #endif #ifdef ADC_KEY_PORT_CH1 KeyIndex = AdcChannelKeyGet(ADC_KEY_PORT_CH1); #endif #ifdef ADC_KEY_PORT_CH2 if(KeyIndex == -1) { KeyIndex = AdcChannelKeyGet(ADC_KEY_PORT_CH2); if(KeyIndex != -1) { KeyIndex += ADC_KEY_COUNT; } } #endif #if (defined(FUNC_LED_ADC1_KEY_MULTIPLE_EN) || defined(FUNC_LED_ADC2_KEY_MULTIPLE_EN)) #if (defined(FUNC_7PIN_SEG_LED_EN) || defined(FUNC_6PIN_SEG_LED_EN)) gLedDispRefreshFlag = TRUE; #endif #endif #ifdef HEADPHONE_ADC_PORT_CH if(KeyIndex == -1) { KeyIndex = AdcChannelKeyGet(HEADPHONE_ADC_PORT_CH); if(KeyIndex != -1) { KeyIndex += 22; } } #endif return KeyIndex; }
// // Key process, image key value to key event. // KEY_EVENT AdcKeyEventGet(VOID) { static UINT DATA PreKeyIndex = 0; KEY_EVENT event = IN_KEY_NONE; UCHAR DATA CurKeyIndex; // DBG(("AdcKeyEventGet*******\n")); if (AdcKeyScanTimer > 0) { return IN_KEY_NONE; } AdcKeyScanTimer = ADC_KEY_SCAN_TIME; CurKeyIndex = AdcChannelKeyGet(1); if(CurKeyIndex == 0) { CurKeyIndex = AdcChannelKeyGet(2); if(CurKeyIndex > 0) { CurKeyIndex += ADC_KEY_COUNT; } } // DBG(("PreKeyIndex:%4d, ", (WORD)PreKeyIndex)); // DBG(("KeyIndex:%4d\n", (WORD)KeyIndex)); switch(AdcKeyState) { case ADC_KEY_STATE_IDLE: if(CurKeyIndex == 0) { return IN_KEY_NONE; } PreKeyIndex = CurKeyIndex; AdcKeyWaitTimer = ADC_KEY_JTTER_TIME; // DBG(("GOTO JITTER!\n")); AdcKeyState = ADC_KEY_STATE_JITTER; case ADC_KEY_STATE_JITTER: if(PreKeyIndex != CurKeyIndex) { // DBG(("GOTO IDLE Because jitter!\n")); AdcKeyState = ADC_KEY_STATE_IDLE; } else if(AdcKeyWaitTimer == 0) { // DBG(("GOTO PRESS_DOWN!\n")); AdcKeyWaitTimer = ADC_KEY_CP_TIME; AdcKeyState = ADC_KEY_STATE_PRESS_DOWN; } break; case ADC_KEY_STATE_PRESS_DOWN: /*immediately response key action */ switch(PreKeyIndex) { case 2: //vol- case 9: //vol+ case 6: //band case 7: //mode AdcKeyState = ADC_KEY_STATE_CP; return AdcKeyEvent[PreKeyIndex][0]; break; case 8: //power if(System.PowerMode == POWERMODE_POWEROFF) { AdcKeyState = ADC_KEY_STATE_CP; return AdcKeyEvent[PreKeyIndex][0]; } break; default: break; } if(PreKeyIndex != CurKeyIndex) { //return key sp value // DBG(("ADC KEY SP!**********\n")); AdcKeyState = ADC_KEY_STATE_IDLE; return AdcKeyEvent[PreKeyIndex][0]; } else if(AdcKeyWaitTimer == 0) { AdcKeyWaitTimer = 200; //Added by hwt ,for generate Continuous Press event Jul,14,,2010 //return key cp value // DBG(("ADC KEY CP!*****************************\n")); AdcKeyState = ADC_KEY_STATE_CP; return AdcKeyEvent[PreKeyIndex][1]; } break; case ADC_KEY_STATE_CP: if(PreKeyIndex != CurKeyIndex) { //return key cp value // DBG(("ADC KEY CPR!****************************************************\n")); AdcKeyState = ADC_KEY_STATE_IDLE; return AdcKeyEvent[PreKeyIndex][2]; } else { if (AdcKeyWaitTimer == 0) { AdcKeyWaitTimer = ADC_KEY_HOLD_TIME; //Added by hwt ,for generate Continuous Press event Dec 07,2009 return AdcKeyEvent[PreKeyIndex][3]; } } break; default: AdcKeyState = ADC_KEY_STATE_IDLE; break; } return IN_KEY_NONE; }