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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4504|回復: 2
打印 上一主題 下一主題
收起左側

PIC單片機單個按鍵實現多功能:長按、短按次數識別程序

[復制鏈接]
跳轉到指定樓層
樓主
春節放假沒有回老家,于是寫了個多功能按鍵識別小程序!
按鍵分為長按識別(長按3秒),短按識別(記錄識別當前按的次數),以節約單片I/O

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


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

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

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

  10. //--------------//
  11. #define  sw1 RA4   //
  12. #define  long_time  200  //長按按鍵時間預設 約2秒
  13. #define  re_time1   46   //第一次按下開關等待第二次按下開關的時長
  14. #define  re_push    0    //第二次及之后的按住開關的時長 為零時雙擊效率增加
  15. #define  re_time2   55   //第二次及之后等待再次按下開關的時長
  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();    //對應按次處理

  42. /*
  43. ////以下這段長短按鍵識別計數器 復制到TMR0中斷內執行效率更高////////////
  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) //第一次按下開關等待第二次按下開關的時長
  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++;//第二次及之后等待再次按下開關的時長
  60. }

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


  65. ///////////////////
  66. //----------------------------//
  67. //單按鍵長、短按識別
  68. //長按輸出結果: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中斷內執行提高計時穩定
  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;}//第一次壓下開關檢測 并清除舊的key_num
  88. else if(push_one_flag==1&&sw1==1){push_one_flag=0;push_one=1;}//當第一次壓下放開后置位壓一次標志避免與長按沖突
  89. //---第一次按下后再放開按鍵完成--//

  90. //---當檢測到第一次壓下并放開后--//
  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;//有第二次壓下時將上次的按鍵次數 先清零 導入開關后應關閉
  97. push_hold=1;                //有第二次壓下開關時置位開關按過的標志,
  98. sec_push_flag=1;
  99. }

  100. else if(sw1==1&&push_hold==0) //若無第二次按開關 清零按過標志
  101. {//sw_open_cont1++;         //在中TMR0中斷內執行提高計時穩定   
  102. if(sw_open_cont1>re_time1)//超過指定間隔時間未按開關
  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. //---第二次及之后按壓計數處理--//
  110. if(push_hold)//第二次壓下開始作業計數
  111. {
  112. if(sw1==0&&re_push_lock==0)//再次按壓開關
  113. { sw_open_cont=0;//有再次按下開關則清零松開計數器
  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)//標記有按過按鍵再放開時間判定
  120. {
  121. //sw_open_cont++;            //在中TMR0中斷內執行提高計時穩定
  122. if(sw_open_cont>re_time2)
  123. { push_hold=0;sw_open_cont=0;//超過指定時間標記位
  124. push_one=0;sw_open_cont1=0;sec_push_flag=0;long_flag=0;
  125. }

  126. }

  127. }
  128. //---第二次及之后按壓計數完成--//
  129. }   
  130. //---短按處理完成 提取健值--//
  131. if(sw1==1&&push_one_flag==0&&push_hold==0)//確認沒有按鍵動作時
  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. //短按之后沒有及時放開按鍵 當到達長按上限時當作按鍵結束
  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. //不清除會導致第二次單按時觸發長按累計
  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; //設置鍵
  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. //----設置鍵-----//

  162. //---------------------//
  163. if(se_flag&&set_sw_flag==0)  //長按處理分別進入時分﹑年﹑月日的校正
  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. }
復制代碼

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

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:297903 發表于 2022-2-5 10:17 | 只看該作者
視頻沒法上傳!
回復

使用道具 舉報

板凳
ID:46750 發表于 2022-2-6 12:26 | 只看該作者
樓主開源精神敬佩,方便分享整個工程嗎?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美中文字幕在线观看 | 欧美精品乱码久久久久久按摩 | 日本电影韩国电影免费观看 | 羞羞网站在线观看 | 五月免费视频 | 久久91av | 免费视频二区 | 日韩欧美中文 | 成人在线观看黄 | 日韩视频免费 | 亚洲精品国产a久久久久久 中文字幕一区二区三区四区五区 | 国产精品1 | 日韩精品 电影一区 亚洲 | 久久久久久久久久久丰满 | 久久精品视频网站 | 91麻豆久久久 | 国产精品99久久久久久动医院 | 国产99久久久久 | 91视频网 | 久久成人免费视频 | 日韩欧美专区 | 国产精品欧美一区二区三区不卡 | 91免费看片 | 久久久久久91香蕉国产 | 色吧综合| 精品一区二区久久久久久久网站 | 97精品国产97久久久久久免费 | 日韩三级在线观看 | 成人片免费看 | 日韩三级在线 | 亚洲国产欧美国产综合一区 | 午夜精品在线观看 | 色啪网| 天天操 夜夜操 | 伊人久久综合 | 日韩欧美在线观看 | 亚洲精品电影 | 色综合激情 | 国产精品99久久久久久宅男 | 国产精品国产成人国产三级 | 欧美黄色网络 |