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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于狀態機的按鍵掃描程序詳解

[復制鏈接]
跳轉到指定樓層
樓主
ID:164783 發表于 2017-4-1 11:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

所謂人機交互,無外乎是利用微控制器檢測用戶的輸入指令,以及將設備的狀態信息通過顯示器顯示出來,微控制器通過檢測用戶輸入的指令,來及時響應用戶的操作;用戶則通過LCD等顯示設備顯示出來的信息,來實時的了解設備的運行狀況。因此,一套優秀的人機接口,對一個嵌入式設備來說是多么的重要。有了人機接口,那么嵌入式的所有功能,都可以慢慢實現了。下面就有我來給大家講講人機交互里面最簡單的輸入設備,按鍵的掃描實現方法吧。

按鍵的掃描方式主要有下面幾種:

1、死循環掃描方式:這種掃描方式,一般出現在大量的單片機教程及51開發板的配套例程里面,因此一般單片機初學者多是用這種掃描方式,因為這種掃描方式簡單直接,也比較好理解。假定按鍵端口為PIN_KEY1,延時函數為delay_ms(unsined int ms),則死循環掃描方式的實現方式如下:

//由于超出字數,具體程序請大家閱讀附件理解,抱歉。

以上就是死循環掃描方式的按鍵掃描實現方法,是最簡單的方法,這種方法最大的缺點就是占用CPU時間過長。當實現的功能比較簡單,例如只控制一個LED燈的亮滅,感覺不出這種方法的缺點。但是當功能比較多的時候,就會造成系統比較卡頓的現象,使系統運行不流暢,造成的原因就是delay_ms(20),因為在延時的20ms里面,CPU完全是死等在那里,不去處理其他任何功能,只有當按鍵松開后,才會去處理其他功能,如果到處都充滿了這種死循環,那么就會有很多功能得不到及時的響應,而造成系統卡頓。

2、中斷方式:這種按鍵掃描方式一般是利用外部中斷來實現,因為外部中斷一般具有上升沿觸發中斷、下降沿觸發中斷、高電平觸發中斷、低電平觸發中斷等,當按鍵沒有按下時為高電平,按下按鍵后,會有一個下降沿或者是低電平,外部中斷檢測到該信號后,進入外部中斷處理程序,從而實現按鍵掃描。這種方式一般利用在一些需要低功耗應用的場合,當MCU進入低功耗模式時,需要一個外部中斷來喚醒MCU,進入運行模式,這時我們可以利用一個外部中斷來喚醒MCU,并且通過外部中斷來檢測掃描按鍵是否按下,實現特定的功能。外部中斷掃描方式的主要優點是,平時不需要MCU的參與,也就不消耗MCU的運行時間,只有當檢測到外部中斷時,才處理按鍵事件;缺點是一般MCU的外部中斷口不多,而外部中斷一般是用來處理一些比較緊急的功能,比如過零檢測等功能的。因此,外部中斷掃描方式也不是最常用的按鍵掃描方法。

3、ADC檢測按鍵:這種方法一般是使用在具有ADC功能的單片機上,當IO口不足時,可以使用一個AD口來檢測按鍵,每個按鍵按下時,AD采集到的數據不一樣,從而來實現按鍵的檢測。

4、定時器定時掃描方式:這種方法和方法1有點類似,只是不會像方法1那樣死等在那里消耗MCU運行時間,而是通過定時器掃描來實現。首先,MCU檢測到按鍵后,定時器定時,達到一定時間后,繼續掃描按鍵是否按下,然后計時按鍵按下的時間,當20ms以后按鍵還是按下狀態,則執行按鍵操作,反之則認為是抖動。下面是我利用狀態機實現的一個按鍵掃描程序,先貼出源代碼再講解實現過程。

//由于貼源代碼超出字數,此處程序請大家看附件資料理解,抱歉,大家可以安裝Source Insight 3閱讀,里面已經附件里面已經建好了工程。

//main函數如下:

void main(void)

{

//系統初始化

SystemInit();

while(1)

{

if(SystemFlag.fTimer_5ms)//a

{

SystemFlag.fTimer_5ms = 0;//b

process_key();//c

}

}

}

注解:

a、查詢5ms標志是否為真,這個標志是在定時器中斷里面置位的,5ms定時到,就置位該標志。

b、清楚5ms到標志;

c、調用按鍵掃描函數,這樣按鍵掃描函數是5ms執行一次。

process_key()函數里面的具體的按鍵功能執行函數請查看附件,里面注釋的很清楚了。

以上程序實現的功能是,短按K1,LED1亮,LED2滅;短按K2,LED1滅,LED2亮;長按K1兩秒,LED1翻轉;長按K2兩秒,LED2翻轉;K1和K2同時按下2秒,LED1和LED2都翻轉。附件使用的是瑞薩R5F100FC單片機編程實現的,大家可以移植到任何平臺。

我想經過了上面的講解,大家對按鍵的幾種掃描實現方式都有了一個足夠的認識了,大家也可以看出狀態機編程應用比較實用。將一個功能,分解成多個不同的狀態,每個狀態處理一個步驟,簡單易懂,而且也更加容易實現。

如果你是個單片機初學者,或者是還在使用死循環掃描按鍵的程序員,那么請趕緊拋棄死循環吧,盡量用定時器中斷來實現一個簡單的前后臺系統。

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

使用道具 舉報

沙發
ID:140848 發表于 2017-4-7 16:52 | 只看該作者
曾見過和本文一樣的博客貼,樓主把附件一起發上來?
回復

使用道具 舉報

板凳
ID:187208 發表于 2017-4-7 20:30 | 只看該作者
哥們,附件呢
回復

使用道具 舉報

地板
ID:88606 發表于 2018-4-8 20:28 | 只看該作者
看來樓主發貼后沒來過了,附件呢?
回復

使用道具 舉報

5#
ID:20672 發表于 2018-7-25 18:18 | 只看該作者
不錯的想法
回復

使用道具 舉報

6#
ID:370231 發表于 2019-9-25 09:49 | 只看該作者
附件呢,快發出來
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲视频中文字幕 | 91九色麻豆 | 中文字幕精 | 成人永久免费 | 中文字幕视频在线观看 | 日韩成人免费 | 亚洲一区中文字幕在线观看 | 日韩第一区 | 欧美日韩精品免费 | 久久综合成人精品亚洲另类欧美 | 黄色一级大片在线观看 | 成人免费网视频 | 国产免费一区二区 | 亚洲精品女人久久久 | 中国人pornoxxx麻豆 | 欧美精品在线播放 | 四虎成人免费电影 | 中文精品久久 | 久久久精品影院 | 国产亚洲一区二区三区 | 性色视频 | 人人玩人人添人人澡欧美 | 国产精品亚洲一区二区三区在线 | 成人免费网站在线 | 国产精品一区二区三区四区 | 九九热精品在线 | 久久久久国产精品午夜一区 | 国产精品日韩在线 | 欧美日韩综合视频 | 欧美成人免费在线视频 | 日日摸天天添天天添破 | cao视频 | 日韩在线精品视频 | a级片在线| 91精品久久久久久久久中文字幕 | 国产一区二区成人 | 免费一级片 | 成人伊人 | 国产精品黄 | 天天人人精品 | 精品久久久久久 |