keys.ino 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include "keys.h"
  2. KEY_DEB keypad_debouncing;
  3. uint8_t keys_io[ KEYS_NUM ]= {KEY1,KEY2,KEY3,KEY4,KEY5,KEY6,KEY7,KEY8,KEY9,KEY10,KEY11,KEY12,KEY13,KEY14,KEY15,KEY16,KEY0};
  4. /* keys state(1:on, 0:off) */
  5. static uint32_t keys;
  6. static uint32_t keys_debouncing;
  7. static uint32_t keys_prev;
  8. void init_keys(){
  9. int i;
  10. for(i=0;i<KEYS_NUM;i++) {
  11. pinMode( keys_io[i],INPUT_PULLUP);
  12. }
  13. }
  14. uint8_t scan_keys(){
  15. uint32_t data;
  16. uint8_t s;
  17. data = 0;
  18. delayMicroseconds(30);
  19. for(int i = 0;i < KEYS_NUM;i++) {
  20. s = read_io(keys_io[i]);
  21. s ^= 1;
  22. data |= s << i;
  23. }
  24. if ( keys_debouncing != data ) {
  25. keys_debouncing = data;
  26. keypad_debouncing.deing = true;
  27. keypad_debouncing.de_time = millis();
  28. }
  29. if (keypad_debouncing.deing == true && ( (millis() - keypad_debouncing.de_time) > KEY_DEBOUNCE )) {
  30. keys = keys_debouncing;
  31. keypad_debouncing.deing = false;
  32. }else {
  33. delay(1);
  34. }
  35. return 1;
  36. }
  37. void print_keys(DEVTERM*dv) {
  38. char buff[128];
  39. for (int i = 0; i < KEYS_NUM; i++) {
  40. if( keys & (1<< i) ){
  41. sprintf(buff,"B%d pressed\n",i+1);
  42. dv->_Serial->print(buff);
  43. }
  44. }
  45. }
  46. void keys_task(DEVTERM*dv){
  47. scan_keys();
  48. uint32_t _mask =1;
  49. uint32_t _change = 0;
  50. uint32_t _pressed = 0;
  51. _change = keys ^ keys_prev;
  52. if(_change) {
  53. for(uint8_t c=0;c < KEYS_NUM;c++,_mask <<=1) {
  54. if (_change & _mask) {
  55. _pressed = keys & _mask;
  56. if(_pressed) {
  57. keypad_action(dv,c,KEY_PRESSED);
  58. }else {
  59. keypad_action(dv,c,KEY_RELEASED);
  60. }
  61. keys_prev ^= _mask;
  62. }
  63. }
  64. }
  65. }
  66. void keys_init(DEVTERM*dv){
  67. init_keys();
  68. //center the position
  69. dv->Joystick->X(511);
  70. dv->Joystick->Y(511);
  71. keypad_debouncing.deing = false;
  72. keypad_debouncing.de_time = 0;
  73. }