按鍵的長按與短按

按鍵的長按與短按是今年藍橋杯的省賽(第九屆)的一個難點,可以這樣說,長按短按搞定了,那麼這道題肯定會做出來,當然有一些小小的bug在考場上是很常見的。

昨天我再次寫了一下長按與短按,難度是有的,但是不大,實現方法也是有很多,但是我說說我的思想:

1 .明確概念,什麼是長按,什麼是短按
2 .什麼時候才能把按鍵的鍵值傳出去
3 .按鍵值傳出去之後又該怎麼辦

題目中明確說明:按鍵持續按下的時間在800ms以內就是短按,超過800ms就是長按,那我們該考慮什麼什麼——如何選着適當的時期把按鍵的鍵值傳出去。
我在考場上直接就寫出來if(…){ … } else{…},我直接判斷的是時間,就是在800ms以內就是短按,超過800ms就是長按,但是由於我沒有考慮好什麼時候去判斷按鍵按下了多少時間,最後導致我的長按每次都得經過一次短按。
但是最終把功能都實現了,順利進入省一(最終國二),還是比較好的結果。
我來說說什麼時候去判斷按鍵按下的時間:

1 . 短按直接看按鍵釋放的時候去看時間
2 . 長按這裏不要在釋放的時候看時間(由於題目意思的限制,因爲超過800ms就是長按)

這樣便可以寫出程序:
程序說明:

1、首先判斷按鍵是否按下
2、進入狀態二,記錄那個按鍵按下
3、然後狀態三判斷是長按還是短按,
短按:釋放時候看時間
長按:直接看時間

4、狀態四全部標誌位清零,計數清零,長按之後鍵值全部爲0xff,
//keyState是按鍵狀態;
//keyPass記錄那個按鍵按下
//keyCount是記錄按鍵按下時間
//keyflag 開始計數標誌位

void Key_Scan(void)
{
//keyState是按鍵狀態;
//keyPass記錄那個按鍵按下
//keyCount是記錄按鍵按下時間
//keyflag 開始計數標誌位
static u8 keyState = 0,keyPass = 0;;
// u8 i = 0;
switch(keyState)
{
case 0:if(KEY00||KEY10||KEY20||KEY30)
{
Delay_Ms(10);//消抖
keyState = 1;//進入第二
keyPass = 0xff; //初始化按鍵按下位
}
break;

    case 1: if(KEY0==0||KEY1==0||KEY2==0||KEY3==0)
            {
                keyState = 2;
                keyflag = 1;
                if(KEY0==0){
                    keyPass = 1;
                }   
                else if(KEY1==0)keyPass = 2;
                else if(KEY2==0)keyPass = 3;
                else if(KEY3==0)keyPass = 4;
            }   
            else keyState = 0;//返回檢測按鍵      
            
            break;
    case 2: 
            switch(keyPass) //爲什麼這樣寫,是因爲在一個按鍵按下之後,其餘按鍵是沒有按下的
            {               //如果直接 if...else...會出現錯誤,因爲其餘按鍵沒有按下,是  1 
                case 1:if(KEY0!=0)
                        {
                            if(10 < keyCount&&keyCount < 800)//短按
                            {
                                keyCount = 0;
                                keyflag = 0;
                                keyValue = ShoutKey0; 
                                keyState = 0;
                            }   
                        }       
                        break;
                case 2:if(KEY1!=0)
                        {
                            if(10 < keyCount&&keyCount < 800)//短按
                            {
                                keyCount = 0;
                                keyflag = 0;
                                keyValue = ShoutKey1; 
                                keyState = 0;
                            }   
                        }       
                        break;
                case 3:if(KEY2!=0)
                        {
                            if(10 < keyCount && keyCount < 800)//短按
                            {
                                keyCount = 0;
                                keyflag = 0;
                                keyValue = ShoutKey2; 
                                keyState = 0;
                            }   
                        }       
                        break;
                case 4:if(KEY3!=0)
                        {
                            if(10 < keyCount&&keyCount < 800)//短按
                            {
                                keyCount = 0;
                                keyflag = 0;
                                keyValue = ShoutKey3; 
                                keyState = 0;
                            }   
                        }
                        break;
            }
            if(keyCount > 800)//長按
            {   
                if(KEY0==0)keyValue = LongKey0; 
                else if(KEY1==0)keyValue = LongKey1;
                else if(KEY2==0)keyValue = LongKey2;
                else if(KEY3==0)keyValue = LongKey3;

                keyState = 3;
            }
            break;

    case 3: if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==1)
            {
                keyCount = 0;
                keyflag = 0;
                keyState = 0;
                keyValue = 0xff;//長按之後釋放按鍵代表不執行操作,那麼沒有鍵值傳出  
            }
            
            break;
}

}

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