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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 86232|回復: 241
收起左側

[分享]分享一下我用了十幾年的按鍵掃描方法

  [復制鏈接]
ID:51941 發表于 2013-7-22 11:43 | 顯示全部樓層 |閱讀模式
看見大家發了那么多按鍵的處理方法,我也發一個。

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

想了很久之后,我結合PC的鍵盤處理方法,編寫了自己的按鍵函數,經過幾次修改,
定了下來。這十幾年來,一直在用,方便移植,而且比較清晰。
——至少我自己這么覺得。

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

2. 每一個按鍵,都有單獨的標志位和計時變量。
    消抖計時:
    如果按鍵按下,每調用一次10ms中斷,gucKeyOkTimer增加;
    gucKeyOkTimer超過消抖的閥值(我一般10次,即100ms),則確認有按鍵了。
    任何一次掃描到按鍵沒有按下,gucKeyOkTimer清空;

    標志位:
    如果一直按著(通過按鍵電平判斷),會有gfOkPressing;
    如果按下過一次,需要響應,會有gfOkNeedAck;

    復合按鍵的響應:
    因為每個按鍵,包括復合按鍵都有自己的標志位和計時變量,可以跟物理按鍵的
    處理方法相同。只是消抖的條件,不是電平的判斷,而是物理按鍵的pressing標志。

3. 我沒有使用怪癖詭異的編程方法。有很多取巧的方法可使實現按鍵的掃描,甚至有
人寫了三行代碼就實現消抖。——我個人不喜歡這樣的程序風格。我喜歡思路清晰的編程方法,
易于維護和移植。當然代價就是多了一些ROM和RAM占用,但我覺得時間和代碼的質量更重要。

如果你跟我的思路相同,也遇見過這樣的困惑,可以考慮我的按鍵掃描方法。

我摘錄了與按鍵相關的部分,如果有疑問,歡迎通過郵件或QQ溝通。


key.rar

1.23 KB, 下載次數: 1696

按鍵處理

評分

參與人數 12黑幣 +84 收起 理由
770632741 + 5 很給力!
zzffw + 5 很給力!
荒謬的真理 + 5 絕世好帖!
zxc562 + 5 共享資料的黑幣獎勵!
wangjunwu1995 + 5 22223
sunlei058378 + 15
archerelf + 2 很給力!
init() + 5 很給力!
一毛零logo + 5 說的很吸引人,感覺應該不錯
absflash + 15 很給力!
YJGG + 12 贊一個!
遙遠716 + 5 很給力!

查看全部評分

回復

使用道具 舉報

ID:421260 發表于 2024-10-23 08:28 | 顯示全部樓層
最大缺點,采用了中斷
回復

使用道具 舉報

ID:232619 發表于 2024-10-22 23:37 | 顯示全部樓層

感謝樓主分享!!!!!!!
回復

使用道具 舉報

ID:1128165 發表于 2024-10-21 15:49 | 顯示全部樓層

貌似不錯的樣子。。。
回復

使用道具 舉報

ID:1133909 發表于 2024-10-17 15:03 | 顯示全部樓層
剛入門,正好學習一下先輩的經驗
回復

使用道具 舉報

ID:1008703 發表于 2022-3-7 11:41 | 顯示全部樓層
進來學習一下,講的非常仔細,謝謝樓主分享
回復

使用道具 舉報

ID:702749 發表于 2022-3-4 10:47 | 顯示全部樓層
小白帆 發表于 2018-5-2 08:49
樓主請問你的這段代碼是什么意思?

bdata可尋址
回復

使用道具 舉報

ID:928738 發表于 2022-2-25 10:10 | 顯示全部樓層
                        if(gucKeyOkTimer>T_100MS)
                        {
                                gfOkPressing=1;
                                if(gfOkPressing==0)
                                        gfOkNeedAck=1;

                        }
這個gfOkPressing==0,永遠達不到條件。哪里忘了修改了?
回復

使用道具 舉報

ID:71535 發表于 2020-2-15 09:42 | 顯示全部樓層

閉關期間,好好學習,天天進步。
回復

使用道具 舉報

ID:693302 發表于 2020-2-14 19:02 | 顯示全部樓層

感謝樓主分享,學習了!
回復

使用道具 舉報

ID:64253 發表于 2020-2-14 09:29 | 顯示全部樓層
先下載了,在研究學習
回復

使用道具 舉報

ID:690948 發表于 2020-2-13 11:26 來自觸屏版 | 顯示全部樓層
高手在民間
回復

使用道具 舉報

ID:465279 發表于 2020-2-12 22:35 | 顯示全部樓層
就是來學習的,感謝你的分享。
回復

使用道具 舉報

ID:378732 發表于 2019-11-5 15:33 | 顯示全部樓層
學習一下
回復

使用道具 舉報

ID:636013 發表于 2019-11-5 14:47 | 顯示全部樓層
好東西好東西
回復

使用道具 舉報

ID:61950 發表于 2019-9-4 11:00 來自觸屏版 | 顯示全部樓層
昨晚研究了一晚,還是沒太懂
回復

使用道具 舉報

ID:207133 發表于 2019-9-4 09:41 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:385637 發表于 2019-9-4 08:35 | 顯示全部樓層
好資料,謝謝分享
回復

使用道具 舉報

ID:607060 發表于 2019-9-3 19:17 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:468431 發表于 2019-4-16 09:00 | 顯示全部樓層
做項目正好遇到了這個問題,及時雨一般看到這帖子,謝謝樓主分享!!!
回復

使用道具 舉報

ID:337487 發表于 2019-3-19 19:58 | 顯示全部樓層
好方法可以學習一下,謝謝分享
回復

使用道具 舉報

ID:477688 發表于 2019-2-26 13:30 | 顯示全部樓層

感謝樓主分享!!!
回復

使用道具 舉報

ID:116773 發表于 2018-12-17 20:41 | 顯示全部樓層
下載學習,尚未看明白。
回復

使用道具 舉報

ID:448238 發表于 2018-12-17 18:36 | 顯示全部樓層
想下載下了看看~
回復

使用道具 舉報

ID:118735 發表于 2018-7-27 17:00 | 顯示全部樓層
感謝樓主分享
回復

使用道具 舉報

ID:377927 發表于 2018-7-23 15:12 | 顯示全部樓層
學習一下,謝謝
回復

使用道具 舉報

ID:64253 發表于 2018-7-23 14:41 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:110278 發表于 2018-7-19 15:08 | 顯示全部樓層
講解的很詳細,必須支持一個。
回復

使用道具 舉報

ID:357149 發表于 2018-7-18 21:06 | 顯示全部樓層
謝謝樓主分享,這個東西簡潔快速十分有用
回復

使用道具 舉報

ID:67705 發表于 2018-5-26 12:49 | 顯示全部樓層
這個東東絕對值得一看。
回復

使用道具 舉報

ID:67705 發表于 2018-5-26 12:48 | 顯示全部樓層
這個東東絕對值得一看。
回復

使用道具 舉報

ID:145032 發表于 2018-5-26 12:34 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:104760 發表于 2018-5-25 09:08 | 顯示全部樓層
感謝樓主分享!!!!!!!!
回復

使用道具 舉報

ID:331575 發表于 2018-5-23 22:31 | 顯示全部樓層
刷新了我對防抖按鍵的寫法  厲害
回復

使用道具 舉報

ID:331575 發表于 2018-5-23 07:24 來自觸屏版 | 顯示全部樓層
謝謝分享思路
回復

使用道具 舉報

ID:293762 發表于 2018-5-20 22:28 | 顯示全部樓層
謝謝分享!
回復

使用道具 舉報

ID:288202 發表于 2018-5-2 08:49 | 顯示全部樓層
  1. unsigned char bdata        gucKeyFlag1;   
  2. sbit gfOkPressing         =gucKeyFlag1^0;
  3. sbit gfOkNeedAck        =gucKeyFlag1^1;  
  4. sbit gfUpPressing         =gucKeyFlag1^2;
  5. sbit gfUpNeedAck        =gucKeyFlag1^3;
  6. sbit gfDownPressing         =gucKeyFlag1^4;
  7. sbit gfDownNeedAck        =gucKeyFlag1^5;
  8. sbit gfCancelPressing         =gucKeyFlag1^6;
  9. sbit gfCancelNeedAck        =gucKeyFlag1^7;                                      
  10. unsigned char bdata        gucKeyFlag2;      
  11. sbit gfMenuPressing         =gucKeyFlag2^0;
  12. sbit gfMenuNeedAck        =gucKeyFlag2^1;
  13. sbit gfONOFFPressing         =gucKeyFlag2^2;
  14. sbit gfONOFFNeedAck        =gucKeyFlag2^3;
復制代碼



樓主請問你的這段代碼是什么意思?
回復

使用道具 舉報

ID:66287 發表于 2018-3-7 10:30 | 顯示全部樓層
非常好的編程思路
回復

使用道具 舉報

ID:76133 發表于 2018-3-6 20:50 | 顯示全部樓層
感謝樓主分享!!!!
回復

使用道具 舉報

ID:67838 發表于 2018-3-6 16:27 | 顯示全部樓層
看看高級的程序
回復

使用道具 舉報

ID:287564 發表于 2018-3-6 13:26 | 顯示全部樓層
感覺很給力,謝謝分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品日韩av不卡在线 | 国产欧美一区二区在线观看 | 中文字幕视频在线 | 福利在线观看 | 亚洲国产成人精品久久 | 国产精品视频免费观看 | 成人 在线 | 一区二区免费视频 | 一区二区国产在线观看 | 精品国产区 | 欧美国产日韩在线观看 | 在线观看国产 | 亚洲乱码一区二区三区在线观看 | 中文字幕国产 | 91毛片网 | 性色av香蕉一区二区 | 一区二区国产精品 | 亚洲精品在线91 | 久久这里有精品 | 蜜桃视频一区二区三区 | 欧美极品在线观看 | 亚洲国产区 | 日韩欧美在线不卡 | 欧美伊人影院 | 亚洲精品1区2区3区 91免费看片 | 精品伊人久久 | 国产精品久久久久久久久久久久久 | 久久黄色网 | 亚洲a一区二区 | 农村真人裸体丰满少妇毛片 | 国产va| 99久久久国产精品免费消防器 | 国产精品亚洲第一区在线暖暖韩国 | 亚洲视频免费 | 欧美日韩黄 | 男人的天堂在线视频 | 国产精品久久久久久久模特 | 欧美视频一区二区三区 | 国产日韩一区二区三免费 | 91社区在线观看播放 | 国产精品久久久久久久久久了 |