999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

按鍵的多種狀態檢測及消抖處理方法

2013-07-09 10:55:08陳曉麗
家電科技 2013年4期
關鍵詞:單片機檢測方法

陳曉麗

(珠海格力電器股份有限公司 廣東珠海 519070)

1 引言

在單片機控制系統中,按鍵是最常用的輸入設備,是人-機接口中非常重要的組成部分,家用電器或其它消費性電子產品中就經常使用按鍵來實現功能控制或選擇、配置信息參數等。隨著產品功能越來越豐富,按鍵的作用越來越多樣化,同一個按鍵被賦予了多種功能(即一鍵多功能),比如:短按一個按鍵是功能模式切換,而長按這一個按鍵又可以是關機的功能,這使得按鍵的檢測和處理更加復雜,也更加重要。本文講述了一種按鍵的多種狀態判斷方法和相應的按鍵消抖處理方法。

2 按鍵檢測

按鍵都是以開關狀態來輸入數據的。根據硬件電路上對按鍵檢測的不同來區分,可以將按鍵檢測電路分為兩種類型,一類是I/O掃描式按鍵電路,另一類是AD采樣式按鍵電路。這兩種電路在按鍵檢測原理上存在區別,I/O掃描式按鍵檢測是根據I/O的高低電平來判斷是否有鍵按下,而AD采樣式按鍵檢測是根據I/O的AD采樣值范圍來判斷是否有鍵按下。雖然兩類按鍵的檢測方法不同,但是按鍵的處理方法是一樣的,包括狀態判斷處理和消抖處理。

3 按鍵的多種狀態判斷

3.1 按鍵的狀態

為了實現一個按鍵有多種功能,可以根據操作按鍵的不同狀態來進行處理,這就需要判斷出按鍵的各種狀態。按鍵的狀態有多種類型,包括短按、長按、連按、短按釋放、長按釋放等。

3.2 按鍵的多種狀態判斷方法

這里介紹一種程序上判斷按鍵多種狀態的方法。

程序代碼如下:

#define NO_KEY 0xFF //按鍵沒有按下

#define TASK_KEY_LONG 0x20//按鍵長按

#define TASK_KEY_HOLD 0x40//按鍵連按

#define TASK_KEY_SHORT_UP 0x80//按鍵短按后釋放

#define TASK_KEY_LONG_UP 0x60//按鍵長按后釋放

#define KEY_SCAN_TIMES 3 //短按鍵的次數

#define KEY_LONG_TIMES 150 //長按鍵的次數

#define KEY_HOLD_TIMES 35 //連按鍵的次數

void KeyScan(void)

{

static unsigned char keyCounter; //用于區分短按、長按、連按等

static unsigned char keyValue; //按鍵穩定狀態值

unsigned char keyTmp; //當前按鍵狀態

unsigned char key_return = NO_KEY;

static bool long_key; //按鍵長按標志

keyTmp = KeyDetect(); //獲取當前的按鍵

狀態,keyTmp的每一位對應一個按鍵狀態,0表

示按鍵按下

if (keyTmp == NO_KEY) //釋放按鍵或者

按鍵沒有按下

{

if (long_key == 1)

{

key_return = keyValue | TASK_KEY_

LONG_UP; //長按后釋放按鍵

}

else if ((keyCounter < KEY_LONG_

TIMES ) && (keyCounter > KEY_SCAN_

TIMES))

{

key_return = keyValue | TASK_KEY_

SHORT_UP; //短按后釋放按鍵

}

keyValue = NO_KEY;

long_key = 0;

keyCounter = 0;

}

else if ((keyTmp != keyValue))

{

keyValue = keyTmp;

keyCounter = 0;

long_key = 0;

}

else

{

keyCounter++;

if (keyCounter == KEY_SCAN_TIMES)

{

key_return = keyValue; //短按

}

else if (keyCounter == KEY_LONG_

TIMES )

{

if (long_key == FALSE)

{

long_key = TRUE;

key_return = keyValue | TASK_KEY_LONG; //長按

}

}

else if (keyCounter == (KEY_LONG_TIMES + KEY_HOLD_TIMES) )

{

key_return = keyValue | TASK_KEY_HOLD; //連按

keyCounter = KEY_LONG_TIMES;

}

}

if ( key_return != NO_KEY)

{

PutMsg(key_return); //產生有按鍵的消息

}

}

函數KeyScan()的原理:在定時器的5ms中斷處理中調用這個函數,通過按鍵掃描函數KeyDetect()獲取按鍵狀態keyTmp,它的每一位對應一個按鍵狀態,0表示按鍵按下,1表示按鍵沒有按下。當keyTmp為0xFF時,表示沒有任何按鍵按下;keyCounter用于累計按鍵按下的時間,短按時間為3×5ms=15ms,也就是說當檢測按鍵按下的時間超過15ms,就會發出一個短按的消息。同理,長按時間為150×5ms=750ms,連按消息是在長按后35×5=175ms后發出的,如果按鍵一直按著,就會每過175ms發出一個連按消息了;而短按釋放的消息就要求按鍵短按和按鍵釋放兩個條件都先后滿足,長按釋放的消息也如此。當有按鍵按下時,這個函數會產生一個按鍵消息key_return,它是按鍵類型keyValue同按鍵狀態(包括短按、長按、連按、短按釋放、長按釋放)進行或運算的結果。這樣處理的優點:不管有多少個按鍵,每個按鍵都可以產生出這5類狀態的消息,按鍵數量有增加或刪減時,都不用更改代碼,方便維護。

4 按鍵消抖處理

4.1 按鍵抖動

常用的按鍵為機械彈性按鍵,也稱輕觸開關。機械按鍵由于觸點的彈性及電壓突跳等原因,在觸點閉合和斷開的瞬間會出現抖動。一個按鍵在閉合時不會馬上穩定地接通,同樣,在斷開時也不會一下子斷開,在閉合和斷開的瞬間均伴隨有一連串的抖動,如圖1所示。

抖動時間的長短由按鍵的機械特性來決定,一般為5~10ms。這種抖動對人來說是感覺不到的,但對單片機來說,則是完全可以感知的,因為單片機的處理速度在微秒級。按鍵穩定閉合時間的長短則由操作人員的按鍵動作決定的,一般為幾百個毫秒至數秒。如果不對按鍵消除抖動則會引起程序處理的誤操作。為了避免這種抖動現象,需進行按鍵消抖處理。

4.2 按鍵消抖處理方法

按鍵消抖有“硬件消抖”和“軟件消抖”兩種方式。簡單的硬件消抖是在按鍵接入單片機的引腳位置并入一個小電容,利用電容的充放電原理來實現消除因抖動所產生的毛刺。簡單的軟件消抖就是用加固定軟件延時的方法來去除抖動,具體方法就是在有按鍵按下時,利用軟件延時一段時間后再次檢測按鍵是否按下,實際上是避開了按鍵按下時的抖動時間。

這種硬件上并電容或軟件上延時的處理方式比較簡單,而且確實也起到了一定的消抖作用。但是在實際的生產使用過程中,按鍵千差萬別,不同廠家的物料也參差不齊,各種按鍵操作時產生的抖動時間不會是一致的。這樣就會出現一些問題了,電容過小或延時過短,可能會有按鍵誤動作的問題;而電容過大或延時過長,會有按鍵操作后反應遲鈍的問題。下面介紹一種新的消抖處理方法,抖動時間的長或短,對按鍵的操作效果沒有任何影響。

程序代碼如下:

#define KEY_SHAKE_TIMES 8 //按鍵防抖的掃描次數

static unsigned char Count; //用于累計按鍵狀態穩定的次數

static unsigned char keyStatus; //前次按鍵狀態

if(keyTmp != keyStatus) //當前按鍵狀態是否與前次按鍵狀態相同

{

keyStatus = keyTmp;

Count = 0;

return;

}

else

{

if (Count < 8)

{

Count++;

return;

}

}

只要在前面介紹的函數KeyScan()中獲取keyTmp值后增加這段代碼就可以了。它的原理:每次掃描中都將當前按鍵狀態keyTmp與前次按鍵狀態keyStatus進行比較,如果比較的兩次狀態不同,表示按鍵處于抖動中,會將用于累計按鍵狀態穩定次數的變量Count清零,只有當連續8次比較的狀態都相同時,才認為狀態穩定了,即沒有抖動了。這包括了按鍵按下時的抖動處理和按鍵釋放的抖動處理。其中Count設為8次,每5ms調用一次,這就是40ms,它的設定,與抖動時間長短無關,只要大于抖動周期就可以了。這種處理方法的優點在于:它與抖動過程的時間長短無關,而且處理代碼簡單,不用區分按下抖動或釋放抖動。

5 總結

本文介紹的這種單片機按鍵狀態檢測和消抖處理方法,與一般的按鍵檢測方法相比,能檢測更多類型的的按鍵狀態,按鍵數量有增加或刪減時,也不用更改代碼,適用范圍廣,且代碼簡單,方便維護。采用的按鍵消抖方法也有很大的改進,與抖動過程的時間長短無關,不用區分按下抖動或釋放抖動。

[1]譚浩強 C程序設計 清華大學出版社

[2]劉天時,劉賞,付春 一種單片機鍵盤電路設計與消抖處理 計算機與網絡2012年 第10期

[3]李運兵 微控制器中按鍵處理技巧及應用 計算機應用系統 2010年第2期

猜你喜歡
單片機檢測方法
“不等式”檢測題
“一元一次不等式”檢測題
“一元一次不等式組”檢測題
基于單片機的SPWM控制逆變器的設計與實現
電子制作(2019年13期)2020-01-14 03:15:28
基于單片機的層次漸變暖燈的研究
電子制作(2019年15期)2019-08-27 01:12:10
基于單片機的便捷式LCF測量儀
電子制作(2019年9期)2019-05-30 09:42:02
小波變換在PCB缺陷檢測中的應用
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
捕魚
主站蜘蛛池模板: 欧美成人看片一区二区三区| 欧美午夜视频在线| 67194成是人免费无码| 国模在线视频一区二区三区| 中文成人无码国产亚洲| 欧美激情第一区| 国产成人欧美| 2019国产在线| 园内精品自拍视频在线播放| 久久香蕉国产线看精品| 国产经典免费播放视频| 日韩在线永久免费播放| 久久福利片| 欧美成人精品在线| 国产成人精品在线| 国产亚洲精久久久久久久91| 激情六月丁香婷婷四房播| 91系列在线观看| 久久精品人人做人人爽电影蜜月 | 国产精品爽爽va在线无码观看| 爆乳熟妇一区二区三区| 日韩成人免费网站| 精品视频一区在线观看| 毛片最新网址| 国产日韩欧美中文| 日韩123欧美字幕| 伊人网址在线| 亚洲男人天堂网址| 伊人AV天堂| 亚洲国产天堂久久综合226114| 2021国产v亚洲v天堂无码| 亚洲天堂2014| 国产精鲁鲁网在线视频| 丁香婷婷在线视频| 色综合久久久久8天国| 国产aⅴ无码专区亚洲av综合网| 伊人激情久久综合中文字幕| 无码人中文字幕| 91精品视频在线播放| 在线观看视频一区二区| 亚洲男人天堂久久| 一本久道久综合久久鬼色| 亚洲中文字幕日产无码2021| 欧美黑人欧美精品刺激| 四虎永久在线| 尤物在线观看乱码| 5555国产在线观看| 久久人与动人物A级毛片| 国产欧美在线观看一区| 性色在线视频精品| 日韩亚洲高清一区二区| 精品福利视频网| 99草精品视频| 成人韩免费网站| 色婷婷国产精品视频| 97成人在线视频| 亚洲成a人片77777在线播放| 国产三级精品三级在线观看| 国产91线观看| a网站在线观看| 毛片基地视频| 香蕉综合在线视频91| 亚洲精品国产成人7777| 中文字幕人成人乱码亚洲电影| 国产亚洲精品91| 中文无码伦av中文字幕| 日本欧美午夜| 亚洲视频在线观看免费视频| 国产自产视频一区二区三区| 一区二区影院| 六月婷婷激情综合| 国产成人8x视频一区二区| 91福利片| 亚洲成人精品| 亚洲第一国产综合| 成人a免费α片在线视频网站| 91成人免费观看| 国产一在线观看| 色视频久久| 香蕉久久永久视频| 国产区成人精品视频| 国产精品亚欧美一区二区|