• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于狀態(tài)機的單片機按鍵短按長按功能的實現(xiàn)

      2018-01-17 10:43:40吳允強吳由松
      電子技術(shù)與軟件工程 2017年23期
      關(guān)鍵詞:狀態(tài)機按鍵

      吳允強++吳由松

      摘 要 本文介紹了一種基于狀態(tài)機的單片機按鍵的實現(xiàn),通過狀態(tài)機實現(xiàn)按鍵的短按與長按的功能,同時改進按鍵消抖的方法,使單片機在節(jié)約CPU的資源的同時實現(xiàn)按鍵的各種狀態(tài)的檢測,提高單片機的工作效率,整個設計代碼簡潔,方便維護。

      【關(guān)鍵詞】狀態(tài)機 按鍵 長按

      1 引言

      在自己在科研實踐和對學生教學中發(fā)現(xiàn),現(xiàn)在單片機學習中對于按鍵處理的方法都是:檢測按鍵、延時消抖、按鍵執(zhí)行、等待釋放,整個按鍵處理的程序中大量出現(xiàn)“delay_1ms(5);”和“while(!key);”這樣的語句,這明顯是在給自己找麻煩,延時消抖與等待釋放需要消耗CPU運行時間,執(zhí)行效率低下,而且這種方法處理的按鍵程序也實現(xiàn)不了按鍵的短按、長按等靈活的按鍵操作方式。本文講述了一種用狀態(tài)機實現(xiàn)按鍵掃描的方法,達到按鍵的短按和長按功能,高效的處理按鍵消抖問題。

      2 狀態(tài)機

      狀態(tài)機在軟件編程中非常重要,一個思路清晰而且高效的程序,必然有狀態(tài)機的身影浮現(xiàn)。比如在按鍵命令解析程序中,本來是在狀態(tài)1中,觸發(fā)一個按鍵后切換到狀態(tài)2,再觸發(fā)另一個按鍵切換到狀態(tài)3,或者返回到狀態(tài)1。按鍵的擊鍵過程也是一種狀態(tài)的切換,也可以看著是一個狀態(tài)機,一個按鍵的擊鍵過程包括:按下、抖動、閉合、抖動和釋放等狀態(tài)。我們只要把這些狀態(tài)機的思想想辦法用程序表示出來就可以了。

      3 按鍵的狀態(tài)機實現(xiàn)

      我們這里用狀態(tài)機是為解決問題的,那么我們就要從問題本身去思考。為了實現(xiàn)按鍵掃描,達到按鍵短按和長按的功能,可以根據(jù)一個按鍵從按下按鍵到釋放按鍵的整個過程將按鍵分為4個狀態(tài):

      S0:等待按鍵按下

      S1:按鍵按下

      S2:等待按鍵短按釋放

      S3:等待按鍵長按釋放

      假設按鍵按下為低電平“0”,按鍵未按下為高電平“1”,按鍵的整個過程我們就可以通過狀態(tài)轉(zhuǎn)移圖表示出來,如圖1所示。

      首先,按鍵的初始狀態(tài)為S0,當檢測到輸入為1時,表示按鍵沒有按下,保持S0;當輸入為0時,表示按鍵按下,狀態(tài)轉(zhuǎn)入S1。在S1狀態(tài)中,檢測輸入信號是否為0,如果為0,執(zhí)行按鍵程序轉(zhuǎn)入S2;如果為1,表示之前的按鍵操作是干擾信號,回到S0。在S2狀態(tài)中,如果輸入信號是1,則回到S0,表示按鍵短按已經(jīng)釋放;如果按鍵沒有釋放,輸入為0時,就開始計時,計時沒有結(jié)束前一直在S2,當計時結(jié)束了,轉(zhuǎn)入S3,表示按鍵一直按著,為長按功能,在S2計時過程中,輸入從0變?yōu)?也會回到S0。在S3狀態(tài)中,輸入信號為1,返回S0,表示按鍵長按釋放;輸入信號為0,執(zhí)行相應的按鍵程序,也可以計時,等計時結(jié)束執(zhí)行按鍵程序,達到按鍵連擊的功能。這就是采用狀態(tài)機進行按鍵檢測達到短按與長按的整個過程。

      下面以四個按鍵接在P1的P1.7、P1.6、P1.5、P1.4,設計狀態(tài)機按鍵掃描程序。

      程序代碼如下:

      #define S0 0 //狀態(tài)0

      #define S1 1 //狀態(tài)1

      #define S2 2 //狀態(tài)2

      #define S3 3 //狀態(tài)3

      void key()

      {static unsigned char state=S0,key_time;

      unsigned char key;

      key=P1&0xf0; //屏蔽P1低四位

      switch (state) //檢測狀態(tài)

      {case S0://狀態(tài)0

      if(key!=0xf0)state=S1;break; //判斷輸入是否為0,為0轉(zhuǎn)入狀態(tài)1

      case S1://狀態(tài)1

      if(key==0xf0)state=S0; //判斷輸入是否為1,為1返回狀態(tài)0

      else //否則,轉(zhuǎn)入狀態(tài)2,執(zhí)行按鍵程序

      {state=S2;

      switch (key)

      {case 0xe0:/*按鍵1執(zhí)行程序*/break;

      case 0xd0:/*按鍵2執(zhí)行程序*/break;

      case 0xb0:/*按鍵3執(zhí)行程序*/break;

      case 0x70:/*按鍵4執(zhí)行程序*/break;}} break;

      case S2://狀態(tài)2

      if(key==0xf0)state=S0;//判斷輸入是否為1,為1返回狀態(tài)0

      else if(++key_time==100){key_time=0;state=S3;}break;

      //否則開始計時,計時結(jié)束轉(zhuǎn)入狀態(tài)3

      case S3://狀態(tài)3

      if(key==0xf0)state=S0;//判斷輸入是否為1,為1返回狀態(tài)0

      else if(++key_time==5)//否則開始計時,計時結(jié)束按鍵連擊

      {key_time=0;

      switch (key){

      case 0xe0:break;

      case 0xd0:break;

      case 0xb0:break;

      case 0x70:break;}

      }break;}}

      4 中斷處理按鍵消抖

      通常使用的按鍵都是機械彈性按鍵,也就是輕觸開關(guān)。機械按鍵在觸點的閉合和斷開的過程中會產(chǎn)生抖動,一個按鍵在按下時不會立刻穩(wěn)定的導通,在釋放時也一樣,不會一下子就斷開,在按下和釋放瞬間都會有一連串的抖動現(xiàn)象。按鍵的抖動時間有按鍵的機械特性決定,一般情況為5ms~10ms。這種抖動人是感覺不出來的,但是單片機的運行速度是微秒級的,這里可以設計一個定時中斷來檢測按鍵的狀態(tài),通過定時中斷來消除按鍵抖動問題。因此可以把定時器的時間設置為10ms,每隔10ms進入一次中斷檢測一次按鍵的狀態(tài)。

      5 總結(jié)

      本文介紹的這種以狀態(tài)機來實現(xiàn)按鍵檢測的方法,與一般的按鍵檢測方法相對比,能完成案件的多種狀態(tài)的檢測,實現(xiàn)按鍵的短按和長按功能。采用狀態(tài)機編寫的按鍵程序也大大的改進了按鍵消抖對CPU運行時間消耗的問題。程序代碼簡單,維護方便,適用范圍廣。

      參考文獻

      [1]黃小華.單片機中的按鍵處理方法[J].電子科技,2014(19):1.

      [2]陳曉麗.按鍵的多種狀態(tài)檢測及消抖處理方法[J].家電科技,2013(04):68-70.

      作者單位

      南昌理工學院 江西省南昌市 330044endprint

      猜你喜歡
      狀態(tài)機按鍵
      基于有限狀態(tài)機的按鍵檢測程序設計
      電子制作(2021年3期)2021-06-16 03:14:26
      基于有限狀態(tài)機的交會對接飛行任務規(guī)劃方法
      按鍵消抖在單片機和FPGA實驗教學中的應用
      一種多方向?qū)Ч獍存I結(jié)構(gòu)設計
      電子制作(2016年1期)2016-11-07 08:43:05
      基于狀態(tài)機比對的狀態(tài)機推斷方案
      江蘇通信(2015年5期)2015-03-16 01:16:51
      雙口RAM讀寫正確性自動測試的有限狀態(tài)機控制器設計方法
      基于有限狀態(tài)機的STM32系統(tǒng)按鍵識別方法
      按鍵的多種狀態(tài)檢測及消抖處理方法
      家電科技(2013年4期)2013-07-09 10:55:08
      解析某型號手機按鍵檢測程序的缺陷
      FPGA設計中狀態(tài)機安全性研究
      黑龍江科學(2011年2期)2011-03-14 00:39:36
      越西县| 邓州市| 青海省| 周口市| 沅江市| 岑溪市| 浠水县| 遂川县| 行唐县| 平武县| 林甸县| 永德县| 昔阳县| 淮滨县| 阿瓦提县| 大渡口区| 库尔勒市| 扬州市| 莫力| 获嘉县| 平利县| 赤水市| 盐边县| 临安市| 剑阁县| 岳普湖县| 衡阳市| 兰溪市| 元朗区| 咸宁市| 绥江县| 海伦市| 班戈县| 临武县| 壤塘县| 光山县| 永善县| 略阳县| 锡林浩特市| 伊吾县| 苏尼特左旗|