标题: 关于单片机按键控制的几句简单代码,求详解 [打印本页]

作者: carrots    时间: 2021-10-29 09:51
标题: 关于单片机按键控制的几句简单代码,求详解
单片机源程序如下:

if里面,为啥要这样写就可以检测sw是否按下呢,不理解呢。应该怎么理解好,还有好几个if,不知道怎么理解。求指点,感谢!~

作者: 294479435    时间: 2021-10-29 10:54
你觉得应该怎么写,跟他的区别在哪儿
作者: 13205495918    时间: 2021-10-29 11:08
那几个检测按键的就是为了按键消抖,sw摁下是0,取反就是1,if(为真)会执行,一直到while(!sw)相当于while(1)会一直在这循环等待,直到松开按键sw=1,while(!sw)相当于while(0),跳出这个while循环
作者: wulin    时间: 2021-10-29 11:11
都是判断真假,if(!SW) SW=0为真,while(!SW)SW=1为假。
作者: 岳12333    时间: 2021-10-29 11:15
低有效,按键端口默认为高电平,当按下之后,端口获取低电平,sw=0;!sw=1;在if()条件语句中,为真运行,什么时候为真呢?非0条件,可以理解为1有效,所以按键按下,sw=0;if(!sw)满足条件执行条件语句中内容,延时是预防消抖
作者: shiyonghf    时间: 2021-10-29 11:29
SW代表P2.0口的状态,开关按下,端口就是低电平,所以在括号里面判断SW是否为低电平,也就是0,如果SW是0,!SW就是1了,好几个if是为了隔一段时间重复判断一次啊,也就是连续好几次判断都是按下,则说明真的按下了,也就是用这种方式消抖
作者: 188610329    时间: 2021-10-29 11:57
你这里两个问题:
一、 !SW : "非SW"的意思  即: 当SW=1 时  !SW = 0,  当SW=0 时  !SW = 1.

二、 if,while 问题:     
1)if(!SW) :      如果,!SW 成立(结果为1)时, 那么,执行以下语句,否则跳过。
2) while(!SW) : 当  !SW 成立(结果为1)时, 则在此处循环,否则结束循环。

作者: dzc3458    时间: 2021-10-29 15:38
注释都写出来了,!SW是一个表达式,P2端口自带上拉也就是不按时高电平,不满足if条件,按下时低电平,满足if条件,执行if里的语句
作者: nbhmwj    时间: 2021-11-1 11:10
首先,要清楚开关按下和松开过程中的电信号变化情况,一般会有十几ms的抖动时间,如下图

其次,程序指令一般都很快,微秒级的,故循环查询时不延时处理会多次得到结果或高或低电平,会检测不到你想要的情况。
其它,如上面所说,不讲程序了

作者: carrots    时间: 2021-11-2 22:29
nbhmwj 发表于 2021-11-1 11:10
首先,要清楚开关按下和松开过程中的电信号变化情况,一般会有十几ms的抖动时间,如下图

其次,程序指令 ...

谢谢答主!感谢╰(*︶`*)╯
作者: weijoyer    时间: 2021-11-3 08:13
你要自己思考,改动这个程序,看看自己改动与原程序的区别,这样就容易摸清楚了
作者: zzxiao    时间: 2021-11-3 17:32
都是判断当前按键状态,按下前是1.那么按下后就是0,程序就运行到了按键按下的那里,再次检测就是消抖,程序最后再检测就可以判断按键是否松开。
作者: 51heify    时间: 2021-11-6 14:58
多层if嵌套是为了消除按键按下时产生的抖动,建议去看一下有关键盘章节的学习视频




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1