找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 24097|回復(fù): 98
收起左側(cè)

分享一下十幾年我一直使用的按鍵處理方法

  [復(fù)制鏈接]
ID:57081 發(fā)表于 2013-11-4 15:33 | 顯示全部樓層 |閱讀模式
分享一下十幾年我一直使用的按鍵處理方法
看見(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)編寫(xiě)的函數(shù),如果用在直接端口按鍵上的,
那么在行列掃描按鍵的時(shí)候,就很難適應(yīng)。導(dǎo)致每個(gè)項(xiàng)目都要更改一次。

想了很久之后,我結(jié)合PC的鍵盤(pán)處理方法,編寫(xiě)了自己的按鍵函數(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)按鍵的掃描,甚至有
人寫(xiě)了三行代碼就實(shí)現(xiàn)消抖�!覀€(gè)人不喜歡這樣的程序風(fēng)格。我喜歡思路清晰的編程方法,
易于維護(hù)和移植。當(dāng)然代價(jià)就是多了一些ROM和RAM占用,但我覺(jué)得時(shí)間和代碼的質(zhì)量更重要。

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

評(píng)分

參與人數(shù) 1黑幣 +3 收起 理由
second1111 + 3 絕世好帖!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:57973 發(fā)表于 2014-5-16 10:52 | 顯示全部樓層
看了下,跟我的有異曲同工之妙,其實(shí)個(gè)人感覺(jué),用定時(shí)器產(chǎn)生一個(gè)15ms左右的時(shí)間,作為消抖使用,如果程序不是特別大,將按鍵掃描程序放入主循環(huán)還是不錯(cuò)的。大家應(yīng)該都知道,程序中最好不要用延delay()函數(shù)的。
回復(fù)

使用道具 舉報(bào)

ID:64089 發(fā)表于 2015-12-25 11:35 | 顯示全部樓層
思維是非常好的,只是內(nèi)容略顯空洞,只是簡(jiǎn)單描述一下沒(méi)有實(shí)例分析,基本上沒(méi)有實(shí)用價(jià)值。
回復(fù)

使用道具 舉報(bào)

ID:1064915 發(fā)表于 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)編寫(xiě)的函數(shù),如果用在直接端口按鍵上的,那么在行列掃描按鍵的時(shí)候,就很難適應(yīng)。導(dǎo)致每個(gè)項(xiàng)目都要更改一次。

想了很久之后,我結(jié)合PC的鍵盤(pán)處理方法,編寫(xiě)了自己的按鍵函數(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)按鍵的掃描,甚至有人寫(xiě)了三行代碼就實(shí)現(xiàn)消抖。——我個(gè)人不喜歡這樣的程序風(fēng)格。我喜歡思路清晰的編程方法,易于維護(hù)和移植。當(dāng)然代價(jià)就是多了一些ROM和RAM占用,但我覺(jué)得時(shí)間和代碼的質(zhì)量更重要。
如果你跟我的思路相同,也遇見(jiàn)過(guò)這樣的困惑,可以考慮我的按鍵掃描方法

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:58552 發(fā)表于 2014-1-5 10:46 | 顯示全部樓層
謝謝樓主
回復(fù)

使用道具 舉報(bào)

ID:58502 發(fā)表于 2014-1-5 20:13 | 顯示全部樓層
看看再說(shuō)
回復(fù)

使用道具 舉報(bào)

ID:58269 發(fā)表于 2014-1-5 22:28 | 顯示全部樓層
看看再說(shuō)~!
回復(fù)

使用道具 舉報(bào)

ID:58227 發(fā)表于 2014-1-9 20:15 | 顯示全部樓層
謝謝,高手出手,嘿嘿
回復(fù)

使用道具 舉報(bào)

ID:56665 發(fā)表于 2014-2-20 09:49 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:59202 發(fā)表于 2014-2-21 15:37 | 顯示全部樓層
看看寫(xiě)的如何
回復(fù)

使用道具 舉報(bào)

ID:59231 發(fā)表于 2014-2-23 19:26 | 顯示全部樓層
謝謝樓主
回復(fù)

使用道具 舉報(bào)

ID:59151 發(fā)表于 2014-2-24 22:21 | 顯示全部樓層
收藏學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:59151 發(fā)表于 2014-2-24 22:28 | 顯示全部樓層
沒(méi)看見(jiàn)樓主運(yùn)用什么語(yǔ)句,只看見(jiàn)樓主文檔里介紹他的方法,呵呵。
回復(fù)

使用道具 舉報(bào)

ID:60820 發(fā)表于 2014-4-18 09:19 | 顯示全部樓層
真心不錯(cuò),很好。
回復(fù)

使用道具 舉報(bào)

ID:59884 發(fā)表于 2014-4-23 23:52 | 顯示全部樓層
謝謝樓主分享!
回復(fù)

使用道具 舉報(bào)

ID:61189 發(fā)表于 2014-4-27 21:34 | 顯示全部樓層
謝謝樓主分享!
回復(fù)

使用道具 舉報(bào)

ID:55219 發(fā)表于 2014-4-28 19:45 | 顯示全部樓層
謝謝分享!
回復(fù)

使用道具 舉報(bào)

ID:61227 發(fā)表于 2014-4-28 21:18 | 顯示全部樓層
謝謝樓主慷慨,學(xué)習(xí)了!
回復(fù)

使用道具 舉報(bào)

ID:25058 發(fā)表于 2014-5-15 19:57 來(lái)自觸屏版 | 顯示全部樓層
看看如何寫(xiě)的
回復(fù)

使用道具 舉報(bào)

ID:57973 發(fā)表于 2014-5-16 10:46 | 顯示全部樓層
樓主熱心腸
回復(fù)

使用道具 舉報(bào)

ID:61913 發(fā)表于 2014-5-16 11:38 | 顯示全部樓層
下來(lái)學(xué)習(xí)下. 謝謝先
回復(fù)

使用道具 舉報(bào)

ID:62769 發(fā)表于 2014-6-9 15:49 | 顯示全部樓層
多謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:65877 發(fā)表于 2014-9-7 10:31 | 顯示全部樓層
學(xué)習(xí)了。
回復(fù)

使用道具 舉報(bào)

ID:59611 發(fā)表于 2014-9-7 10:43 | 顯示全部樓層
謝謝樓主分享  新人下來(lái)研究學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:65341 發(fā)表于 2014-9-8 12:02 | 顯示全部樓層
很好額   受教了
回復(fù)

使用道具 舉報(bào)

ID:66142 發(fā)表于 2014-9-14 20:18 | 顯示全部樓層
謝謝.學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:56814 發(fā)表于 2014-9-16 19:53 | 顯示全部樓層
有個(gè)實(shí)例最好了
回復(fù)

使用道具 舉報(bào)

ID:64062 發(fā)表于 2014-10-5 01:25 | 顯示全部樓層
留個(gè)記號(hào),支持下
回復(fù)

使用道具 舉報(bào)

ID:65893 發(fā)表于 2014-10-5 20:28 | 顯示全部樓層
參考下,自己總是搞不定按鍵處理
回復(fù)

使用道具 舉報(bào)

ID:64825 發(fā)表于 2014-10-8 18:28 | 顯示全部樓層
沒(méi)有給代碼啊
回復(fù)

使用道具 舉報(bào)

ID:67310 發(fā)表于 2014-10-13 16:43 | 顯示全部樓層
感謝分享啊啊  
回復(fù)

使用道具 舉報(bào)

ID:67312 發(fā)表于 2014-10-13 19:13 | 顯示全部樓層
謝謝,先下載收藏
回復(fù)

使用道具 舉報(bào)

ID:67460 發(fā)表于 2014-10-17 09:02 | 顯示全部樓層
謝謝樓主。
回復(fù)

使用道具 舉報(bào)

ID:67598 發(fā)表于 2014-10-18 21:02 | 顯示全部樓層
感謝。。。。
回復(fù)

使用道具 舉報(bào)

ID:67235 發(fā)表于 2014-10-20 16:48 | 顯示全部樓層
學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:67573 發(fā)表于 2014-10-20 19:30 | 顯示全部樓層
謝謝樓主
回復(fù)

使用道具 舉報(bào)

ID:66501 發(fā)表于 2014-10-24 14:11 | 顯示全部樓層
掘墓高手,專(zhuān)挖古墓,一挖一個(gè)坑,坑坑見(jiàn)墓。。
回復(fù)

使用道具 舉報(bào)

ID:64336 發(fā)表于 2014-10-29 14:22 | 顯示全部樓層
看看再說(shuō)
回復(fù)

使用道具 舉報(bào)

ID:68356 發(fā)表于 2014-11-5 12:29 | 顯示全部樓層
下載了,看看
回復(fù)

使用道具 舉報(bào)

ID:53925 發(fā)表于 2014-11-7 11:07 | 顯示全部樓層
謝謝樓主
回復(fù)

使用道具 舉報(bào)

ID:59400 發(fā)表于 2014-11-9 13:19 來(lái)自觸屏版 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:68583 發(fā)表于 2014-11-9 20:04 | 顯示全部樓層
一直在找這方面的資料
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表