按键的长按与短按

按键的长按与短按是今年蓝桥杯的省赛(第九届)的一个难点,可以这样说,长按短按搞定了,那么这道题肯定会做出来,当然有一些小小的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;
}

}

发布了43 篇原创文章 · 获赞 7 · 访问量 4636

猜你喜欢

转载自blog.csdn.net/qq_46522785/article/details/104976558