標(biāo)題: 分享一下十幾年我一直使用的按鍵處理方法 [打印本頁(yè)]

作者: 中科網(wǎng)    時(shí)間: 2013-11-4 15:33
標(biāo)題: 分享一下十幾年我一直使用的按鍵處理方法
分享一下十幾年我一直使用的按鍵處理方法
看見(jiàn)大家發(fā)了那么多按鍵的處理方法,我也發(fā)一個(gè)。

剛參加工作的時(shí)候,對(duì)比學(xué)校里和同事的按鍵處理函數(shù),發(fā)現(xiàn)總是不盡如人意,
有以下幾點(diǎn):
1. 消抖復(fù)雜,效率低。很多人直接在電平判斷后使用delay()函數(shù),進(jìn)行消抖,
耽誤時(shí)間;有人在按鍵電平中斷中消抖,導(dǎo)致其他的中斷,比如串口、定時(shí)等
反應(yīng)很慢,不適合做實(shí)時(shí)系統(tǒng);
2. 特殊功能按鍵的處理麻煩。使用簡(jiǎn)單電平判斷的按鍵掃描,在需要長(zhǎng)按響應(yīng)、
復(fù)合按鍵響應(yīng)、復(fù)合按鍵長(zhǎng)按響應(yīng)的時(shí)候,需要增加很多的標(biāo)志位,反復(fù)使用
if..else判斷,有時(shí)候把自個(gè)都搞亂了。
3. 不便于移植和修改。使用以上兩點(diǎn)編寫的函數(shù),如果用在直接端口按鍵上的,
那么在行列掃描按鍵的時(shí)候,就很難適應(yīng)。導(dǎo)致每個(gè)項(xiàng)目都要更改一次。

想了很久之后,我結(jié)合PC的鍵盤處理方法,編寫了自己的按鍵函數(shù),經(jīng)過(guò)幾次修改,
定了下來(lái)。這十幾年來(lái),一直在用,方便移植,而且比較清晰。
——至少我自己這么覺(jué)得。

它有以下幾個(gè)特點(diǎn):
1. 按鍵掃描和取值分開(kāi)。
    在中斷中(一般10ms),反復(fù)調(diào)用keyScan()進(jìn)行按鍵掃描(包括消抖)。
    消抖之后的按鍵值不返回,作為消息放到全局變量中;
    在需要判斷的地方使用getKeyValue()獲取當(dāng)前的鍵值,進(jìn)行處理。

2. 每一個(gè)按鍵,都有單獨(dú)的標(biāo)志位和計(jì)時(shí)變量。
    消抖計(jì)時(shí):
    如果按鍵按下,每調(diào)用一次10ms中斷,gucKeyOkTimer增加;
    gucKeyOkTimer超過(guò)消抖的閥值(我一般10次,即100ms),則確認(rèn)有按鍵了。
    任何一次掃描到按鍵沒(méi)有按下,gucKeyOkTimer清空;

    標(biāo)志位:
    如果一直按著(通過(guò)按鍵電平判斷),會(huì)有g(shù)fOkPressing;
    如果按下過(guò)一次,需要響應(yīng),會(huì)有g(shù)fOkNeedAck;

    復(fù)合按鍵的響應(yīng):
    因?yàn)槊總(gè)按鍵,包括復(fù)合按鍵都有自己的標(biāo)志位和計(jì)時(shí)變量,可以跟物理按鍵的
    處理方法相同。只是消抖的條件,不是電平的判斷,而是物理按鍵的pressing標(biāo)志。

3. 我沒(méi)有使用怪癖詭異的編程方法。有很多取巧的方法可使實(shí)現(xiàn)按鍵的掃描,甚至有
人寫了三行代碼就實(shí)現(xiàn)消抖!覀(gè)人不喜歡這樣的程序風(fēng)格。我喜歡思路清晰的編程方法,
易于維護(hù)和移植。當(dāng)然代價(jià)就是多了一些ROM和RAM占用,但我覺(jué)得時(shí)間和代碼的質(zhì)量更重要。

如果你跟我的思路相同,也遇見(jiàn)過(guò)這樣的困惑,可以考慮我的按鍵掃描方法

作者: whiskycheung    時(shí)間: 2014-1-5 10:46
謝謝樓主
作者: liaolinhui    時(shí)間: 2014-1-5 20:13
看看再說(shuō)
作者: 雕亦傾心    時(shí)間: 2014-1-5 22:28
看看再說(shuō)~!
作者: admin2013    時(shí)間: 2014-1-9 20:15
謝謝,高手出手,嘿嘿
作者: m182892    時(shí)間: 2014-2-20 09:49
謝謝分享
作者: xxxevery    時(shí)間: 2014-2-21 15:37
看看寫的如何
作者: sdlkfjlkj    時(shí)間: 2014-2-23 19:26
謝謝樓主
作者: wgh008    時(shí)間: 2014-2-24 22:21
收藏學(xué)習(xí)
作者: wgh008    時(shí)間: 2014-2-24 22:28
沒(méi)看見(jiàn)樓主運(yùn)用什么語(yǔ)句,只看見(jiàn)樓主文檔里介紹他的方法,呵呵。
作者: jingsheng_cao    時(shí)間: 2014-4-18 09:19
真心不錯(cuò),很好。
作者: 盛世游龍    時(shí)間: 2014-4-23 23:52
謝謝樓主分享!
作者: zrl    時(shí)間: 2014-4-27 21:34
謝謝樓主分享!
作者: yxz1140    時(shí)間: 2014-4-28 19:45
謝謝分享!
作者: a651738901    時(shí)間: 2014-4-28 21:18
謝謝樓主慷慨,學(xué)習(xí)了!
作者: liang1981    時(shí)間: 2014-5-15 19:57
看看如何寫的
作者: xzxlove    時(shí)間: 2014-5-16 10:46
樓主熱心腸
作者: xzxlove    時(shí)間: 2014-5-16 10:52
看了下,跟我的有異曲同工之妙,其實(shí)個(gè)人感覺(jué),用定時(shí)器產(chǎn)生一個(gè)15ms左右的時(shí)間,作為消抖使用,如果程序不是特別大,將按鍵掃描程序放入主循環(huán)還是不錯(cuò)的。大家應(yīng)該都知道,程序中最好不要用延delay()函數(shù)的。
作者: szsurfing    時(shí)間: 2014-5-16 11:38
下來(lái)學(xué)習(xí)下. 謝謝先
作者: 颶風(fēng)de菜菜    時(shí)間: 2014-6-9 15:49
多謝樓主分享
作者: zmkgzsz2014    時(shí)間: 2014-9-7 10:31
學(xué)習(xí)了。
作者: 平安2006916    時(shí)間: 2014-9-7 10:43
謝謝樓主分享  新人下來(lái)研究學(xué)習(xí)
作者: lzzgg834483370    時(shí)間: 2014-9-8 12:02
很好額   受教了
作者: mcaeg    時(shí)間: 2014-9-14 20:18
謝謝.學(xué)習(xí)學(xué)習(xí)
作者: yzmmdy    時(shí)間: 2014-9-16 19:53
有個(gè)實(shí)例最好了
作者: 一人心    時(shí)間: 2014-10-5 01:25
留個(gè)記號(hào),支持下
作者: yc21    時(shí)間: 2014-10-5 20:28
參考下,自己總是搞不定按鍵處理
作者: qzsulin    時(shí)間: 2014-10-8 18:28
沒(méi)有給代碼啊
作者: 永遠(yuǎn)18    時(shí)間: 2014-10-13 16:43
感謝分享啊啊  
作者: jinanyuanyue    時(shí)間: 2014-10-13 19:13
謝謝,先下載收藏
作者: zsshd    時(shí)間: 2014-10-17 09:02
謝謝樓主。
作者: ganchao945    時(shí)間: 2014-10-18 21:02
感謝。。。。
作者: tjj163    時(shí)間: 2014-10-20 16:48
學(xué)習(xí)學(xué)習(xí)
作者: blj178    時(shí)間: 2014-10-20 19:30
謝謝樓主
作者: hjlost    時(shí)間: 2014-10-24 14:11
掘墓高手,專挖古墓,一挖一個(gè)坑,坑坑見(jiàn)墓。。

作者: 北漂的二極管    時(shí)間: 2014-10-29 14:22
看看再說(shuō)
作者: xiuyueyuan2013    時(shí)間: 2014-11-5 12:29
下載了,看看
作者: 心宇(語(yǔ))    時(shí)間: 2014-11-7 11:07
謝謝樓主
作者: 娃娃魚翅膀    時(shí)間: 2014-11-9 13:19
謝謝分享
作者: lishaoping1984    時(shí)間: 2014-11-9 20:04
一直在找這方面的資料
作者: liwanxi    時(shí)間: 2014-11-9 21:05
沒(méi)錢下,收下先.
作者: 本本12    時(shí)間: 2014-11-14 15:16
看看再說(shuō)
作者: zgs660429    時(shí)間: 2014-11-18 11:11
不錯(cuò),學(xué)習(xí)一下。
作者: dzljp    時(shí)間: 2014-11-19 21:47
謝謝樓主分享
作者: 2796277453    時(shí)間: 2014-11-20 22:10
謝謝樓主。。
作者: zjf110    時(shí)間: 2014-11-25 01:33
看看再說(shuō)~!
作者: zjf110    時(shí)間: 2014-11-25 01:47
感謝樓主分享
作者: zsshd    時(shí)間: 2014-12-17 07:13
和大家一樣,我一直在找按鍵處理方面的資料。特別感謝樓主的慷慨!謝謝。
作者: xiao_yp2014    時(shí)間: 2014-12-17 08:21
沒(méi)有代碼呢?請(qǐng)上一個(gè)吧。
作者: zsshd    時(shí)間: 2014-12-17 11:13
根據(jù)樓主的方法,程序一直沒(méi)有調(diào)試成功,主要自己入門短。大家有成功的嗎?能再指點(diǎn)一二嗎?
作者: zgs660429    時(shí)間: 2014-12-17 22:46
謝謝分享
作者: 中奧ol    時(shí)間: 2014-12-18 19:08
謝謝啦
作者: LN555    時(shí)間: 2014-12-20 12:00
這是個(gè)坑啊
作者: 唉丶芒果    時(shí)間: 2014-12-20 15:16
好用麼。試試
作者: ywd683    時(shí)間: 2015-1-2 09:14
謝謝,先下載收藏
作者: qq704661078    時(shí)間: 2015-1-31 19:09
謝謝樓主分享。!
作者: fontex    時(shí)間: 2015-2-2 13:38
十分感謝!
作者: w5201314123    時(shí)間: 2015-2-6 17:09
看看怎么做的
作者: AOP    時(shí)間: 2015-2-8 17:41
看看再說(shuō)............
作者: naijiu    時(shí)間: 2015-2-9 04:05
謝謝樓主分享,學(xué)習(xí)了,,,
作者: ding1995    時(shí)間: 2015-2-10 21:43
我也說(shuō)一句什么啊啦啦啦
作者: muzimuzi    時(shí)間: 2015-2-11 04:35
應(yīng)該會(huì)挺不錯(cuò)的吧
作者: 正本清源    時(shí)間: 2015-2-11 06:49
謝謝分享!
作者: qpx770223    時(shí)間: 2015-2-13 18:46

支持頂一下
作者: qpx770223    時(shí)間: 2015-2-13 18:46

支持頂一下
作者: zoomhan    時(shí)間: 2015-2-15 13:15

看看再說(shuō)~!
作者: ydmxyz    時(shí)間: 2015-2-20 17:37
謝謝樓主
作者: wangyifan    時(shí)間: 2015-2-22 17:50
下載研究學(xué)習(xí)一下,謝謝。
作者: meilidianzhi    時(shí)間: 2015-2-23 22:09
謝謝你
作者: w2015x    時(shí)間: 2015-3-5 18:02
看看寫的如何
作者: znddcc    時(shí)間: 2015-4-10 11:17
學(xué)習(xí)下
作者: hlywhp    時(shí)間: 2015-4-27 21:52
這個(gè)實(shí)用,謝了
作者: kmtbm    時(shí)間: 2015-7-19 12:26

已經(jīng)下載了,不錯(cuò)不錯(cuò)
作者: 段水青云    時(shí)間: 2015-7-19 19:50
好好好
作者: 段水青云    時(shí)間: 2015-7-19 19:50
很不錯(cuò)不錯(cuò)
作者: 綠源學(xué)習(xí)者    時(shí)間: 2015-7-20 12:25
不知道怎么樣,下載看看在說(shuō)

作者: basic_yuxw    時(shí)間: 2015-7-22 07:24
樓主能不能給個(gè)程序參考下
作者: bhjyqjs    時(shí)間: 2015-7-22 10:56
挖墓高手,這種東西,直接貼出就是了
作者: dangbingjoe    時(shí)間: 2015-7-22 11:09
挺好的不錯(cuò)的啊
作者: abc123194    時(shí)間: 2015-7-22 14:27
我看看,參考一下;沒(méi)程序看不明白
作者: nyzgj    時(shí)間: 2015-8-28 23:54
謝啦              
作者: sleepinbed    時(shí)間: 2015-8-29 01:27
好東西  謝謝樓主的無(wú)私奉獻(xiàn)!
作者: jiakuo25    時(shí)間: 2015-8-29 16:01
看過(guò)了,思路不錯(cuò) 頂一下
作者: bhjyqjs    時(shí)間: 2015-8-31 08:17
方法還是很好的
作者: jnu1214    時(shí)間: 2015-12-5 17:56
只是文字上簡(jiǎn)單介紹了下,沒(méi)有代碼的
作者: 永遠(yuǎn)的王同學(xué)    時(shí)間: 2015-12-25 01:15
好!實(shí)踐出真知!
作者: bbxyzzj    時(shí)間: 2015-12-25 08:52

有個(gè)實(shí)例最好了,更有利于初學(xué)者。
作者: nsj21n    時(shí)間: 2015-12-25 11:35
思維是非常好的,只是內(nèi)容略顯空洞,只是簡(jiǎn)單描述一下沒(méi)有實(shí)例分析,基本上沒(méi)有實(shí)用價(jià)值。
作者: 初學(xué)者的L    時(shí)間: 2015-12-26 10:48
謝謝樓主。
作者: 雪玉寐影    時(shí)間: 2015-12-27 14:53
學(xué)習(xí)借鑒一下
作者: 小鑫好菜    時(shí)間: 2016-11-15 23:03
看看下,謝謝樓主分享                                                                                 
作者: 重樓之巔    時(shí)間: 2016-11-15 23:35
學(xué)習(xí)一下,謝謝樓主
作者: xht9951    時(shí)間: 2016-11-16 18:00
剛剛注冊(cè),下載不了,不知道和宋學(xué)松老師的有什么區(qū)別
作者: linbai    時(shí)間: 2018-11-27 20:26
東西挺好的,
作者: amos_machine    時(shí)間: 2024-7-14 16:50
下載,打開(kāi)EXEL文件錯(cuò)誤

作者: joyb    時(shí)間: 2024-7-15 14:36
nsj21n 發(fā)表于 2015-12-25 11:35
思維是非常好的,只是內(nèi)容略顯空洞,只是簡(jiǎn)單描述一下沒(méi)有實(shí)例分析,基本上沒(méi)有實(shí)用價(jià)值。

分享一下十幾年我一直使用的按鍵處理方法
看見(jiàn)大家發(fā)了那么多按鍵的處理方法,我也發(fā)一個(gè)。
剛參加工作的時(shí)候,對(duì)比學(xué)校里和同事的按鍵處理函數(shù),發(fā)現(xiàn)總是不盡如人意,有以下幾點(diǎn):
1. 消抖復(fù)雜,效率低。很多人直接在電平判斷后使用delay()函數(shù),進(jìn)行消抖,耽誤時(shí)間;有人在按鍵電平中斷中消抖,導(dǎo)致其他的中斷,比如串口、定時(shí)等反應(yīng)很慢,不適合做實(shí)時(shí)系統(tǒng);
2. 特殊功能按鍵的處理麻煩。使用簡(jiǎn)單電平判斷的按鍵掃描,在需要長(zhǎng)按響應(yīng)、復(fù)合按鍵響應(yīng)、復(fù)合按鍵長(zhǎng)按響應(yīng)的時(shí)候,需要增加很多的標(biāo)志位,反復(fù)使用if..else判斷,有時(shí)候把自個(gè)都搞亂了。
3. 不便于移植和修改。使用以上兩點(diǎn)編寫的函數(shù),如果用在直接端口按鍵上的,那么在行列掃描按鍵的時(shí)候,就很難適應(yīng)。導(dǎo)致每個(gè)項(xiàng)目都要更改一次。

想了很久之后,我結(jié)合PC的鍵盤處理方法,編寫了自己的按鍵函數(shù),經(jīng)過(guò)幾次修改,定了下來(lái)。這十幾年來(lái),一直在用,方便移植,而且比較清晰。
——至少我自己這么覺(jué)得。

它有以下幾個(gè)特點(diǎn):
1. 按鍵掃描和取值分開(kāi)。
    在中斷中(一般10ms),反復(fù)調(diào)用keyScan()進(jìn)行按鍵掃描(包括消抖)。
    消抖之后的按鍵值不返回,作為消息放到全局變量中;
    在需要判斷的地方使用getKeyValue()獲取當(dāng)前的鍵值,進(jìn)行處理。

2. 每一個(gè)按鍵,都有單獨(dú)的標(biāo)志位和計(jì)時(shí)變量。
    消抖計(jì)時(shí):
    如果按鍵按下,每調(diào)用一次10ms中斷,gucKeyOkTimer增加;
    gucKeyOkTimer超過(guò)消抖的閥值(我一般10次,即100ms),則確認(rèn)有按鍵了。
    任何一次掃描到按鍵沒(méi)有按下,gucKeyOkTimer清空;

    標(biāo)志位:
    如果一直按著(通過(guò)按鍵電平判斷),會(huì)有g(shù)fOkPressing;
    如果按下過(guò)一次,需要響應(yīng),會(huì)有g(shù)fOkNeedAck;

復(fù)合按鍵的響應(yīng):
因?yàn)槊總(gè)按鍵,包括復(fù)合按鍵都有自己的標(biāo)志位和計(jì)時(shí)變量,可以跟物理按鍵的處理方法相同。只是消抖的條件,不是電平的判斷,而是物理按鍵的pressing標(biāo)志。
3. 我沒(méi)有使用怪癖詭異的編程方法。有很多取巧的方法可使實(shí)現(xiàn)按鍵的掃描,甚至有人寫了三行代碼就實(shí)現(xiàn)消抖!覀(gè)人不喜歡這樣的程序風(fēng)格。我喜歡思路清晰的編程方法,易于維護(hù)和移植。當(dāng)然代價(jià)就是多了一些ROM和RAM占用,但我覺(jué)得時(shí)間和代碼的質(zhì)量更重要。
如果你跟我的思路相同,也遇見(jiàn)過(guò)這樣的困惑,可以考慮我的按鍵掃描方法

作者: gzyanbo    時(shí)間: 2024-7-15 16:11
想知道運(yùn)用的例程
作者: 巨人卡奧    時(shí)間: 2024-7-22 15:16
牛皮,十幾年的經(jīng)驗(yàn)
作者: csmjmcc    時(shí)間: 2024-7-30 10:57
沒(méi)有源碼?




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