如图是一次按键按下时的电压信号波形。我画了一个假设的检测阈值,电压信号小于检测阈值时会被算作一次触发。可以看到,在达到稳定闭合前,它会两次达到检测阈值。假设两次触发之间的时间小于key_scan函数的执行时间,那么在这两次触发中,key_scan函数是怎样工作的呢?我们分mode = 0和mode = 1两种状况来看。
首先,不管参数mode为几,函数中定义的静态变量key在整个程序文件的执行过程中只会被初始化一次。key值在这个函数当中的作用是记录上一次函数被触发的状态;key = 0表示按键按下,key = 1表示无按键按下。
当mode = 0时,if (mode)这条语句的实际内容为if (0),也即if (假),因此不会执行后续的语句,key不会被设置为1。当第一次触发时,第二个if判断生效,函数执行延迟和返回值,并将0值赋给key,意为这次按键已被按下。第二次触发时,由于静态变量key不会再被赋初值,仍然为0,因此不满足if或if else的任何一个条件,该函数没有返回值。所以从现象上看,从第一次触发检测之后,LED就被点亮。直到释放按键,满足else if的条件,返回KEY_UNPRESS,key值被设为1,准备好下一次的检测。
由于key_scan函数在主函数里在while (1)无限循环中,当mode = 1时,每次调用函数,第一条if语句,也即if (真)都会把key值置为1,因此一次按下按钮,key_scan函数会无数次满足第二个if的条件,连续返回键值,这也就是“连续检测”和“单次检测”的区别。
另外,若第一次触发和第二次触发间的时间大于函数的执行时间,在函数层面会把它算作两次按下。因为在两次触发中还会有一次函数的执行,会返回值KEY_UNPRESS。
51单片机按键扫描实验对于key_scan函数的说明
最新推荐文章于 2024-02-08 12:30:41 发布