ReadKey.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  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. // Keys.downTime = Keys.downTimeSet;
  99. }
  100. }
  101. }else{//不相等,表示新按键按下,检测双击键
  102. //------------------------------双击按键-----------------------------------
  103. if(Keys.enDoubleKey){//如果使能了双击有效功能
  104. if(Keys.upTime){//如果在按键弹起时间范围能
  105. KeysExt.haveKey = true; //产生按键
  106. Keys.stDoubleKey = true; //产生了双击按键
  107. }
  108. }
  109. }
  110. //------------------------------其他功能按键-----------------------------------
  111. if(Keys.isDown == false){//第一次产生按键
  112. KeysExt.haveKey = true; //产生按键
  113. }
  114. //更新按键
  115. Keys.oldValue = Keys.newValue;
  116. Keys.stReleaseKey = false;
  117. Keys.isDown = true;
  118. }else{//按键未按下,检测双击键和弹起有效功能
  119. //------------------------------弹起按键-----------------------------------
  120. if(Keys.enReleaseKey){//如果使能了弹起有效功能
  121. if(Keys.isDown){//表示按键弹起
  122. KeysExt.haveKey = true; //产生按键
  123. Keys.stReleaseKey = true; //产生了弹起按键
  124. }
  125. }else{
  126. //更新按键
  127. Keys.oldValue = Keys.newValue;
  128. }
  129. Keys.enCyclicKey = false;
  130. Keys.enLongKey = false;
  131. Keys.stLongKey = false;
  132. Keys.stCyclicKey = false;
  133. Keys.stDoubleKey = false;
  134. Keys.isDown = false;
  135. }
  136. KeysExt.value = Keys.oldValue;
  137. return &KeysExt;
  138. }
  139. /**
  140. * --------使能双击有效功能
  141. * @since 2018-7-25
  142. * @Param1 void
  143. * @Addition Keys.upTime:基准时间10ms
  144. * 使用方法见.c文件头
  145. * @Return
  146. *
  147. */
  148. void EnableDoubleKey(void)
  149. {
  150. if(Keys.enDoubleKey==false)
  151. {
  152. Keys.enDoubleKey = true;
  153. Keys.upTime= 500/baseTime;
  154. }
  155. }
  156. bool getDoubleKeySt(void){
  157. return Keys.stDoubleKey;
  158. }
  159. void clearDoubleKey(void){
  160. Keys.enDoubleKey = false;
  161. }
  162. //-----------------------------------------
  163. //
  164. //按键长按键处理子程序
  165. //
  166. //-----------------------------------------
  167. /**
  168. * --------使能长按有效功能,单次有效
  169. * @since 2018-7-25
  170. * @Param1 void
  171. * @Addition Keys.downTime:基准时间10ms
  172. * 使用方法见.c文件头
  173. * @Return
  174. *
  175. */
  176. void EnableLongKey(unsigned int Xms)
  177. {
  178. if(Keys.enLongKey==false)
  179. {
  180. Keys.enLongKey = true;
  181. Keys.downTime=Xms/baseTime;
  182. }
  183. }
  184. bool getLongKeySt(void){
  185. return Keys.stLongKey;
  186. }
  187. void clearLongKey(void){
  188. Keys.enLongKey = false;
  189. }
  190. //-----------------------------------------
  191. //
  192. //按键循环长按有效处理子程序
  193. //
  194. //-----------------------------------------
  195. /**
  196. * --------使能循环长按有效功能,循环有效
  197. * @since 2018-7-25
  198. * @Param1 void
  199. * @Addition Keys.downTime:基准时间10ms
  200. * 若需要按下首次有效,则无需调用getCyclicKeySt()
  201. * 使用方法见.c文件头
  202. * @Return
  203. *
  204. */
  205. void EnableCyclicKey(unsigned int Xms)
  206. {
  207. Keys.enCyclicKey = true;
  208. Keys.downTime = Xms/baseTime;
  209. // Keys.downTimeSet = Xms/baseTime;
  210. }
  211. bool getCyclicKeySt(void){
  212. return Keys.stCyclicKey;
  213. }
  214. //void clearCyclicKey(void){
  215. // Keys.enCyclicKey = false;
  216. //}
  217. //-----------------------------------------
  218. //
  219. //按键弹起有效处理子程序
  220. //
  221. //-----------------------------------------
  222. //-----------------------------------------
  223. /**
  224. * --------使能弹起有效功能
  225. * @since 2018-7-25
  226. * @Param1 void
  227. * @Addition
  228. * 使用方法见.c文件头
  229. * @Return
  230. *
  231. */
  232. void EnableReleaseKey(void)
  233. {
  234. Keys.enReleaseKey = true;
  235. }
  236. bool getReleaseKeySt(void){
  237. return Keys.stReleaseKey;
  238. }
  239. void clearReleaseKey(void){
  240. Keys.enReleaseKey = false;
  241. }