原子哥的按鍵掃瞄分析

2021-08-18 10:21:55 字數 1216 閱讀 8002

//返回值:

//0,沒有任何按鍵按下

//key0_pres,key0按下

//key1_pres,key1按下

//wkup_pres,wk_up按下 

//注意此函式有響應優先順序,key0>key1>wk_up!!

u8 key_scan(u8 mode) //mode:0,不支援連續按; 1,支援連續按;

if(key_up==1 &&(key0==0||key1==0||wk_up==1)) //如果有乙個按鍵按下

else if(key0==1&&key1==1&&wk_up==0)

return 0;// 無按鍵按下

}首先必須搞懂static這個關鍵字,static申明的區域性變數,儲存在靜態儲存區;它在函式呼叫結束後,它的值會一直保留下來,所以說用static申明的變數具有記憶功能。

假設key0按下:

當mode為1的時候,支援連按,解釋如下

if  ( mode) key_up = 1成立,進入下面的if語句,返回按鍵值,按鍵按著沒有鬆開,main()程式繼續呼叫key_scan(1)按鍵掃瞄程式,由於mode=1,所以if(mode)key_up=1; 繼續相關操作。

假設mode=0,設定成不支援長按。同時假設key0按下。

1. static u8 key_up=1;

2. if(mode==1) 這句話直接變成沒有的語句了。 if(0==1) 0怎麼可能等於1???

3.3.if(key_flag==1 &&(key0==0||key1==0||wk_up==1)) ,由於key_up=1,假設按鍵key0又按下了。所以if語句成立。執行括號裡面的內容。並且返回按鍵按下的值

4. 先消抖, key_up=0; 接著判斷哪個按鍵按下,返回按鍵按下的值。

5.此時如果你還按著按鍵,也不會有作用了。 if(key_flag==1 &&(key0==0||key1==0||wk_up==1)) 因為此時key_up=0; if語句不成立了。

6.當你一鬆開手,馬上進入 else if(key0==1&&key1==1&&wk_up==0) 當 按鍵都沒有按下, key_up又被重新重新整理了,又等於1了。

7.當你再次按下按鍵key0的時候,if(key_flag==1 &&(key0==0||key1==0||wk_up==1)) 又成立了。又再次進入迴圈體。 實現了單次按鍵的效果

啊啊啊,還是要了解static的作用,以及它的值的變化情況,很簡單!

掃瞄按鍵的解決方法

在做專案 工程 的時候,我們經常要用到比較多的按鍵,而且io資源緊張,於是我們就想方設法地在別的模組 中節省io口,好不容易擠出一兩個io口,卻發現仍然不夠用,實在沒辦法了就新增乙個ic來掃鍵。乙個ic雖然 不高,但對於大批量生產而且產品利潤低 的廠家來說,這是一筆不菲的開支 那,我們能不能想到比較...

關於按鍵掃瞄程式的終極討論

一 思路 基於stm8,按鍵處理,思路是這樣的 每20ms左右一次去掃瞄按鍵,用乙個key now記錄當前值,用key last記錄上次的值,如果key now和key last同時有效,則開始進行cnt 我設定兩個閾值,long press為100 100 20ms 2s short press為...

矩陣按鍵掃瞄的疑惑與解答

最近在學習金沙灘宋老師的微控制器,說實話學著是比較吃力,但是不後悔!老師交給的絕不是僅僅只是 魚 發現自己的學習態度以及嚴謹程度,真的和一些前輩比起相差甚遠。下面摘自一位名為 商道 的群友的學習總結,共勉 關於矩陣按鍵掃瞄消抖的解釋 教材第8章 矩陣按鍵掃瞄例題8.4.5 教材116頁第8章 矩陣按...