level 4
SS闪S电SS
楼主
功能:按钮按一下LED灯亮,再按一下LED灯灭



不合理的方法1
intk=LOW;//设置7号口的初始状态为低电平
voidsetup(){
pinMode(2,INPUT_PULLUP);
pinMode(7,OUTPUT);
}
voidloop(){
int i;
i=digitalRead(2);
if(i==0)//每次按下不松开,灯其实一直再闪
k=!k;
digitalWrite(7,k);
}
这种方法没有注意到电平变化的抖动过程
按下时,没消抖,按下时的抖动时间内,if(i==0)成立了几次,灯的状态也就可能变化了几次
经过按下时的抖动时间之后,按下不放时,2号引脚的电压稳定为0,那么if(i==0)一直成立,灯的状态一直在改变
松开时,没消抖,松开时的抖动时间内,if(i==0)成立了几次,灯的状态也就可能改变了几次
总之 每次按按钮都无法预知灯的改变状态
不合理的方法2
intk=LOW;//设置7号口的初始状态为低电平
voidsetup(){
pinMode(2,INPUT_PULLUP);
pinMode(7,OUTPUT);
}
voidloop(){
int i;
i=digitalRead(2);
if(i==0)//每次按下不松开,灯其实一直再闪
{
delay(20);
i=digitalRead(2);
if(i==0)
{
k=!k;
digitalWrite(7,k);
}
}
}
按下时,消抖,if(i==0)成立一次,在按下的消抖时间结束后灯的状态只变一次
经过按下时的消抖时间后,按下不放时,2号引脚的电压稳定为0,if(i==0);一直成立,以大概每隔20ms的间隔,等的状态改变1次
松开时,
①因为20ms占程序执行时间的绝大部分时间,所以松开时很有可能在delay(20);中松开,没消抖完全,松开时的抖动时间内,if(i==0)成立多次,灯的状态也就可能改变几次
②在delay(20);执行之前松开,则松开时能消抖完全
③若在delay(20)后的i=digitalRead(2);执行之前松开,则松开时没有消抖,i的状态不确定
④若在delay(20)后的i=digitalRead(2);执行之后松开,则i仍未按下时稳定的0状态,只改变一次,之后循环时delay(20)将其按下时产生的抖动消抖
但就算按下和松开都完全消抖,中间按着不放,灯的状态也会又有多次改变
总之 每次按按钮抖无法预知灯的状态
合理方法1:
要么用每次按下/松开,消抖后的状态与原设定状态对比,之后设定状态取反,加上计数判断按的次数
intbuttonPin = 2;
intledPin = 7;
intledState = LOW;
intbuttonState=1;
intcount;
voidsetup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin,OUTPUT);
}
voidloop() {
int reading1 = digitalRead(buttonPin);
if(reading1!=buttonState){
delay(20);
int reading2 = digitalRead(buttonPin);
if(reading2 != buttonState){
count++;
buttonState = reading2;
}
if(count == 2){
ledState = !ledState;
count = 0 ;
digitalWrite(ledPin,ledState);
}
合理方法2:
如果直接比较按下时的状态,则引用while松开检测来限制
int LED =7;
int S =2;
int n =0;
char i;
int j =0;
voidsetup() {
pinMode(LED,OUTPUT);
pinMode(S,INPUT_PULLUP);
}
voidloop() {
int m = digitalRead(S);
if (m ==0 )
{
delay(20);
m = digitalRead(S);
if(m ==0)
{
while(digitalRead(S)==LOW)//松手后再循环执行loop函数时,在再次的循环中,上delay(20)面已经给了消抖时间
;
i=1;
n=!n;
}
}
if (i==1)
{
i=0;
digitalWrite(LED,n);
}
}
合理方法1和合理方法2 不仅都能保证消除按下和松开时的抖动干扰,还能防止按住不放时,像不合理方法1和不合理方法2那样 if(i==0)一直成立,导致改变灯亮灭的程序一直循环,未知次数地改变灯的状态(导致最后无法预判灯的状态)
2017年10月22日 08点10分
1



不合理的方法1intk=LOW;//设置7号口的初始状态为低电平
voidsetup(){
pinMode(2,INPUT_PULLUP);
pinMode(7,OUTPUT);
}
voidloop(){
int i;
i=digitalRead(2);
if(i==0)//每次按下不松开,灯其实一直再闪
k=!k;
digitalWrite(7,k);
}
这种方法没有注意到电平变化的抖动过程
按下时,没消抖,按下时的抖动时间内,if(i==0)成立了几次,灯的状态也就可能变化了几次
经过按下时的抖动时间之后,按下不放时,2号引脚的电压稳定为0,那么if(i==0)一直成立,灯的状态一直在改变
松开时,没消抖,松开时的抖动时间内,if(i==0)成立了几次,灯的状态也就可能改变了几次
总之 每次按按钮都无法预知灯的改变状态
不合理的方法2
intk=LOW;//设置7号口的初始状态为低电平
voidsetup(){
pinMode(2,INPUT_PULLUP);
pinMode(7,OUTPUT);
}
voidloop(){
int i;
i=digitalRead(2);
if(i==0)//每次按下不松开,灯其实一直再闪
{
delay(20);
i=digitalRead(2);
if(i==0)
{
k=!k;
digitalWrite(7,k);
}
}
}
按下时,消抖,if(i==0)成立一次,在按下的消抖时间结束后灯的状态只变一次
经过按下时的消抖时间后,按下不放时,2号引脚的电压稳定为0,if(i==0);一直成立,以大概每隔20ms的间隔,等的状态改变1次
松开时,
①因为20ms占程序执行时间的绝大部分时间,所以松开时很有可能在delay(20);中松开,没消抖完全,松开时的抖动时间内,if(i==0)成立多次,灯的状态也就可能改变几次
②在delay(20);执行之前松开,则松开时能消抖完全
③若在delay(20)后的i=digitalRead(2);执行之前松开,则松开时没有消抖,i的状态不确定
④若在delay(20)后的i=digitalRead(2);执行之后松开,则i仍未按下时稳定的0状态,只改变一次,之后循环时delay(20)将其按下时产生的抖动消抖
但就算按下和松开都完全消抖,中间按着不放,灯的状态也会又有多次改变
总之 每次按按钮抖无法预知灯的状态
合理方法1:
要么用每次按下/松开,消抖后的状态与原设定状态对比,之后设定状态取反,加上计数判断按的次数
intbuttonPin = 2;
intledPin = 7;
intledState = LOW;
intbuttonState=1;
intcount;
voidsetup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin,OUTPUT);
}
voidloop() {
int reading1 = digitalRead(buttonPin);
if(reading1!=buttonState){
delay(20);
int reading2 = digitalRead(buttonPin);
if(reading2 != buttonState){
count++;
buttonState = reading2;
}
if(count == 2){
ledState = !ledState;
count = 0 ;
digitalWrite(ledPin,ledState);
}
合理方法2:
如果直接比较按下时的状态,则引用while松开检测来限制
int LED =7;
int S =2;
int n =0;
char i;
int j =0;
voidsetup() {
pinMode(LED,OUTPUT);
pinMode(S,INPUT_PULLUP);
}
voidloop() {
int m = digitalRead(S);
if (m ==0 )
{
delay(20);
m = digitalRead(S);
if(m ==0)
{
while(digitalRead(S)==LOW)//松手后再循环执行loop函数时,在再次的循环中,上delay(20)面已经给了消抖时间
;
i=1;
n=!n;
}
}
if (i==1)
{
i=0;
digitalWrite(LED,n);
}
}
合理方法1和合理方法2 不仅都能保证消除按下和松开时的抖动干扰,还能防止按住不放时,像不合理方法1和不合理方法2那样 if(i==0)一直成立,导致改变灯亮灭的程序一直循环,未知次数地改变灯的状态(导致最后无法预判灯的状态)