單片機實現電子密碼鎖功能
這個時我嘗試實現論壇上的一個大佬文檔的電子密碼鎖,希望將其的stc15芯片換成52單片機,所以修改了部分和刪除了部分,但是為什么無法重現那個大佬的功能,問題是出在哪里?如果是都有錯,請問我應該如何修改
- #include <reg52.h> //包含52頭文件
- #include "intrins.h"
- #define uint unsigned int //宏定義uint代替unsigned int
- #define uchar unsigned char //宏定義uchar代替unsigned char
- #define out P0
- sbit lcdrs=P2^4;//液晶的RS端接P2.4口
- sbit lcdrw=P2^5;//液晶的RW端接P2.5
- sbit lcden=P2^6;// 液晶的EN使能端接P2.6口
- sbit buzzer =P1^0;//蜂鳴器
- uchar code keyvalue[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,
- 0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
- uint ver=0;
- void beep();
- void lcd_init();//初始化1602
- void write_data(uchar dat);
- void check_busy(void);
- void write_cmd(char cmd); //寫指令函數
- void lcd_clear();
- void xianshi(void);//LCD顯示函數
- void right1(void); //輸入密碼正確的顯示函數
- void wrong1(void); //輸入密碼錯誤后的顯示函數
- void verify(); //驗證密碼
- void copy(); //復制密碼
- void input();//輸入密碼
- void reset();//重置密碼
- uchar keyscan(void);
- uchar RIGHT[]="pass";
- uchar WRONG[]="Password Error";
- uchar SHURU[]="aaaaaaaaaa";
- uchar SHUZU[]="aaaaaaaaaa";
- uchar MIMA[]="000aaaaaaa";
- void delayms (uint xms) //毫秒函數定義
- {
- uint i,j;
- for(i=0;i<xms;i++)
- for(j=0;j<120;j++);
- }
- void main()
- { lcd_init();
- lcd_clear();
- while(1)
- { P1=0x0f;
-
- if((P1&0x0f)!=0x0f)
- { delayms(15);
- if((P1&0x0f)!=0x0f)
- { lcd_clear();
- copy(); //先對顯示的數組進行賦值,以免出現顯示錯誤
- input(); //輸入密碼
- if(keyscan()==12)
- lcd_clear();
- copy();
- input(); //若按下重置鍵,則重新輸入
- if(keyscan()==13)
- { verify(); //按下確認鍵,對密碼進行驗證
- if(ver==0)
- {lcd_clear();
- right1(); //密碼正確
- }
- else
- { lcd_clear();
- copy();
- wrong1(); //密碼錯誤
- }
- }
- if(keyscan()==15)
- {
- lcd_clear();
- copy();
- verify(); //按下重置密碼鍵之后,先確認之前輸入的密碼是否正確
- if(ver==0)
- reset(); //正確則重置密碼
- else
- {lcd_clear();
- wrong1();
- }
- }
- P1=0xf0;
- while((P1&0xf0)!=0xf0)
- { P1=0xf0;
- beep();
- }
- }
- }
- }
-
- }
- uchar keyscan(void)
- {
- uchar j,temp,i;
- uchar t=0xfe;
- P1=0xf0;
- if((P1&0xf0)!=0xf0)
- {
- for(i=0;i<4;i++)
- { P1=t;
- temp=P1;
- for(j=0;j<16;j++)
- { if(temp==keyvalue[j]) return(j);
- }
- t=_crol_(t,1);
- }
-
- }
- return(16);
- }
- void beep(void)
- {
- uchar i;
- for(i=0;i<10;i++)
- {
- delayms(50);
- buzzer=~buzzer;
- }
- buzzer=1;
- }
- /**********************檢查忙標志函數************************/
- void check_busy(void)
- {
- uchar dt;
- out=0xff;
- do
- {
- lcden=0;
- lcdrs=0;
- lcdrw=1;
- lcden=1;
- dt=out;
- }while(dt&0x80);
- lcden=0;
- }
- /**************************1602顯示****************************/
- void write_cmd(char cmd) //寫指令函數
- {
- check_busy();
- lcden=0;//再把EN拉低
- lcdrs=0;
- lcdrw=0;//先將RW拉低
- out=cmd;
- lcden=1;
- lcden=0;
- }
- void write_data(uchar dat) //寫數據函數
- {
- check_busy();
- lcden=0;//再把EN拉低
- lcdrs=1;
- lcdrw=0;//先將RW拉低
- out=dat;
- lcden=1;
- lcden=0;
- }
- /***************************初始化******************************/
- void lcd_init()//初始化1602
- {
- write_cmd(0x38);//顯示模式設置
- write_cmd(0x0c);//顯示開關,光標沒有閃爍
- write_cmd(0x06);//顯示光標移動設置
- write_cmd(0x01);//清除屏幕
- delayms(1);
- }
- void lcd_clear()
- { write_cmd(0x01);
- delayms(5);
- }
- void input()
- {
- uchar i=0,key;
- for(;i<10;)
- { P1=0xf0;
- if((P1&0xf0)!=0xf0)
- { delayms(15);
- if((P1&0xf0)!=0xf0)
- { if (keyscan()>=10) break; //確認有鍵按下后,如果按下的不是數字鍵0-9,則跳出循環
- key=keyscan();
- SHURU[i]=key+'0'; //將輸入的數字轉化為字符變量存入‘SHURU’和‘SHUZU'兩個數組中
- SHUZU[i]=SHURU[i];
- SHURU[i+1]='a'; //對"SHURU"數組的下一位賦值為a,避免在驗證密碼時出錯
- xianshi(); //顯示函數
- i++;
-
- P1=0xf0;
- while((P1&0xf0)!=0xf0)
- { P1=0xf0;
- beep();
- }
- }
- }
-
- }
-
- }
- void xianshi(void)
- { uchar m;
- uchar n=0;
- for (m=0x80;m<0x90;m++)
- {
- write_cmd(m);
- if(SHUZU[n]=='a'|| SHUZU[n]=='\0') break;
- write_data(SHUZU[n]);
- n++;
- }
- }
- void right1(void)
- { uchar m;
- uchar n=0;
- for (m=0x80;m<0x90;m++)
- {
- write_cmd(m);
- if(RIGHT[n]=='\0') break;
- write_data(RIGHT[n]);
- n++;
- }
- }
- void wrong1(void)
- { uchar m;
- uchar n=0;
- for (m=0x80;m<0x90;m++)
- {
- write_cmd(m);
- if(WRONG[n]=='\0') break;
- write_data(WRONG[n]);
- n++;
- }
- }
- void verify()
- { uchar i;
- ver=0;
- for(i=0;MIMA[i]!='*' && MIMA[i]!='\0';i++)
- { if(SHURU[i]!=MIMA[i] || SHURU[i+1]!=MIMA[i+1]) //驗證密碼是否正確
- {ver=1;
- break;
- }
- }
- }
- void copy()
- { uchar i=0;
- for(;i<10;i++)
- { SHUZU[i]='*';
- }
- }
- void reset()
- { uchar i,key;
- for(i=0;i<10;)
- { P1=0xf0;
- if((P1&0xf0)!=0xf0)
- { delayms(15);
- if((P1&0xf0)!=0xf0 )
- { if(keyscan()!=15)
- {
- if (keyscan()==13) break; //再確認要重置密碼后,把輸入的新密碼存入'SHUZU'數組中,若按下確認鍵則跳出
- key=keyscan();
- SHUZU[i]=key+'0';
- xianshi();
- i++;
- }
- P1=0xf0;
- while((P1&0xf0)!=0xf0)
- { P1=0xf0;
- beep();
- }
- }
- }
-
- }
- for(i=0;i<9;i++)
- {MIMA[i]=SHUZU[i];//將密碼存入“MIMA”數組中
- }
- lcd_clear();
- copy();
- }
復制代碼
|