我爱编程

按键的长按与短按

2018-04-30  本文已影响859人  你的优先级最高

1 .明确概念,什么是长按,什么是短按
2 .什么时候才能把按键的键值传出去
3 .按键值传出去之后又该怎么办

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(KEY0==0||KEY1==0||KEY2==0||KEY3==0)
                {
                    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;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读