原子哥的按键扫描分析

//返回值:
//0,没有任何按键按下
//KEY0_PRES,KEY0按下
//KEY1_PRES,KEY1按下
//WKUP_PRES,WK_UP按下 
//注意此函数有响应优先级,KEY0>KEY1>WK_UP!!


u8 KEY_Scan(u8 mode) //mode:0,不支持连续按; 1,支持连续按;
{         
        static u8 key_up=1;//按键按松开标志 //flga
        if(mode==1) {key_up=1;}     
        if(key_up==1 &&(KEY0==0||KEY1==0||WK_UP==1)) //如果有一个按键按下
        {
                delay_ms(10);//去抖动 
                key_up=0;
                if(KEY0==0) return KEY0_PRES;
                else if(KEY1==0)return KEY1_PRES;
                else if(WK_UP==1)return WKUP_PRES; 
        }
        else if(KEY0==1&&KEY1==1&&WK_UP==0)
        {key_up=1;}
        return 0;// 无按键按下
}

首先必须搞懂static这个关键字,static申明的局部变量,存储在静态存储区;它在函数调用结束后,它的值会一直保留下来,所以说用static申明的变量具有记忆功能。

假设key0按下:

当mode为1的时候,支持连按,解释如下

if  ( mode) key_up = 1成立,进入下面的if语句,返回按键值,按键按着没有松开,main()程序继续调用KEY_Scan(1)按键扫描程序,由于mode=1,所以if(mode)key_up=1; 继续相关操作。

假设mode=0,设置成不支持长按。同时假设KEY0按下。

1. static u8 key_up=1;

2. if(mode==1) {key_up=1;} 这句话直接变成没有的语句了。 if(0==1) {key_up=1;} 0怎么可能等于1???

3.3.if(key_flag==1 &&(KEY0==0||KEY1==0||WK_UP==1)) ,由于key_up=1,假设按键key0又按下了。所以if语句成立。执行括号里面的内容。并且返回按键按下的值

4. 先消抖, key_up=0; 接着判断哪个按键按下,返回按键按下的值。

5.此时如果你还按着按键,也不会有作用了。 if(key_flag==1 &&(KEY0==0||KEY1==0||WK_UP==1)) 因为此时key_up=0; if语句不成立了。

6.当你一松开手,马上进入 else if(KEY0==1&&KEY1==1&&WK_UP==0) {key_up=1;} 当 按键都没有按下,{key_up=1;} key_up又被重新刷新了,又等于1了。

扫描二维码关注公众号,回复: 5418515 查看本文章

7.当你再次按下按键key0的时候,if(key_flag==1 &&(KEY0==0||KEY1==0||WK_UP==1)) 又成立了。又再次进入循环体。 实现了单次按键的效果

啊啊啊,还是要了解static的作用,以及它的值的变化情况,很简单!

猜你喜欢

转载自blog.csdn.net/qq_34447192/article/details/79860924
今日推荐