1. 程式人生 > >STM32按鍵程式

STM32按鍵程式

u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//按鍵按鬆開標誌
if(mode)key_up=1; //支援連按
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))
{
delay_ms(10);//去抖動
key_up=0;
if(KEY0==0)return 1;
else if(KEY1==0)return 2;
else if(KEY2==0)return 3;
else if(KEY3==1)return 4;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0
)key_up=1; return 0;// 無按鍵按下 }

static是靜態變數只會執行一次
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))這句意思是如果keyup為1,同時key0123中有一個按鍵被按下,那麼if為真,執行取值操作,作為返回值付給主函式的t,
else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;這個意思是如果上面的if為假,那麼如果key0123沒有一個被按下,那麼keyup置1,
我們來分析如果不支援連按的情況,mode為0,
一開始你沒按按鍵那麼if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))為假不執行後面的語句執行elseif應為keyup沒變過,所以沒什麼用。
假設你按的是key0,那麼KEY0==0||KEY1==0||KEY2==0||KEY3==1為真,執行後面的語句,把keyup置0後,取出按鍵值,作為函式返回值送會給t,
如果你繼續按著當下次按鍵掃描時到來時,static u8 key_up=1,這個只執行一次,同時mode又為0,那麼keyup還是0,
然後執行到if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))這句,由於keyup是0所以不會執行if語句,執行elseif,但是你此時有有一個按鍵是被按下的,所以elseif裡的keyup=1也不會被執行,因為elseif也是假的。然後返回值還是0,這就達到了不支援連按的目的
如果你按過之後送手了那麼再看,if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))這條語句為假應為keyup為0執行elseif,此時由於你沒有按按鈕,所以會執行keyup=1這條語句,當下次掃描按鈕來臨時又恢復到了最初的情況。
同理可以分析出mode為1時的支援連按的情況