有關用89S51作密碼鎖的問題~ |
缺席
|
cliff1989
一般會員 發表:6 回覆:2 積分:1 註冊:2009-03-23 發送簡訊給我 |
如題,要求是透過4x4鍵盤輸入4個值,每輸入一個值文字型20X2LCD顯示一個*字號,輸入完4個值按鍵盤的0,判斷密碼正確或錯誤~正確顯示OK,錯誤顯示ERROR,以下是程式碼,但不知錯在哪...通電後畫面就顯示一個*然後卡住,麻煩有寫過相關類似程式的高手們給些提示...
[code cpp] #include #define RS P3_0 #define RW P3_1 #define E P3_2 #define DB P1 void init(void); void position(char line,column); void wrins(char instruction); void display(char *string); void wrdata(char d); void delayms(unsigned int time); char keypad(void); char a,b,c,d,n; code char string1[]={ "*" }; code char string2[]={ "OK" }; code char string3[]={ "ERROR" }; main() { init(); keypad(); while(keypad()!= 0xff) { a=keypad(); position(1,1); display(string1); } keypad(); while(keypad()!= 0xff) { b=keypad(); position(1,2); display(string1); } keypad(); while(keypad()!= 0xff) { c=keypad(); position(1,3); display(string1); } keypad(); while(keypad()!= 0xff) { d=keypad(); position(1,4); display(string1); } n=keypad(); if(n==0) { if(a==1 && b==2 && c==3 && d==4) { position(2,1); display(string2); } else { position(2,1); display(string3); } } } void init(void) { delayms(30); wrins(0x38); wrins(0x38); wrins(0x38); wrins(0x38); wrins(0x08); wrins(0x01); wrins(0x06); wrins(0x0c); } void position(char line,column) { unsigned char instruction; line--; column--; instruction=0x80 (0x40*line column); wrins(instruction); } void wrins(char instruction) { RS=0; RW=0; E=0; delayms(1); E=1; DB=instruction; delayms(1); E=0; delayms(8); } void display(char *string) { char k=0; while(string[k] !=0x00) { wrdata(string[k]); k ; } } void wrdata(char d) { RS=1; RW=0; E=0; delayms(1); E=1; DB=d; delayms(1); E=0; delayms(1); } void delayms(unsigned int time) { unsigned int n; while(time>0) { n=120; while(n>0) n--; time--; } } char keypad(void) { char key=0xff; P2=0x7f; if(P2_3==0) key=15; if(P2_2==0) key=11; if(P2_1==0) key=10; if(P2_0==0) key=0; P2=0xbf; if(P2_3==0) key=14; if(P2_2==0) key=3; if(P2_1==0) key=2; if(P2_0==0) key=1; P2=0xdf; if(P2_3==0) key=13; if(P2_2==0) key=6; if(P2_1==0) key=5; if(P2_0==0) key=4; P2=0xef; if(P2_3==0) key=12; if(P2_2==0) key=9; if(P2_1==0) key=8; if(P2_0==0) key=7; return key; } [/code] 編輯記錄
cliff1989 重新編輯於 2009-05-18 20:58:51, 註解 無‧
|
阿信
版主 發表:111 回覆:983 積分:813 註冊:2005-03-10 發送簡訊給我 |
你的主程式架構有問題!
考慮如下的架構: unsigned char K; unsigned char PW[4],PW_cnt; main() { init(); PW_cnt=0; while(1) { K=keypad(); if (K!=0xFF) { if (K==0) { if (PW[0]==1 && PW[1]==2 && PW[2]==3 && PW[4]==4) { position(2,1); display(string2); } else { position(2,1); display(string3); } PW[0]=0; PW[1]=0; PW[2]=0; PW[3]=0; PW_cnt=0; delayms(5000); } else { PW[PW_cnt]==K; if (PW_cnt<3) PW_cnt ; position(1,PW_cnt 1); display(string1); } } } } 使用全形空格,勿直接複製。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |