久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: PIC單片機單個按鍵實現(xiàn)多功能:長按、短按次數(shù)識別程序 [打印本頁]

作者: GEECGYJ    時間: 2022-2-5 10:15
標(biāo)題: PIC單片機單個按鍵實現(xiàn)多功能:長按、短按次數(shù)識別程序
春節(jié)放假沒有回老家,于是寫了個多功能按鍵識別小程序!
按鍵分為長按識別(長按3秒),短按識別(記錄識別當(dāng)前按的次數(shù)),以節(jié)約單片I/O!

用我自制的PIC16F887+I2C BD2004試驗板測試如下圖:


單片機源程序如下:
  1. #include<pic.h>  
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. //--------------//

  5. //配合8M頻率
  6. //開關(guān)使用情況:
  7. //長按約2秒 生置鍵生效
  8. //單擊 +  雙擊 -
  9. //三擊及以上未使用

  10. //--------------//
  11. #define  sw1 RA4   //
  12. #define  long_time  200  //長按按鍵時間預(yù)設(shè) 約2秒
  13. #define  re_time1   46   //第一次按下開關(guān)等待第二次按下開關(guān)的時長
  14. #define  re_push    0    //第二次及之后的按住開關(guān)的時長 為零時雙擊效率增加
  15. #define  re_time2   55   //第二次及之后等待再次按下開關(guān)的時長
  16. bit     read_one;
  17. bit     push_one;
  18. bit     push_hold;
  19. bit     sw_one_flag;
  20. bit     re_push_lock;
  21. bit     key_long_flag;
  22. bit     push_one_flag;
  23. bit     jian_temp_flag;
  24. bit     long_lock_flag;
  25. bit     sec_push_flag;
  26. bit     long_flag;
  27. bit     sen;
  28. bit     set_sw_flag,short_temp_flag;
  29. bit    to_noli_flag;
  30. bit    thr_flag;
  31. bit    jiao_set_flag;

  32. bit   up_flag;        //加按鍵
  33. bit   dn_flag;        //減按鍵
  34. bit   se_flag;

  35. uint    cont;
  36. uchar   key_cont;
  37. uchar   key_num;
  38. uint   sw_open_cont,sw_open_cont1,re_push_cont;

  39. char     set_mode;  // 長按+

  40. void push_scan();   //長短及連按計次處理
  41. void key_scan();    //對應(yīng)按次處理

  42. /*
  43. ////以下這段長短按鍵識別計數(shù)器 復(fù)制到TMR0中斷內(nèi)執(zhí)行效率更高////////////
  44. //--------------------//
  45. if(sw1==0&&sw_one_flag==0&&cont<long_time)    //
  46. {
  47. cont++;if(cont>=long_time) long_flag=1;  //長按時間約2秒
  48. }
  49. else cont=0;
  50. //--------------------//
  51. if(push_one==1)
  52. {
  53. if(sw1==1&&push_hold==0) //第一次按下開關(guān)等待第二次按下開關(guān)的時長
  54. {sw_open_cont1++;
  55. }

  56. if(push_hold)
  57. {
  58. //if(sw1==0&&re_push_lock==0){re_push_cont++;}//再次按下時間限制,用于不能太快松開
  59. if(sw1==1&&re_push_lock==0)sw_open_cont++;//第二次及之后等待再次按下開關(guān)的時長
  60. }

  61. }
  62. //--------------------//
  63. ////長短按鍵識別計數(shù)end////////////
  64. */


  65. ///////////////////
  66. //----------------------------//
  67. //單按鍵長、短按識別
  68. //長按輸出結(jié)果:key_long_flag 為1時有效,
  69. //短按計次輸出:key_num; key_num=1~10     
  70. void push_scan(void)
  71. {
  72. /////長按鍵處理//////
  73. if(sw1==0&&push_hold==0)    //
  74. {
  75. //cont++;if(cont>=long_time) long_flag=1;  //長按時間約3秒 在中TMR0中斷內(nèi)執(zhí)行提高計時穩(wěn)定
  76. if(long_flag&&sw_one_flag==0)   //處理長按鈕
  77. {
  78. key_long_flag=1;
  79. //didi(1);
  80. sw_one_flag=1;
  81. long_lock_flag=1;
  82. }  
  83. } else {if(sw1==1&&sw_one_flag){ cont=0;sw_one_flag=0;long_flag=0;}}
  84. /////長按鍵處理完成//////

  85. //------短按處理--//
  86. //---第一次按下后再放開按鍵的處理--//
  87. if(sw1==0&&push_one_flag==0){push_one_flag=1;key_num=0;}//第一次壓下開關(guān)檢測 并清除舊的key_num
  88. else if(push_one_flag==1&&sw1==1){push_one_flag=0;push_one=1;}//當(dāng)?shù)谝淮螇合路砰_后置位壓一次標(biāo)志避免與長按沖突
  89. //---第一次按下后再放開按鍵完成--//

  90. //---當(dāng)檢測到第一次壓下并放開后--//
  91. if(push_one)
  92. {
  93. //---是否有第二次按壓處理--//
  94. if(sw1==0&&push_hold==0&&sec_push_flag==0)//檢測有第二次壓下
  95. {
  96. if(push_hold==0) key_cont=1;//有第二次壓下時將上次的按鍵次數(shù) 先清零 導(dǎo)入開關(guān)后應(yīng)關(guān)閉
  97. push_hold=1;                //有第二次壓下開關(guān)時置位開關(guān)按過的標(biāo)志,
  98. sec_push_flag=1;
  99. }

  100. else if(sw1==1&&push_hold==0) //若無第二次按開關(guān) 清零按過標(biāo)志
  101. {//sw_open_cont1++;         //在中TMR0中斷內(nèi)執(zhí)行提高計時穩(wěn)定   
  102. if(sw_open_cont1>re_time1)//超過指定間隔時間未按開關(guān)
  103. {sec_push_flag=0;push_one=0;sw_open_cont1=0;
  104. if(long_lock_flag)
  105. {key_cont=0;long_lock_flag=0;}
  106. else {key_cont=1;}}
  107. }
  108. //---第二次是否按壓處理完成--//

  109. //---第二次及之后按壓計數(shù)處理--//
  110. if(push_hold)//第二次壓下開始作業(yè)計數(shù)
  111. {
  112. if(sw1==0&&re_push_lock==0)//再次按壓開關(guān)
  113. { sw_open_cont=0;//有再次按下開關(guān)則清零松開計數(shù)器
  114. re_push_cont++;
  115. if(re_push_cont>re_push)//再次按下時間限制,用于不能太快松開
  116. {key_cont++;re_push_lock=1;}
  117. }  
  118. else if(sw1==1&&re_push_lock==1){re_push_cont=0;re_push_lock=0;}

  119. else if(sw1==1)//標(biāo)記有按過按鍵再放開時間判定
  120. {
  121. //sw_open_cont++;            //在中TMR0中斷內(nèi)執(zhí)行提高計時穩(wěn)定
  122. if(sw_open_cont>re_time2)
  123. { push_hold=0;sw_open_cont=0;//超過指定時間標(biāo)記位
  124. push_one=0;sw_open_cont1=0;sec_push_flag=0;long_flag=0;
  125. }

  126. }

  127. }
  128. //---第二次及之后按壓計數(shù)完成--//
  129. }   
  130. //---短按處理完成 提取健值--//
  131. if(sw1==1&&push_one_flag==0&&push_hold==0)//確認(rèn)沒有按鍵動作時
  132. {
  133. if(key_cont>0&&read_one==0)
  134. {
  135. key_num=key_cont;//dis=key_cont;
  136. key_cont=0;
  137. read_one=1;
  138. }else if(read_one==1)read_one=0;
  139. }
  140. //短按之后沒有及時放開按鍵 當(dāng)?shù)竭_(dá)長按上限時當(dāng)作按鍵結(jié)束
  141. else if(sw1==0&&key_cont>0&&push_hold==1&&long_flag==1)
  142. {
  143. if(key_cont>0&&read_one==0)
  144. {
  145. key_num=key_cont;//dis=key_cont;
  146. key_cont=0;
  147. read_one=1;
  148. //不清除會導(dǎo)致第二次單按時觸發(fā)長按累計
  149. }else if(read_one==1){read_one=0;}long_flag=0;
  150. }
  151. ///

  152. }
  153. //////長短按鍵處理end///////

  154. void key_scan()
  155. {
  156. push_scan();
  157. se_flag=key_long_flag; key_long_flag=0; //設(shè)置鍵
  158. //if(key_num==1) {up_flag=1;key_num=0;}//加鍵
  159. //if(key_num==2) {dn_flag=1;key_num=0;}//減鍵
  160. //if(set_mode==0&&key_num==3) {thr_flag=1;key_num=0;}//按三次

  161. //----設(shè)置鍵-----//

  162. //---------------------//
  163. if(se_flag&&set_sw_flag==0)  //長按處理分別進(jìn)入時分﹑年﹑月日的校正
  164. {
  165. set_mode++;
  166. if(set_mode>7)set_mode=0;
  167. set_sw_flag=1;
  168. se_flag=0;
  169. } else if(se_flag==0&&set_sw_flag==1) set_sw_flag=0;
  170. //---------------------//
  171. }
復(fù)制代碼

以上圖文的Word格式文檔下載(內(nèi)容和本網(wǎng)頁上的一模一樣,方便大家保存):
多功能按鍵.doc (598 KB, 下載次數(shù): 30)

作者: GEECGYJ    時間: 2022-2-5 10:17
視頻沒法上傳!
作者: zenghl    時間: 2022-2-6 12:26
樓主開源精神敬佩,方便分享整個工程嗎?




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 五月婷婷影院 | 亚洲在线免费视频 | 久久人人爽| 天天看天天射 | 精品欧美日韩 | 欧美日韩久久久 | 成人夜色 | 一级片在线观看视频 | 久久久久久国产精品 | 久草视频网站 | 黄色1级片 | 日韩午夜在线观看 | www.五月婷婷| 久久精品久久久精品美女 | 中国免费毛片 | 久插视频 | av网站在线看 | 97国产在线观看 | 黄色一级大片在线免费看国产一 | 国产理论片在线观看 | 国产一级特黄 | 91午夜精品亚洲一区二区三区 | 日韩欧美一级片 | 欧美一级片在线观看 | 久久精品中文 | 亚洲成a人 | 精品少妇v888av | 精品无人国产偷自产在线 | 青草网 | 亚洲做受高潮无遮挡 | 免费黄色片视频 | 蜜桃精品一区二区三区 | 黄色片在线| 九九九色 | 亚洲涩涩涩 | 伊人成人在线 | a视频在线观看 | 一级免费毛片 | 日韩一级大片 | 日韩一区二区三区在线播放 | 亚洲欧美精品一区 |