KEY_ATY.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /**
  2. * @file KEY_ATY.c
  3. *
  4. * @param Project DEVICE_GENERAL_ATY_LIB
  5. *
  6. * @author ATY
  7. *
  8. * @copyright
  9. * - Copyright 2017 - 2023 MZ-ATY
  10. * - This code follows:
  11. * - MZ-ATY Various Contents Joint Statement -
  12. * <a href="https://mengze.top/MZ-ATY_VCJS">
  13. * https://mengze.top/MZ-ATY_VCJS</a>
  14. * - CC 4.0 BY-NC-SA -
  15. * <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
  16. * https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
  17. * - Your use will be deemed to have accepted the terms of this statement.
  18. *
  19. * @brief functions of keys for all embedded device
  20. *
  21. * @version
  22. * - 1_01_230514 > ATY
  23. * -# Preliminary version, first Release
  24. ********************************************************************************
  25. */
  26. #ifndef __KEY_ATY_C
  27. #define __KEY_ATY_C
  28. #include "KEY_ATY.h"
  29. /******************************* For user *************************************/
  30. uint8_t KEY_PIN_GROUP[MAX_KEY_NUMBER] = {0x01 << 7, 0x01 << 6, 0x01 << 5};
  31. uint8_t KEY_PIN_GROUP_AD[MAX_KEY_NUMBER] = {9, 0, 0};
  32. /******************************************************************************/
  33. uint8_t lastKeyType[MAX_KEY_NUMBER] = {0};
  34. uint8_t keyExportType[MAX_KEY_NUMBER] = {0};
  35. uint16_t keyScanCount[MAX_KEY_NUMBER] = {0};
  36. uint16_t keyReleaseCount[MAX_KEY_NUMBER] = {0};
  37. /**
  38. * @brief process key state from IO level
  39. * @param keyIndex key IO pin to monitor
  40. * @note SINGLE and DOUBLE type need key release to response
  41. */
  42. void KeyStateMachine(uint8_t keyIndex)
  43. {
  44. // P_SW2 |= 0x80;
  45. // P2IM0 = 0xE0;
  46. // P2IM1 = 0xE0; // high level IT
  47. // P2INTE = 0xE0; // 25,26,27 enable IT
  48. // P_SW2 &= ~0x80;
  49. // EA = 1; // enable alla IT
  50. if((KEY_PORT & KEY_PIN_GROUP[keyIndex]) == 0){ // release
  51. // key debounce, 20ms miss when state machine put at 1ms cycle
  52. if(keyReleaseCount[keyIndex] > KEY_RELEASE_DEBOUNCE_TIME){
  53. // key debounce, 100ms miss when state machine put at 1ms cycle
  54. if(keyScanCount[keyIndex] >= KEY_PRESS_DEBOUNCE_TIME
  55. && keyScanCount[keyIndex] < KEY_TYPE_LONG_TIME){
  56. keyExportType[keyIndex] = KEY_TYPE_SINGLE;
  57. keyScanCount[keyIndex] = 0;
  58. keyReleaseCount[keyIndex] = 0;
  59. }
  60. else{
  61. // access new key after use last press until last press release
  62. if(lastKeyType[keyIndex] == KEY_TYPE_ACCESS_NEW)
  63. lastKeyType[keyIndex] = 0;
  64. keyExportType[keyIndex] = KEY_TYPE_RELASE;
  65. keyScanCount[keyIndex] = 0;
  66. }
  67. }
  68. if(keyReleaseCount[keyIndex] < KEY_RELEASE_DEBOUNCE_TIME * 2) // 2 margin
  69. keyReleaseCount[keyIndex]++;
  70. }
  71. else{
  72. if(keyScanCount[keyIndex] < KEY_TYPE_VLONG_TIME * 1.2) // 1.2 margin
  73. keyScanCount[keyIndex]++;
  74. // 1000ms long press
  75. if(keyScanCount[keyIndex] >= KEY_TYPE_LONG_TIME
  76. && keyScanCount[keyIndex] < KEY_TYPE_VLONG_TIME){
  77. keyExportType[keyIndex] = KEY_TYPE_LONG;
  78. }
  79. // 2000ms very long press
  80. else if(keyScanCount[keyIndex] >= KEY_TYPE_VLONG_TIME){
  81. keyExportType[keyIndex] = KEY_TYPE_VLONG;
  82. }
  83. }
  84. if(keyExportType[keyIndex] != KEY_TYPE_RELASE
  85. && lastKeyType[keyIndex] == 0){
  86. lastKeyType[keyIndex] = keyExportType[keyIndex];
  87. }
  88. }
  89. float KeyStateMachine_AD(uint8_t keyIndex)
  90. {
  91. float tempData = ADC_Get(KEY_PIN_GROUP_AD[keyIndex]);
  92. if(tempData < KEY_AD_Threshold){ // release
  93. // key debounce, 20ms miss when state machine put at 1ms cycle
  94. if(keyReleaseCount[keyIndex] > KEY_RELEASE_DEBOUNCE_TIME){
  95. // key debounce, 100ms miss when state machine put at 1ms cycle
  96. if(keyScanCount[keyIndex] >= KEY_PRESS_DEBOUNCE_TIME
  97. && keyScanCount[keyIndex] < KEY_TYPE_LONG_TIME){
  98. keyExportType[keyIndex] = KEY_TYPE_SINGLE;
  99. keyScanCount[keyIndex] = 0;
  100. keyReleaseCount[keyIndex] = 0;
  101. }
  102. else{
  103. // access new key after use last press until last press release
  104. if(lastKeyType[keyIndex] == KEY_TYPE_ACCESS_NEW)
  105. lastKeyType[keyIndex] = 0;
  106. keyExportType[keyIndex] = KEY_TYPE_RELASE;
  107. keyScanCount[keyIndex] = 0;
  108. }
  109. }
  110. if(keyReleaseCount[keyIndex] < KEY_RELEASE_DEBOUNCE_TIME * 2) // 2 margin
  111. keyReleaseCount[keyIndex]++;
  112. }
  113. else{
  114. if(keyScanCount[keyIndex] < KEY_TYPE_VLONG_TIME * 1.2) // 1.2 margin
  115. keyScanCount[keyIndex]++;
  116. // 1000ms long press
  117. if(keyScanCount[keyIndex] >= KEY_TYPE_LONG_TIME
  118. && keyScanCount[keyIndex] < KEY_TYPE_VLONG_TIME){
  119. keyExportType[keyIndex] = KEY_TYPE_LONG;
  120. }
  121. // 2000ms very long press
  122. else if(keyScanCount[keyIndex] >= KEY_TYPE_VLONG_TIME){
  123. keyExportType[keyIndex] = KEY_TYPE_VLONG;
  124. }
  125. }
  126. if(keyExportType[keyIndex] != KEY_TYPE_RELASE
  127. && lastKeyType[keyIndex] == 0){
  128. lastKeyType[keyIndex] = keyExportType[keyIndex];
  129. }
  130. return tempData;
  131. }
  132. #endif /* __KEY_ATY_C */
  133. /******************************** End Of File *********************************/