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

立即注冊 登錄
返回首頁

uid:258624的個人空間

日志

基于狀態機的單片機按鍵短按長按功能的實現(來源網絡)

熱度 1已有 1379 次閱讀2018-8-12 13:23 |個人分類:按鍵

來源:http://m.elecfans.com/article/608499.html1、引言

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

2、狀態機

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

3、按鍵的狀態機實現

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

S0:等待按鍵按下

S1:按鍵按下

S2:等待按鍵短按釋放

S3:等待按鍵長按釋放

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

基于狀態機的單片機按鍵短按長按功能的實現

圖1:按鍵的狀態轉移圖

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

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

程序代碼如下:

#defineS00//狀態0

#defineS11//狀態1

#defineS22//狀態2

#defineS33//狀態3

voidkey()

{staticunsignedcharstate=S0,key_time;

unsignedcharkey;

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

switch(state)//檢測狀態

{caseS0://狀態0

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

caseS1://狀態1

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

else//否則,轉入狀態2,執行按鍵程序

{state=S2;

switch(key)

{case0xe0:/*按鍵1執行程序*/

break;

case0xd0:/*按鍵2執行程序*/break;

case0xb0:/*按鍵3執行程序*/break;

case0x70:/*按鍵4執行程序*/break;}}

break;

caseS2://狀態2

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

elseif(++key_time==100){key_

time=0;state=S3;}break;

//否則開始計時,計時結束轉入狀態3

caseS3://狀態3

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

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

{key_time=0;

switch(key){

case0xe0:break;

case0xd0:break;

case0xb0:break;

case0x70:break;}

}break;}}

4、中斷處理按鍵消抖

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

5、總結

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



路過

雞蛋

鮮花
1

握手

雷人

剛表態過的朋友 (1 人)

評論 (0 個評論)

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

Powered by 單片機教程網

返回頂部
主站蜘蛛池模板: 999国产视频 | 亚洲成人精 | 一级高清免费毛片 | 一区二区免费在线观看 | 自拍偷拍一区二区三区 | 亚洲欧美中文日韩在线 | 成人精品一区二区三区 | aaaa日韩| 黄色在线观看 | 曰韩三级 | 国产黄色网址在线观看 | 自拍偷拍第一页 | 亚洲一区二区三区视频 | 国产精品高 | 久久久高清 | 精品免费国产一区二区三区 | 国产丝袜人妖cd露出 | av香蕉 | 精品国模一区二区三区欧美 | 国产精品久久久久久久久久久久冷 | 影视先锋av资源噜噜 | 91久久爽久久爽爽久久片 | 久久久久国产精品一区二区 | 中文字幕在线一区二区三区 | 亚洲精品一区二区三区中文字幕 | 免费在线观看成年人视频 | jlzzjlzz国产精品久久 | 欧美激情精品久久久久久变态 | 国产男女视频 | 欧美一区二区三区四区视频 | 在线免费亚洲视频 | 九九九久久国产免费 | 欧美日韩国产免费 | 美女在线观看av | 国产成人精品一区二区三 | aaaaaaa片毛片免费观看 | 九九热热九九 | 一区二区三区影院 | 91毛片在线观看 | 9久久婷婷国产综合精品性色 | 中文字幕在线一区二区三区 |