分析代码之前首先要搞明白C语言的一个关键字static,static申明的局部变量,存储在静态存储区;在这里相当于定义了一个static局部变量,下面是重点:static局部变量只被初始化一次,下一次根据上一次的结果值。意识就是说,这句话只跑一次!
我们主要看看KEY_Scan()这个函数,这个函数是带参数mode的,且有返回值,当初我跟大部分网友的疑惑在于为啥mode为1就支持连续按,为0就不支持呢,原理是啥?代码读一遍下来感觉为0为1没差啊。
当我们的mode为0的时候,我们的if(mode)key_up=1; 这一句就不执行,为什么呢?因为if(条件如果为真)执行后面的部分,我们知道0 是假非0就是真 ,所以0为假,该句作废。
然后它是怎么实现不支持长按的呢?我们来看代码,在上图, static申明静态局部变量key_up=1,
mode为0,if(mode)key_up=1;不执行。来到这一句代码
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1)),&&这个是与,就是说2个条件同时满足才执行if里面的内容,也可以理解为为真的条件;||是或,也就是说只需要满足其中一个条件就行。key_up为1,&&上(KEY0==0||KEY1==0||KEY2==0||WK_UP==1)也就是当我们的任意一个按键按下的时候就可以执行if里面的内容。进入if里面,我们让key_up=0,然后判断我们到底是哪个按键按下,然后它们返回对应的返回值。因为我们的key_up=0,所以不会再次进入if里面来,当我们松开按键时,执行else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1,也就是任意按键松开,key_up=1。这样就完成了一次按键的按下和松开,注意的是我们只有松开按键的时候才能按下一次。
下面来分析按键是如何支持连续按的:
当我们的mode=1时,if(mode)key_up=1这一句话就被执行,同样的按键按下,也是进入if里面去,但是我们不松开按键,按键还是会再次进入我们的if里面,因为我们mode为1,始终会把我们的key_up=1,而我们的按键是按下的,if的&&这个满足,会再次判断哪个按键按下,返回对应的返回值。就达到了按键连续按的效果。