欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 基于狀態(tài)機(jī)的按鍵掃描程序詳解 [打印本頁]

作者: Ameya360    時(shí)間: 2017-4-1 11:15
標(biāo)題: 基于狀態(tài)機(jī)的按鍵掃描程序詳解

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

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

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

//由于超出字?jǐn)?shù),具體程序請大家閱讀附件理解,抱歉。

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

2、中斷方式:這種按鍵掃描方式一般是利用外部中斷來實(shí)現(xiàn),因?yàn)橥獠恐袛嘁话憔哂猩仙赜|發(fā)中斷、下降沿觸發(fā)中斷、高電平觸發(fā)中斷、低電平觸發(fā)中斷等,當(dāng)按鍵沒有按下時(shí)為高電平,按下按鍵后,會(huì)有一個(gè)下降沿或者是低電平,外部中斷檢測到該信號(hào)后,進(jìn)入外部中斷處理程序,從而實(shí)現(xiàn)按鍵掃描。這種方式一般利用在一些需要低功耗應(yīng)用的場合,當(dāng)MCU進(jìn)入低功耗模式時(shí),需要一個(gè)外部中斷來喚醒MCU,進(jìn)入運(yùn)行模式,這時(shí)我們可以利用一個(gè)外部中斷來喚醒MCU,并且通過外部中斷來檢測掃描按鍵是否按下,實(shí)現(xiàn)特定的功能。外部中斷掃描方式的主要優(yōu)點(diǎn)是,平時(shí)不需要MCU的參與,也就不消耗MCU的運(yùn)行時(shí)間,只有當(dāng)檢測到外部中斷時(shí),才處理按鍵事件;缺點(diǎn)是一般MCU的外部中斷口不多,而外部中斷一般是用來處理一些比較緊急的功能,比如過零檢測等功能的。因此,外部中斷掃描方式也不是最常用的按鍵掃描方法。

3、ADC檢測按鍵:這種方法一般是使用在具有ADC功能的單片機(jī)上,當(dāng)IO口不足時(shí),可以使用一個(gè)AD口來檢測按鍵,每個(gè)按鍵按下時(shí),AD采集到的數(shù)據(jù)不一樣,從而來實(shí)現(xiàn)按鍵的檢測。

4、定時(shí)器定時(shí)掃描方式:這種方法和方法1有點(diǎn)類似,只是不會(huì)像方法1那樣死等在那里消耗MCU運(yùn)行時(shí)間,而是通過定時(shí)器掃描來實(shí)現(xiàn)。首先,MCU檢測到按鍵后,定時(shí)器定時(shí),達(dá)到一定時(shí)間后,繼續(xù)掃描按鍵是否按下,然后計(jì)時(shí)按鍵按下的時(shí)間,當(dāng)20ms以后按鍵還是按下狀態(tài),則執(zhí)行按鍵操作,反之則認(rèn)為是抖動(dòng)。下面是我利用狀態(tài)機(jī)實(shí)現(xiàn)的一個(gè)按鍵掃描程序,先貼出源代碼再講解實(shí)現(xiàn)過程。

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

//main函數(shù)如下:

void main(void)

{

//系統(tǒng)初始化

SystemInit();

while(1)

{

if(SystemFlag.fTimer_5ms)//a

{

SystemFlag.fTimer_5ms = 0;//b

process_key();//c

}

}

}

注解:

a、查詢5ms標(biāo)志是否為真,這個(gè)標(biāo)志是在定時(shí)器中斷里面置位的,5ms定時(shí)到,就置位該標(biāo)志。

b、清楚5ms到標(biāo)志;

c、調(diào)用按鍵掃描函數(shù),這樣按鍵掃描函數(shù)是5ms執(zhí)行一次。

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

以上程序?qū)崿F(xiàn)的功能是,短按K1,LED1亮,LED2滅;短按K2,LED1滅,LED2亮;長按K1兩秒,LED1翻轉(zhuǎn);長按K2兩秒,LED2翻轉(zhuǎn);K1和K2同時(shí)按下2秒,LED1和LED2都翻轉(zhuǎn)。附件使用的是瑞薩R5F100FC單片機(jī)編程實(shí)現(xiàn)的,大家可以移植到任何平臺(tái)。

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

如果你是個(gè)單片機(jī)初學(xué)者,或者是還在使用死循環(huán)掃描按鍵的程序員,那么請趕緊拋棄死循環(huán)吧,盡量用定時(shí)器中斷來實(shí)現(xiàn)一個(gè)簡單的前后臺(tái)系統(tǒng)。


作者: mcumcu    時(shí)間: 2017-4-7 16:52
曾見過和本文一樣的博客貼,樓主把附件一起發(fā)上來?
作者: xtayygtv    時(shí)間: 2017-4-7 20:30
哥們,附件呢
作者: tt98    時(shí)間: 2018-4-8 20:28
看來樓主發(fā)貼后沒來過了,附件呢?
作者: wdliming    時(shí)間: 2018-7-25 18:18
不錯(cuò)的想法
作者: a89588038    時(shí)間: 2019-9-25 09:49
附件呢,快發(fā)出來




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1