Example #1
0
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;
}
Example #2
0
//
// 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;
}