這是網上找的一個電子鎖程序,自己進行仿真了,但是輸入密碼環節不知道初始密碼,也好像沒法設定初始密碼,有沒有大神可以幫我看一下,是不是程序問題,還是我自己沒搞懂?
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit lcden=P1^2; sbit lcdrs=P1^0; sbit lcdrw=P1^1; sbit p17=P1^7; //開門指示:指示燈和蜂鳴器 uchar table1[8]={'N','A','M','E',':'}; //定義數碼管的第一行"name: " uchar table2[8]={'C','O','D','E',':'}; //定義數碼管的第二行"lode: " uchar name[10]={'0','1','2','3'}; uchar cod[20]={'0','0','0','0','1','1','1','1','2','2','2','2','3','3','3','3'}; //定義四個用戶,并設置對應的用戶和密碼, //其中用戶0定義為超級用戶0,用戶1、用戶2和用戶3為普通用戶 uint in_name; //保存輸入的用戶名 uint error_num; //輸入密碼錯誤的次數 uchar in_code1[4]; //保存第一次輸入的密碼 uchar in_code2[4]; //保存第二次輸入的密碼 uchar code sup[11]={'S','U','P','E','R',' ','U','S','E','R','!'}; //輸入用戶為超級用戶 uchar code nor[12]={'N','O','R','M','A','L',' ','U','S','E','R','!'}; //輸入用戶為普通用戶 uchar code err[6]={'E','R','R','O','R','!'}; //輸入用戶名或密碼錯誤 uchar wait[8]={'W','A','I','T','I','N','G','!'}; //等待 uchar aga[11]={'I','N','P','U','T',' ','A','G','A','I','N'}; //再次輸入密碼 uchar ame[9]={'A','M','E','N','D','I','N','G','!'}; //正在修改密碼 uchar fun[6]={'a','b','c','d','e','f'}; //ABCDEF功能鍵 //====================延時函數======================// void delay(uint x) { uint a,b; for(a=x;a>0;a--) for(b=110;b>0;b--); } //=================1602寫指令===============// void write_com(uchar com) { lcdrs=0; P0=com; delay(10); lcden=1; delay(10); lcden=0; } //==============1602寫數據================// void write_data(uchar dat) { lcdrs=1; P0=dat; delay(10); lcden=1; delay(10); lcden=0; } //===============1602在指定的位置顯示一個字符=============// void disp_char(uchar x,uchar y,uchar dat) { uint i; uchar addr; if(y==1) addr=0x80+x; else addr=0xc0+x; write_com(addr); for(i=0;i<2;i++); write_data(dat); for(i=0;i<2;i++); } //==================1602數碼管初始化函數==================// void display() { lcden=0; lcdrw=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); } //=============4*4鍵盤掃描函數=================// uint keyscan() { uchar temp; uint key=16; //key=16表示沒有按下任何鍵 P2=0xfe; //第一行被置為低電平,開始掃描第一行 temp=P2; temp=temp&0xf0; if(temp!=0xf0) { delay(1); temp=P2; temp=temp&0xf0; if(temp!=0xf0) { temp=P2; switch(temp) { case(0xee): key=0; break; case(0xde): key=1; break; case(0xbe): key=2; break; case(0x7e): key=3; break; } while(temp!=0xf0) //等待按鍵釋放 { temp=P2; temp=temp&0xf0; } } }
/////////////////////////////////////////// P2=0xfd; //第二行被置為低電平,開始掃描第二行 temp=P2; temp=temp&0xf0; if(temp!=0xf0) { delay(1); temp=P2; temp=temp&0xf0; if(temp!=0xf0) { temp=P2; switch(temp) { case(0xed): key=4; break; case(0xdd): key=5; break; case(0xbd): key=6; break; case(0x7d): key=7; break; } while(temp!=0xf0) //等待按鍵釋放 { temp=P2; temp=temp&0xf0; } } } //////////////////////////////////////// P2=0xfb; //第三行被置為低電平,開始掃描第三行 temp=P2; temp=temp&0xf0; if(temp!=0xf0) { delay(1); temp=P2; temp=temp&0xf0; if(temp!=0xf0) { temp=P2; switch(temp) { case(0xeb): key=8; break; case(0xdb): key=9; break; case(0xbb): key=10; break; case(0x7b): key=11; break; } while(temp!=0xf0) //等待按鍵釋放 { temp=P2; temp=temp&0xf0; } } } ////////////////////////////////////////////// P2=0xf7; //第四行被置為低電平,開始掃描第四行 temp=P2; temp=temp&0xf0; if(temp!=0xf0) { delay(1); temp=P2; temp=temp&0xf0; if(temp!=0xf0) { temp=P2; switch(temp) { case(0xe7): key=12; break; case(0xd7): key=13; break; case(0xb7): key=14; break; case(0x77): key=15; break; } while(temp!=0xf0) //等待按鍵釋放 { temp=P2; temp=temp&0xf0; } } } return(key); } /*/---------------B鍵的功能,刪除用戶--------------------// void delete_user() {
;
} //--------------D鍵的功能,添加用戶----------------------// void add_user() {
;
} */ //----------------E鍵的功能,修改密碼-------------// void amend_code() { uint i,j,k=16; display(); for(i=0;i<5;i++) disp_char(i,1,table1); //第一行顯示NAME:及對應的用戶名 disp_char(5,1,name[in_name]); for(i=0;i<5;i++) disp_char(i,2,table2); //第二行顯示CODE:AMENDING! for(i=0;i<9;i++) disp_char(i+5,2,ame); for(j=0;j<4;j++) {k=keyscan(); while(k==16) k=keyscan(); cod[in_name*4+i]=fun[k-10]; } } //================F鍵的功能,開門,蜂鳴器間斷響================// void open_door() { uint i,j; for(i=0;i<6;i++) for(j=0;j<10000;j++) { if((j/5000)%2==0) p17=1; else p17=0; } p17=0; } //===================超級用戶相關操作======================// void super_user() { uint k=16; uint flag=0; while(flag==0) { k=keyscan(); while(!(k==10||k==11||k==13||k==14||k==15)) //當A、B、D、E、F均未被按下時,繼續掃描 k=keyscan(); if(k==10) // 當A鍵被按下時,返回 flag=1; if(k==11) // 當B鍵被按下時,刪除用戶 { flag=1; // delete_user(); } if(k==13) // 當D鍵被按下時,添加用戶 { flag=1; // add_user(); } if(k==14) // 當E鍵被按下時,修改密碼 { flag=1; amend_code(); } if(k==15) // 當F鍵被按下時,開門 { flag=1; open_door(); } } delay(6000); } //===================普通用戶相關操作:改密、開門========================// void normal_user() { uint k=16; uint flag=0; while(flag==0) { k=keyscan(); while(!(k==14||k==15)) //當沒有按下E、F鍵時,繼續掃描 k=keyscan(); if(k==14); //對應于E鍵 { flag=1; //普通用戶完成一項操作 amend_code(); //修改當前用戶的密碼 } if(k==15) { flag=1; //普通用戶完成一項操作 open_door(); //F鍵的功能,開門 } } delay(6000); }
//=================第二次輸入密碼函數====================// void input_code2() { uint i,j,flag2=0; uint k2=16; error_num=0; while(flag2==0&&error_num<3) { for(i=0;i<4;i++) //輸入4位數密碼,保存在in_code2中 { k2=keyscan(); while(k2==16) k2=keyscan(); in_code2=fun[k2-10]; display(); for(j=0;j<5;j++) disp_char(j,1,table1[j]); //第一行顯示NAME:及對應的用戶名 disp_char(5,1,name[in_name]); for(j=0;j<5;j++) disp_char(j,2,table2[j]); //第二行先后顯示CODE:*,CODE:**,CODE:***,CODE:**** for(j=0;j<i+1;j++) disp_char(5+j,2,'*'); delay(10); } delay(10); //------檢驗輸入的密碼是否與第一次輸入的密碼一致-------// if(in_code2[0]==in_code1[0]&&in_code2[1]==in_code1[1]&&in_code2[2]==in_code1[2]&&in_code2[3]==in_code1[3]) { flag2=1; //輸入密碼正確,退出while循環 p17=1; //指示燈亮,蜂鳴器響,表示密碼正確 delay(400); p17=0; } else { flag2=0; //輸入密碼錯誤重新輸入 error_num++; display(); for(j=0;j<5;j++) //第一行顯示NAME:及對應的用戶名 disp_char(j,1,table1[j]); disp_char(5,1,name[in_name]); for(j=0;j<5;j++) //第二行顯示CODE:ERROR!2 disp_char(j,2,table2[j]); for(j=0;j<6;j++) disp_char(j+5,2,err[j]); disp_char(11,2,'2'); delay(10); } } } //=================第一次輸入密碼函數====================// void input_code1() { uint i,j,n,flag1=0,k1=16; error_num=0; while(flag1==0&&error_num<3) { for(i=0;i<4;i++) //輸入4位數密碼,保存在in_code1中 { k1=16; k1=keyscan(); while(k1==16) k1=keyscan(); in_code1=fun[k1-10]; display(); for(j=0;j<5;j++) disp_char(j,1,table1[j]); //第一行顯示NAME:及對應的用戶名 disp_char(5,1,name[in_name]); for(j=0;j<5;j++) disp_char(j,2,table2[j]); //第二行先后顯示CODE:*,CODE:**,CODE:***,CODE:**** for(n=0;n<i+1;n++) disp_char(5+n,2,'*'); delay(10); } delay(600); //-------------檢驗輸入的密碼是否正確---------// if(in_code1[0]==cod[in_name*4+0]&&in_code1[1]==cod[in_name*4+1]&&in_code1[2]==cod[in_name*4+2]&&in_code1[3]==cod[in_name*4+3]) { flag1=1; //輸入密碼正確,退出wlile循環,等待第二次輸入密碼 display(); for(j=0;j<5;j++) disp_char(j,1,table1[j]); //第一行顯示NAME:及對應的用戶名 disp_char(5,1,name[in_name]); for(j=0;j<5;j++) disp_char(j,2,table2[j]); //第二行顯示CODE:INPUT AGAIN for(j=0;j<11;j++) disp_char(j+5,2,aga[j]); //INPUT AGAIN delay(10); p17=0; //指示燈亮,蜂鳴器響,表示密碼正確 delay(400); p17=1; } else { flag1=0; //輸入密碼錯誤重新輸入 error_num++; display(); for(j=0;j<5;j++) //第一行顯示NAME:及對應的用戶名 disp_char(j,1,table1[j]); disp_char(5,1,name[in_name]); for(j=0;j<5;j++) //第二行顯示CODE:ERROR!1 disp_char(j,2,table2[j]); for(j=0;j<6;j++) disp_char(j+5,2,err[j]); disp_char(11,2,'1'); delay(100); } } }
//=================輸入用戶名函數===================// void input_name() { uint j,flag0=0,error_num=0; uint k0=16; while(flag0==0) { k0=keyscan(); while(k0==16) //k0=16表示未輸入用戶名 k0=keyscan(); //-----------------------------// if(k0>=0&&k0<4) //輸入為用戶0、用戶1、用戶2、用戶3 { flag0=1; //flag=1表示輸入一個正確的用戶 in_name=k0; //記下所輸入的正確用戶的序號 display(); for(j=0;j<5;j++) //第一行顯示NAME:及輸入的用戶 disp_char(j,1,table1[j]); disp_char(5,1,k0); for(j=0;j<5;j++) //第二行顯示CODE: disp_char(j,2,table2[j]); delay(10); p17=0; //指示燈亮,蜂鳴器響,表示用戶名正確 delay(400); p17=1; } //-------------------------------// if((k0>=4&&k0<=15)) //輸入的用戶錯誤 { flag0=0; error_num++; display(); for(j=0;j<5;j++) //第一行顯示NAME:ERROR! disp_char(j,1,table1[j]); disp_char(5,1,fun[k0-10]); for(j=0;j<6;j++) disp_char(j+7,1,err[j]); for(j=0;j<5;j++) //第二行顯示CODE: disp_char(j,2,table2[j]); delay(10); } } } void init() { uint m; p17=0; display(); //等待輸入用戶名 for(m=0;m<5;m++) disp_char(m,1,table1[m]); for(m=0;m<8;m++) disp_char(m+7,1,wait[m]); for(m=0;m<5;m++) //第二行顯示CODE: disp_char(m,2,table2[m]); delay(10); } //====================主函數=====================// void main() { uint m; init(); while(1) { input_name(); //進入用戶名輸入函數 input_code1(); //用戶名正確,接下來第一次輸入密碼 if(error_num<3) { input_code2(); //第一次輸入密碼正確,第二次輸入密碼 if(error_num<3) { if(in_name==0) { // display(); for(m=0;m<5;m++) //第一行顯示NAME:及對應的用戶名 disp_char(m,1,table1[m]); disp_char(5,1,name[in_name]); for(m=0;m<11;m++) //第二行顯示輸入用戶為超級用戶 disp_char(m,2,sup[m]); delay(10); super_user(); //進入超級用戶相關操作 } else { // display(); for(m=0;m<5;m++) //第一行顯示NAME:及對應的用戶名 disp_char(m,1,table1[m]); disp_char(5,1,name[in_name]); for(m=0;m<12;m++) //第二行顯示輸入用戶為普通用戶 disp_char(m,2,nor[m]); delay(10); normal_user(); //進入普通用戶相關操作 } } } delay(500); } }
|