首先必须搞懂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了。
7.当你再次按下按键key0的时候,if(key_flag==1 &&(KEY0==0||KEY1==0||WK_UP==1)) 又成立了。又再次进入循环体。 实现了单次按键的效果
啊啊啊,还是要了解static的作用,以及它的值的变化情况,很简单!