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時的支持連按的情況

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章