ReadKey.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. // Header:
  2. // File Name:
  3. // Author:
  4. // Date:
  5. // 使用举例:
  6. /*
  7. if(isTmFor10ms){
  8. isTmFor10ms = false;
  9. KeyIn = KeyValueChange(mKeyValue);
  10. }
  11. if(K1 == 0){
  12. mKeyValue =1;
  13. } else if(K2 == 0){
  14. mKeyValue =2;
  15. }else if(K3 == 0){
  16. mKeyValue =3;
  17. }else if(K4 == 0){
  18. mKeyValue =4;
  19. }else{
  20. mKeyValue =0;
  21. }
  22. if(KeyIn->haveKey){
  23. KeyIn->haveKey = false;
  24. switch(KeyIn->value){
  25. case 1:
  26. EnableLongKey(100);
  27. if(getLongKeySt() == true){
  28. clearLongKey();
  29. lenth++;
  30. }
  31. break;
  32. case 2:
  33. EnableDoubleKey();
  34. if(getDoubleKeySt() == true){
  35. clearDoubleKey();
  36. lenth++;
  37. }
  38. break;
  39. case 3:
  40. EnableReleaseKey();
  41. if(getReleaseKeySt() == true){
  42. clearReleaseKey();
  43. lenth++;
  44. }
  45. break;
  46. case 4:
  47. EnableCyclicKey(100);
  48. if(getCyclicKeySt() == true)
  49. {
  50. lenth++;
  51. }
  52. break;
  53. default:
  54. break;
  55. }
  56. }
  57. */
  58. #include "ReadKey.h"
  59. KeyParam_ts Keys;
  60. KeyParamExt_ts KeysExt;
  61. /**
  62. * --------按键功能转换
  63. * @since 2018-7-25
  64. * @Param1 PreKeyValue:需要转换实现功能的按键键值
  65. * @Addition
  66. * 可以产生长按有效,弹起有效,长按循环有效,双击有效功能
  67. * 长按有效,长按循环有效,双击有效功能响应时间受该函数的调用
  68. * 基准时间有关,本例基准时间:baseTime=10ms,若有不同,请在.h文件中修改请知悉!
  69. * @Return
  70. * KeyParamExt_ts:haveKey=true才可以处理按键,value取得键值
  71. */
  72. KeyParamExt_ts *KeyValueChange(unsigned char PreKeyValue){
  73. Keys.newValue = PreKeyValue;
  74. if(Keys.upTime){
  75. Keys.upTime--;
  76. }else{
  77. Keys.enDoubleKey = false;
  78. }
  79. if(Keys.newValue){
  80. if(Keys.downTime){
  81. Keys.downTime--;
  82. }
  83. if(Keys.newValue == Keys.oldValue){//相等,表示按键长按状态下
  84. //------------------------------长按键-----------------------------------
  85. if(Keys.enLongKey){//如果使能了长按有效功能,单次触发
  86. if(Keys.downTime == 0){//如果长按时间到
  87. if(Keys.stLongKey == false){//如果未产生长按键
  88. KeysExt.haveKey = true; //产生按键
  89. }
  90. Keys.stLongKey = true;
  91. }
  92. }
  93. //------------------------------循环长按键-----------------------------------
  94. if(Keys.enCyclicKey){//如果使能了长按循环有效功能,循环触发
  95. if(Keys.downTime == 0){//如果长按时间到
  96. KeysExt.haveKey = true; //产生按键
  97. Keys.stCyclicKey = true; //产生了循环长按键
  98. }
  99. }
  100. }else{//不相等,表示新按键按下,检测双击键
  101. //------------------------------双击按键-----------------------------------
  102. if(Keys.enDoubleKey){//如果使能了双击有效功能
  103. if(Keys.upTime){//如果在按键弹起时间范围能
  104. KeysExt.haveKey = true; //产生按键
  105. Keys.stDoubleKey = true; //产生了双击按键
  106. }
  107. }
  108. }
  109. //------------------------------其他功能按键-----------------------------------
  110. if(Keys.isDown == false){//第一次产生按键
  111. KeysExt.haveKey = true; //产生按键
  112. }
  113. //更新按键
  114. Keys.oldValue = Keys.newValue;
  115. Keys.stReleaseKey = false;
  116. Keys.isDown = true;
  117. }else{//按键未按下,检测双击键和弹起有效功能
  118. //------------------------------弹起按键-----------------------------------
  119. if(Keys.enReleaseKey){//如果使能了弹起有效功能
  120. if(Keys.isDown){//表示按键弹起
  121. KeysExt.haveKey = true; //产生按键
  122. Keys.stReleaseKey = true; //产生了弹起按键
  123. }
  124. }else{
  125. //更新按键
  126. Keys.oldValue = Keys.newValue;
  127. }
  128. Keys.enCyclicKey = false;
  129. Keys.enLongKey = false;
  130. Keys.stLongKey = false;
  131. Keys.stCyclicKey = false;
  132. Keys.stDoubleKey = false;
  133. Keys.isDown = false;
  134. }
  135. KeysExt.value = Keys.oldValue;
  136. return &KeysExt;
  137. }
  138. /**
  139. * --------使能双击有效功能
  140. * @since 2018-7-25
  141. * @Param1 void
  142. * @Addition Keys.upTime:基准时间10ms
  143. * 使用方法见.c文件头
  144. * @Return
  145. *
  146. */
  147. void EnableDoubleKey(void)
  148. {
  149. if(Keys.enDoubleKey==false)
  150. {
  151. Keys.enDoubleKey = true;
  152. Keys.upTime= 500/baseTime;
  153. }
  154. }
  155. bool getDoubleKeySt(void){
  156. return Keys.stDoubleKey;
  157. }
  158. void clearDoubleKey(void){
  159. Keys.enDoubleKey = false;
  160. }
  161. //-----------------------------------------
  162. //
  163. //按键长按键处理子程序
  164. //
  165. //-----------------------------------------
  166. /**
  167. * --------使能长按有效功能,单次有效
  168. * @since 2018-7-25
  169. * @Param1 void
  170. * @Addition Keys.downTime:基准时间10ms
  171. * 使用方法见.c文件头
  172. * @Return
  173. *
  174. */
  175. void EnableLongKey(unsigned int Xms)
  176. {
  177. if(Keys.enLongKey==false)
  178. {
  179. Keys.enLongKey = true;
  180. Keys.downTime=Xms/baseTime;
  181. }
  182. }
  183. bool getLongKeySt(void){
  184. return Keys.stLongKey;
  185. }
  186. void clearLongKey(void){
  187. Keys.enLongKey = false;
  188. }
  189. //-----------------------------------------
  190. //
  191. //按键循环长按有效处理子程序
  192. //
  193. //-----------------------------------------
  194. /**
  195. * --------使能循环长按有效功能,循环有效
  196. * @since 2018-7-25
  197. * @Param1 void
  198. * @Addition Keys.downTime:基准时间10ms
  199. * 若需要按下首次有效,则无需调用getCyclicKeySt()
  200. * 使用方法见.c文件头
  201. * @Return
  202. *
  203. */
  204. void EnableCyclicKey(unsigned int Xms)
  205. {
  206. Keys.enCyclicKey = true;
  207. Keys.downTime = Xms/baseTime;
  208. }
  209. bool getCyclicKeySt(void){
  210. return Keys.stCyclicKey;
  211. }
  212. //void clearCyclicKey(void){
  213. // Keys.enCyclicKey = false;
  214. //}
  215. //-----------------------------------------
  216. //
  217. //按键弹起有效处理子程序
  218. //
  219. //-----------------------------------------
  220. //-----------------------------------------
  221. /**
  222. * --------使能弹起有效功能
  223. * @since 2018-7-25
  224. * @Param1 void
  225. * @Addition
  226. * 使用方法见.c文件头
  227. * @Return
  228. *
  229. */
  230. void EnableReleaseKey(void)
  231. {
  232. Keys.enReleaseKey = true;
  233. }
  234. bool getReleaseKeySt(void){
  235. return Keys.stReleaseKey;
  236. }
  237. void clearReleaseKey(void){
  238. Keys.enReleaseKey = false;
  239. }