关于KEY_Scan函数的理解

2019-08-22 15:33发布

u8 KEY_Scan(u8 mode)
{
        static u8 key_up=1; //按键松开
        if (mode)key_up=1;         
        if (key_up&&(KEY0==0||KEY1==0||WK_UP==1)) //因为key0和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;
}

函数如上所示,就是不明白这个按键松开的意思是认为的通过设置mode告诉单片机这个按键现在是松开的还是按下的?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
szczyb1314
1楼-- · 2019-08-22 20:33
这个程序中if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))与if((key_up==1)&&(KEY0==0||KEY1==0||WK_UP==1))   效果是一样的。mode为1支持连按时,判断之前的if(mode)key_up=1使key_up先为1,再判断时就只需要判断是那个按键按下了。mode为0不支持连按时,第一次按键按下时key_up为1,并且KEY0==0||KEY1==0||WK_UP==1中有一个成立时key_up被重新幅值0,由于它是static的,下次判断if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))时key_up为0就不再执行,你松开按键这个函数再执行一次时key_up又赋值为1.实现按下锁定。
Enoch
2楼-- · 2019-08-22 22:39
谢谢,不过还有两个问题,一个是,什么是连按,第二个是这个函数每次调用都会重新声明一个static的key_up,这个函数里面也不会重复用到 if (key_up&&(KEY0==0||KEY1==0||WK_UP==1)) ,所以key_up似乎不会在一次调用中进行两次判断,所以您之前说的   “由于它是static的,下次判断if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))时key_up为0就不再执行”  这个其实是没有第二次判断的情况出现的?
szczyb1314
3楼-- · 2019-08-23 02:06
本帖最后由 szczyb1314 于 2017-4-8 13:22 编辑
Enoch 发表于 2017-4-8 13:02
谢谢,不过还有两个问题,一个是,什么是连按,第二个是这个函数每次调用都会重新声明一个static的key_up, ...

连按就是按住长时间不松开,这时候你按一次但是是长时间没松开,会多次识别,单片机认为你按下了好多次。
按下锁定就是按下一次不松开单片机只认为是按了一次,等你松开再按一次就再识别一次。
这个函数可以通过mode区分连按识别多次还是按一次识别一次。
无字情书
4楼-- · 2019-08-23 06:06
 精彩回答 2  元偷偷看……

一周热门 更多>