switch (k_pad[idx].kstate) { case IDLE: if (button==CLOSED) { //printf("idx=%d\r\n"idx); Keypad_transitionTo (idx PRESSED); holdTimer = millis(); }// Get ready for next HOLD state. break; case PRESSED: if ((millis()-holdTimer)>holdTime)// Waiting for a key HOLD... { Keypad_transitionTo (idx HOLD); //printf("hold\r\n"); } else if (button==OPEN)// or for a key to be RELEASED. Keypad_transitionTo (idx RELEASED); break; case HOLD: if (button==OPEN) { Keypad_transitionTo (idx RELEASED); //printf("OPEN\r\n"); } else Keypad_transitionTo (idx HOLD); break; case RELEASED: Keypad_transitionTo (idx IDLE); break; } }
int Keypad_findInList (int keyCode) { char i=0; for ( i=0; i<LIST_MAX; i++) { if (k_pad[i].kcode == keyCode) { return i; } } return -1; } char Keypad_updateList() { char i=0; char keyChar=0; int keyCode=0; char c=0; char r=0; int idx=0; char button=0; char anyActivity = 0; // bool button=OPEN; for(i=0;i<LIST_MAX;i++) { if (k_pad[i].kstate==IDLE) { k_pad[i].kchar = NO_KEY; k_pad[i].kcode = -1; k_pad[i].stateChanged = 0; } } for (r=0; r<key.rows; r++) { for (c=0; c<key.columns; c++) { button = bitRead(bitMap[r]c); //printf("r:%dc:%dbutton:%d\r\n"rcbutton); keyChar = key.keymap[r * key.columns + c];//找到键值 keyCode = r * key.columns + c;//找到那个键 idx=Keypad_findInList(keyCode);//更新键值,如果这次keyCode等于上次返回i if (idx > -1) { Keypad_nextKeyState(idx button); } if ((idx == -1) && button) { for ( i=0; i<LIST_MAX; i++) { if (k_pad[i].kchar==NO_KEY) // Find an empty slot or don't add key to list. { k_pad[i].kchar = keyChar; k_pad[i].kcode = keyCode; k_pad[i].kstate = IDLE;// Keys NOT on the list have an initial state of IDLE. Keypad_nextKeyState (i button); //printf("NEW:%d\r\n"i); break;// Don't fill all the empty slots with the same key. } } } } } for (i=0; i<LIST_MAX; i++) { if (k_pad[i].stateChanged) anyActivity = 1; }
return anyActivity; }
char Keypad_getKeys() { char keyActivity = 0;
// Limit how often the keypad is scanned. This makes the loop() run 10 times as fast. if ( (millis()-startTime)>debounceTime ) { Keypad_scanKeys(); keyActivity = Keypad_updateList(); startTime = millis(); }
char *msg; char i=0; char j=0; buff->Keyboard[0]=0x01; buff->Mouse[0]=0x02; buff->Mouse[4] = 0xff; for ( i=0; i<LIST_MAX; i++) // Scan the whole key list. { if ( k_pad[i].stateChanged ) // Only find keys that have changed state. { switch (k_pad[i].kstate) { // Report active key state : IDLE PRESSED HOLD or RELEASED case PRESSED: msg = " PRESSED."; pressedBuffers[i]=k_pad[i].kchar; break; case HOLD: msg = " HOLD."; pressedBuffers[i]=k_pad[i].kchar;
break; case RELEASED: msg = " RELEASED.";break; case IDLE: msg = " IDLE."; break; }