![]() |
發布時間: 2019-10-19 19:11
正文摘要:簡易的單片機密碼鎖用不了,使用的是靜態數碼管+矩陣按鍵+蜂鳴器+繼電器 自己寫的程序,下載到單片機后按鍵可以使用,按下一個按鍵,數碼管會正常顯示按鍵按下對應的字符,但按了123后蜂鳴器和繼電器沒有反應,下面 ... |
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() 中加入判斷保證每按下一個按鍵只累加一次,才可以得到你想要的結果。 |