熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2019-10-19 19:11
正文摘要:簡易的單片機(jī)密碼鎖用不了,使用的是靜態(tài)數(shù)碼管+矩陣按鍵+蜂鳴器+繼電器 自己寫的程序,下載到單片機(jī)后按鍵可以使用,按下一個(gè)按鍵,數(shù)碼管會(huì)正常顯示按鍵按下對(duì)應(yīng)的字符,但按了123后蜂鳴器和繼電器沒有反應(yīng),下面 ... |
hhh402 發(fā)表于 2019-10-21 11:48 我知道這次的問題出在哪兒了,當(dāng)我按下1的時(shí)候 if(cunfang!=0) //判斷存放按鍵的數(shù)值是否為零,當(dāng)不為零的話相當(dāng)于輸入了一位密碼 { if(a1==0) //這個(gè)與else a1=1;配合保證每次按鍵只計(jì)算一次。a1必須是靜態(tài)變量或全局變量。 { a1=1; mi_ma=mi_ma+1; //記錄按下的次數(shù) password[mi_ma]=cunfang; //把按下的密碼存放到數(shù)組中 } else a1=0; 第一次循環(huán)的時(shí)候記錄下我的密碼1,然后我還沒松開的時(shí)候他第二次循環(huán)就來了這次把a(bǔ)1變成零,然后緊接著第三次循環(huán)記錄下第二位密碼還是1,我按下1的那一會(huì)兒它會(huì)循環(huán)很多次,然后都相當(dāng)于密碼是111 給這個(gè) else a1=0; 改成再加一個(gè)判斷語句,把矩陣鍵盤的數(shù)據(jù)傳送進(jìn)來,判斷矩陣鍵盤是否松開松開的話a1=0 |
hhh402 發(fā)表于 2019-10-21 11:48 還是不行,不過把密碼改成111可以工作 |
void judge_number()函數(shù)中的變量 int mi_ma=0;是局部變量,每運(yùn)行一次都會(huì)重新初始化為0,mi_ma永遠(yuǎn)為零,要改成: void judge_number() //檢測按下的三次是否依次為123 { static int mi_ma=0,a1=0; int n; if(cunfang!=0) //判斷存放按鍵的數(shù)值是否為零,當(dāng)不為零的話相當(dāng)于輸入了一位密碼 { if(a1==0) //這個(gè)與else a1=1;配合保證每次按鍵只計(jì)算一次。a1必須是靜態(tài)變量或全局變量。 { a1=1; mi_ma=mi_ma+1; //記錄按下的次數(shù) password[mi_ma]=cunfang; //把按下的密碼存放到數(shù)組中 } else a1=0; /*上面這7行(if else語句)是保證每次按鍵只計(jì)算一次,原理:原來a1=0,第一次按鍵時(shí)if語句運(yùn)行一次后a1=1,以后就不會(huì)再運(yùn)行if里面的語句 了,直到按鍵釋放后a1才會(huì)等于0,如此循環(huán)。這個(gè)語句要牢記,處理按鍵時(shí)都會(huì)用到。注意:這個(gè)語句里面的變量必須是靜態(tài)變量或全局變量。 */ } if(mi_ma==3) //判斷是否按下了三次 { mi_ma=0; //復(fù)位 password[0]=password[1]*100+password[2]*10+password[3]; 把前三次輸入的數(shù)字合并 if(password[0]==123) //設(shè)置正確密碼是123 并判斷用戶輸入的密碼是否為123 】 { | buzzer=0; | for(n=0;n<1000;n++) | 當(dāng)密碼輸入正確繼電器打開,蜂鳴器響 { | relay=~relay; | delay(10); | } 】 delay(6553400); //延時(shí)約1分鐘相當(dāng)于開鎖一分鐘 } } } |
hhh402 發(fā)表于 2019-10-20 10:18 還是不行,我把密碼改成111,無論是長按111還是短按111,繼電器都不會(huì)打開 keydown()函數(shù)應(yīng)該一次只能得到一個(gè)數(shù)值 |
hhh402 發(fā)表于 2019-10-20 10:18 還是不行,把密碼改成111,不管是長按111還是短按111繼電器都不會(huì)打開 我的keydown();函數(shù)按下一次應(yīng)該是只能返回一個(gè)數(shù)字 |
你的程序是按下1按鍵后一直輸出1直到松開按鍵為止,void judge_number() 這個(gè)函數(shù)是只要有按鍵按下就一直累加,按1就是1一直累加,累加3次之后得到3個(gè)1,如果你把密碼改成111,就可以打開繼電器了。修改的方法:void judge_number() 中加入判斷保證每按下一個(gè)按鍵只累加一次,才可以得到你想要的結(jié)果。 |
Powered by 單片機(jī)教程網(wǎng)