STM32按键程序

来源:互联网 发布:旋转秋千知乎 编辑:程序博客网 时间:2024/06/04 19:16
u8 KEY_Scan(u8 mode){static u8 key_up=1;//按键按松开标志if(mode)key_up=1; //支持连按if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1)){delay_ms(10);//去抖动key_up=0;if(KEY0==0)return 1;else if(KEY1==0)return 2;else if(KEY2==0)return 3;else if(KEY3==1)return 4;}else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;return 0;// 无按键按下}

static是静态变量只会执行一次
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))这句意思是如果keyup为1,同时key0123中有一个按键被按下,那么if为真,执行取值操作,作为返回值付给主函数的t,
else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;这个意思是如果上面的if为假,那么如果key0123没有一个被按下,那么keyup置1,
我们来分析如果不支持连按的情况,mode为0,
一开始你没按按键那么if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))为假不执行后面的语句执行elseif应为keyup没变过,所以没什么用。
假设你按的是key0,那么KEY0==0||KEY1==0||KEY2==0||KEY3==1为真,执行后面的语句,把keyup置0后,取出按键值,作为函数返回值送会给t,
如果你继续按着当下次按键扫描时到来时,static u8 key_up=1,这个只执行一次,同时mode又为0,那么keyup还是0,
然后执行到if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))这句,由于keyup是0所以不会执行if语句,执行elseif,但是你此时有有一个按键是被按下的,所以elseif里的keyup=1也不会被执行,因为elseif也是假的。然后返回值还是0,这就达到了不支持连按的目的
如果你按过之后送手了那么再看,if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))这条语句为假应为keyup为0执行elseif,此时由于你没有按按钮,所以会执行keyup=1这条语句,当下次扫描按钮来临时又恢复到了最初的情况。
同理可以分析出mode为1时的支持连按的情况

0 0