hhh402 发表于 2019-10-21 11:48 我知道这次的问题出在哪儿了,当我按下1的时候 if(cunfang!=0) //判断存放按键的数值是否为零,当不为零的话相当于输入了一位密码 { if(a1==0) //这个与else a1=1;配合保证每次按键只计算一次。a1必须是静态变量或全局变量。 { a1=1; mi_ma=mi_ma+1; //记录按下的次数 password[mi_ma]=cunfang; //把按下的密码存放到数组中 } else a1=0; 第一次循环的时候记录下我的密码1,然后我还没松开的时候他第二次循环就来了这次把a1变成零,然后紧接着第三次循环记录下第二位密码还是1,我按下1的那一会儿它会循环很多次,然后都相当于密码是111 给这个 else a1=0; 改成再加一个判断语句,把矩阵键盘的数据传送进来,判断矩阵键盘是否松开松开的话a1=0 |
hhh402 发表于 2019-10-21 11:48 还是不行,不过把密码改成111可以工作 |
void judge_number()函数中的变量 int mi_ma=0;是局部变量,每运行一次都会重新初始化为0,mi_ma永远为零,要改成: void judge_number() //检测按下的三次是否依次为123 { static int mi_ma=0,a1=0; int n; if(cunfang!=0) //判断存放按键的数值是否为零,当不为零的话相当于输入了一位密码 { if(a1==0) //这个与else a1=1;配合保证每次按键只计算一次。a1必须是静态变量或全局变量。 { a1=1; mi_ma=mi_ma+1; //记录按下的次数 password[mi_ma]=cunfang; //把按下的密码存放到数组中 } else a1=0; /*上面这7行(if else语句)是保证每次按键只计算一次,原理:原来a1=0,第一次按键时if语句运行一次后a1=1,以后就不会再运行if里面的语句 了,直到按键释放后a1才会等于0,如此循环。这个语句要牢记,处理按键时都会用到。注意:这个语句里面的变量必须是静态变量或全局变量。 */ } if(mi_ma==3) //判断是否按下了三次 { mi_ma=0; //复位 password[0]=password[1]*100+password[2]*10+password[3]; 把前三次输入的数字合并 if(password[0]==123) //设置正确密码是123 并判断用户输入的密码是否为123 】 { | buzzer=0; | for(n=0;n<1000;n++) | 当密码输入正确继电器打开,蜂鸣器响 { | relay=~relay; | delay(10); | } 】 delay(6553400); //延时约1分钟相当于开锁一分钟 } } } |
hhh402 发表于 2019-10-20 10:18 还是不行,我把密码改成111,无论是长按111还是短按111,继电器都不会打开 keydown()函数应该一次只能得到一个数值 |
hhh402 发表于 2019-10-20 10:18 还是不行,把密码改成111,不管是长按111还是短按111继电器都不会打开 我的keydown();函数按下一次应该是只能返回一个数字 |
你的程序是按下1按键后一直输出1直到松开按键为止,void judge_number() 这个函数是只要有按键按下就一直累加,按1就是1一直累加,累加3次之后得到3个1,如果你把密码改成111,就可以打开继电器了。修改的方法:void judge_number() 中加入判断保证每按下一个按键只累加一次,才可以得到你想要的结果。 |