#include #include "cfg/al_helper.h" #include "key.h" #include "key_cfg.h" XDATA unsigned char gcOldKey = 0; XDATA unsigned char gcKeyFilter = 0; XDATA unsigned char gcKeyStack[MAX_KEY_STACK] = {"\0"}; XDATA unsigned char gcKeySavePtr= 0; XDATA unsigned char gcKetGetPtr = 0; XDATA signed char gcBLTimer = -1; XDATA unsigned char gcKey = 0; //键盘键值 void Beep(uint8_t count,uint16_t freq) { UNUSED(count); UNUSED(freq); } void InitKey(void) { GPIO_Init(GPIO_KEY,GPIO_PIN_KEY,GPIO_MODE_IN_PU); //,GPIO_PIN_KEY //GPIO_WriteHigh(GPIO_KEY,GPIO_PIN_KEY); _nop_(); } //void TaskScanKey(void) #if TASK_WITH_PT PT_THREAD(TaskScanKey(struct pt *pt1 )) #else PT_THREAD(TaskScanKey(void)) #endif { unsigned char Key = GPIO_ReadPort(GPIO_KEY); //,GPIO_PIN_KEY _nop_(); Key = Key&KEY_MAP; if(Key!=0x0) { if(Key!=gcOldKey) //digit filter { gcOldKey=Key; gcKeyFilter=0; Beep(1,100); } else { //长按不放的情况 gcKeyFilter++; if( gcKeyFilter>MAX_KEY_FILTER) //save key to stack { //if((Key&KEY_LOCK)!=KEY_LOCK) //键值过滤 锁定键不允许连击 { gcKeyFilter=0; gcKeyStack[gcKeySavePtr]=Key; gcKeySavePtr=(gcKeySavePtr+1)%MAX_KEY_STACK; Beep(1,50); //beep 10ms } } } } else { if(gcKeyFilter>2) //延时去抖动 ,按键松开的情况 { gcKeyFilter=0; gcKeyStack[gcKeySavePtr]=gcOldKey; gcKeySavePtr=(gcKeySavePtr+1)%MAX_KEY_STACK; Beep(1,100); //beep 10ms } } #ifdef _DEBUG //printf("Key = 0x%X \n",(int)Key); #endif UNUSED(pt1); return 0; } /************************************************************************** get key code,return 0 if no key ***************************************************************************/ unsigned char GetKey(void) { unsigned char ret; if(gcKetGetPtr!=gcKeySavePtr) { ret=gcKeyStack[gcKetGetPtr]; gcKetGetPtr=(gcKetGetPtr+1)%MAX_KEY_STACK; } else ret=0; return ret; }