📄 keypad.c
字号:
#define _KEYPAD_C_
#include <math.h>
#include "types.h"
#include "board.h"
#include "ms_reg.h"
#include "global.h"
#include "keypaddef.h"
#include "DEBUG.h"
#include "misc.h"
#include "ms_rwreg.h"
#include "Reg52.h"
#include "ir.h"
#include "menu.h"
#include "keypad.h"
//===============================================================
#define MAX_KEYVALUE 0x3F
#define HIGHLEVEL 0x3A
#define KeyJitterCounter 15
#define KeyStableCounter 1
#define KEY_Idle 0xFF
BYTE Key_ScanValue(BYTE KeyAdcPort)
{
if(KeyAdcPort==ADCKEY1)
g_ucCurrentKeyADC[KeyAdcPort]=PKEYADC1;
else
g_ucCurrentKeyADC[KeyAdcPort]=PKEYADC2;
return g_ucCurrentKeyADC[KeyAdcPort];
}
BYTE Key_GetKeypadStatus(void)
{
//BYTE KeyData = KEY_NOTHING;
BYTE ADCValue;
#if(KEY_TYPE==Single_ADCKey)
//------------------------------------------------
ADCValue=Key_ScanValue(ADCKEY1);
if (ADCValue < (KEY_AD_L0 + KEY_AD_DELTA)&&ADCValue > (KEY_AD_L0 - KEY_AD_DELTA))
{
if(g_ucKeyStableCountBuff[KEY_POWER]++>KeyStableCounter)
{
return KEY_POWER;
}
}
else if (ADCValue < (KEY_AD_L1+KEY_AD_DELTA)&&ADCValue > (KEY_AD_L1 - KEY_AD_DELTA))
{
if(g_ucKeyStableCountBuff[KEY_MENU]++>KeyStableCounter)
{
return KEY_MENU;
}
}
else if (ADCValue < (KEY_AD_L2+KEY_AD_DELTA)&&ADCValue > (KEY_AD_L2 - KEY_AD_DELTA))
{
if(g_ucKeyStableCountBuff[KEY_LEFT]++>KeyStableCounter)
{
return KEY_LEFT;
}
}
else if (ADCValue < (KEY_AD_L3+KEY_AD_DELTA)&&ADCValue > (KEY_AD_L3 - KEY_AD_DELTA))
{
if(g_ucKeyStableCountBuff[KEY_RIGHT]++>KeyStableCounter)
{
return KEY_RIGHT;
}
}
else if (ADCValue < (KEY_AD_L4+KEY_AD_DELTA)&&ADCValue > (KEY_AD_L4 - KEY_AD_DELTA))
{
if(g_ucKeyStableCountBuff[KEY_DOWN]++>KeyStableCounter)
{
return KEY_DOWN;
}
}
else if (ADCValue < (KEY_AD_L5+KEY_AD_DELTA)&&ADCValue > (KEY_AD_L5 - KEY_AD_DELTA))
{
if(g_ucKeyStableCountBuff[KEY_UP]++>KeyStableCounter)
{
return KEY_UP;
}
}
#elif(KEY_TYPE==Dual_ADCKey)
//------------------------------------------------
ADCValue=Key_ScanValue(ADCKEY1);
if (ADCValue < (KEY_AD_L0 + KEY_AD_DELTA)&&ADCValue > (KEY_AD_L0 - KEY_AD_DELTA))
{
if(g_ucKeyStableCountBuff[KEY_RIGHT]++>KeyStableCounter)
{
return KEY_RIGHT;
}
}
else if (ADCValue < (KEY_AD_L1+KEY_AD_DELTA)&&ADCValue > (KEY_AD_L1 - KEY_AD_DELTA))
{
if(g_ucKeyStableCountBuff[KEY_LEFT]++>KeyStableCounter)
{
return KEY_LEFT;
}
}
else if (ADCValue < (KEY_AD_L2+KEY_AD_DELTA)&&ADCValue > (KEY_AD_L2 - KEY_AD_DELTA))
{
if(g_ucKeyStableCountBuff[KEY_UP]++>KeyStableCounter)
{
return KEY_UP;
}
}
else if (ADCValue < (KEY_AD_L3+KEY_AD_DELTA)&&ADCValue > (KEY_AD_L3 - KEY_AD_DELTA))
{
if(g_ucKeyStableCountBuff[KEY_DOWN]++>KeyStableCounter)
{
return KEY_DOWN;
}
}
ADCValue=Key_ScanValue(ADCKEY2);
if (ADCValue < (KEY_AD_L0 + KEY_AD_DELTA)&&ADCValue > (KEY_AD_L0 - KEY_AD_DELTA))
{
if(g_ucKeyStableCountBuff[KEY_POWER]++>KeyStableCounter)
{
return KEY_POWER;
}
}
else if (ADCValue < (KEY_AD_L1+KEY_AD_DELTA)&&ADCValue > (KEY_AD_L1 - KEY_AD_DELTA))
{
if(g_ucKeyStableCountBuff[KEY_MENU]++>KeyStableCounter)
{
return KEY_MENU;
}
}
else if (ADCValue < (KEY_AD_L2+KEY_AD_DELTA)&&ADCValue > (KEY_AD_L2 - KEY_AD_DELTA))
{ //printf("\r\nADCValue===<%x>", ADCValue);
if(g_ucKeyStableCountBuff[KEY_SOURCE]++>KeyStableCounter)
{
return KEY_SOURCE;
}
}
#endif
if(!g_ucKeyCounter)
return KEY_NOTHING;
g_ucKeyCounter--;
return KEY_Idle;
}
void Key_ScanKeypad(void)
{
BYTE keypadStatus;
keypadStatus=Key_GetKeypadStatus();
if (keypadStatus!=KEY_Idle)
{
if(keypadStatus!=KEY_NOTHING)
{
printf("\r\nKEY<%x>", keypadStatus);
if (keypadStatus == g_ucLastKeypad)
{
//printMsg("repeat key pad");
EventRepeatProcess(keypadStatus, 2);
}
else
{
//printMsg("Single key pad");
EventProcess(keypadStatus);
}
}
g_ucLastKeypad = keypadStatus;
Key_KeyInit();
}
}
void Key_KeyInit(void)
{
g_ucKeyCounter=KeyJitterCounter;
g_ucKeyStableCountBuff[0]=0;
g_ucKeyStableCountBuff[1]=0;
g_ucKeyStableCountBuff[2]=0;
g_ucKeyStableCountBuff[3]=0;
g_ucKeyStableCountBuff[4]=0;
g_ucKeyStableCountBuff[5]=0;
g_ucKeyStableCountBuff[6]=0;
g_ucKeyStableCountBuff[7]=0;
}
void CheckFactoryKeyStatus(void)
{
BYTE keypadStatus, i;
for(i=0;i<10;i++)
{
keypadStatus=Key_GetKeypadStatus();
}
Clr_FactoryModeFlag();
if (keypadStatus==KEY_MENU)
{
Set_FactoryModeFlag();
Set_PowerOnFlag();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -