#include "key.h" #include "CTRL.H" #include "dc2ac.h" #include "task.h" unsigned char gcOldKey = 0; int gcKeyFilter = 0; unsigned char gcKeyStack[MAX_KEY_STACK] = {"\0"}; unsigned char gcKeySavePtr= 0; unsigned char gcKetGetPtr = 0; signed char gcBLTimer = -1; unsigned char gcKey = 0; //键盘键值 void TaskScanKey(void) { unsigned char Key = KEY; //按键输入 //去掉LOCK,上下到位 半降全降信号 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(gcKeyFilter>250) { if(Key==KEY_STOP) //长按2.5S 停止就变成了中停2按键 { gcKeyStack[gcKeySavePtr]=KEY_STOP2; gcKeySavePtr=(gcKeySavePtr+1)%MAX_KEY_STACK; Beep(1,500); } } //if((Key&KEY_LOCK)!=KEY_LOCK) //键值过滤 锁定键不允许连击 if(((Key&KEY_STOPWARN)==KEY_STOPWARN) || ( (Key&KEY_DEBUG)==KEY_DEBUG) || ( (Key&KEY_SELFTEST)==KEY_SELFTEST)) { gcKeyFilter=0; gcKeyStack[gcKeySavePtr]=Key; gcKeySavePtr=(gcKeySavePtr+1)%MAX_KEY_STACK; Beep(1,50); //beep 10ms } } } } else { if((gcKeyFilter>6)&&(gcKeyFilter<250)) //延时去抖动 ,按键松开的情况 { gcKeyFilter=0; gcKeyStack[gcKeySavePtr]=gcOldKey; gcKeySavePtr=(gcKeySavePtr+1)%MAX_KEY_STACK; Beep(1,100); //beep 10ms } else { gcKeyFilter=0; } } #ifdef _DEBUG //printf("Key = 0x%X \n",(int)Key); #endif } /************************************************************************** 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; }