|
最近帖子已經(jīng)有人在此提到充分利用CPU中斷的重要性,,再次我就不要說了。此按鍵demo支持短按,長按,多個按鍵同時按下,由于是用掃描的方式,各個按鍵的按下和松獨立處理,不互相干擾,避免要按鍵死等的情況。對于特殊的按鍵消抖時間可單獨一條線掃描檢測。。由于是各個按鍵,一位位檢測,檢測到一位就進(jìn)行處理,之后再進(jìn)行處理下一位,所以有先后順序。廢話不多說,下面講思路,有錯誤的地方大家可以一起學(xué)習(xí),探討,,,,,,,,
按鍵的最終狀態(tài)無非就兩種,按下或者松開。我用的是STC8單片機,現(xiàn)在的一些增強型或許新型號應(yīng)該內(nèi)部都有上拉電阻,,所以我們是按鍵低電平觸發(fā)。
對于只作為輸入口用于按鍵檢測,,我們可以默認(rèn)他的IO口狀態(tài),不要去操作IO寄存器,,,(如果是即作為輸入又作為輸出的話,,在讀取狀態(tài)的時候記得先寫1,延時2個NOP,再去讀,保證讀取的準(zhǔn)確性),,假設(shè)按鍵沒按下去默認(rèn)就是1了,按鍵按下去就是0,也就是1->0的過程,,松開的話就是0->1,恢復(fù)到最初狀態(tài)。這里就有兩個變化1->0,和0->1,,理解這個之后我們就定義兩個變量 value 變化值 buf 最終狀態(tài)值 我們兩個變化1->0,和0->1進(jìn)行異或就是1,,說明了按鍵有按下或松開的動作,我們就去執(zhí)行對應(yīng)的函數(shù),,執(zhí)行完后按鍵的最終只buf也跟著更新,也就是0(按下) 1(松開),,(一直按下的過程)此時端口值0 和buf0 異或就是0 ,咱就不再去執(zhí)行按鍵按下的程序,,(松開后的過程)此時端口值1 和buf1 異或就是0 ,咱就不再去執(zhí)行按鍵松開的程序,,這樣就保證了按下 或者松開 只執(zhí)行一次動作,,因此加入一些標(biāo)志位。,結(jié)合中斷就可以做一些長按功能了。提供的demo里有做了一個實例是長按2秒開關(guān)蜂鳴器,,其他的按鍵按下或者松開的子函數(shù)用戶自己增加自己需要的功能,,里面只是寫了一些簡單的點燈功能用于調(diào)試,,自己驗證了一下程序是可行,,所以提供出來,,大部分都有注釋,看看有什么不足之處,在進(jìn)行修改,,后面會在此基礎(chǔ)加入矩陣掃描,原理一樣,接著進(jìn)一步完善demo,做成一個能實現(xiàn)操作常見的外設(shè)demo出來,,程序不足之處多多見諒,大家多多批評,一起學(xué)習(xí),,,,,下面按鍵的流程圖,也不知道這個畫得不到,老感覺自己的表達(dá)能力有待提高,,或者也會多發(fā)貼,把自己的一些表達(dá)能力加強,,
按鍵流程圖.png (104.75 KB, 下載次數(shù): 74)
下載附件
按鍵流程圖
2019-7-21 01:09 上傳
1 file文件夾為項目的硬件端口表 功能書 原理圖等資料
2 inc文件 為系統(tǒng)配置文件
3 lib文件 各個外設(shè)文件
4 program文件 為項目文件
單片機源程序如下:
所有程序51hei打包下載:
STC8 實驗3 -按鍵.rar
(92.31 KB, 下載次數(shù): 19)
2019-7-21 01:11 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|