//返回值:
//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章 矩陣按...