密码锁的设计
- 格式:docx
- 大小:34.89 KB
- 文档页数:20
密码锁的设计1.数字式密码锁2.4-6位组成3.可修改密码4.三次输入错误报警#include <reg52.h>#define uint unsigned int#define uchar unsigned charsbit buzzer=P3^0;sbit rs=P2^6; //1602的数据/指令选择控制线sbit rw=P2^5; //1602的读写控制线sbit en=P2^7; //1602的使能控制线sbit key0=P3^7;uchar table[10];uchar keycmp[4];uchar keyword[4]={0,0,0,0};uchar num=0,flg=0,key=0,ala=0,in=0;void flagpd();void delay(uint x){uint i,j;for (i=x;i>0;i--)for (j=110;j>0;j--);}void alarm(){num=0;buzzer=0;delay(10000);buzzer=1;}void lcd_wcom(uchar com) //1602写命令函数{rs=0; //选择指令寄存器rw=0; //选择写P0=com; //把命令字送入P0delay(5); //延时一小会儿,让1602准备接收数据en=1; //使能线电平变化,命令送入1602的8位数据口en=0;}void lcd_wdat(uchar dat) //1602写数据函数{rs=1; //选择数据寄存器rw=0; //选择写P0=dat; //把要显示的数据送入P0delay(5); //延时一小会儿,让1602准备接收数据en=1; //使能线电平变化,数据送入1602的8位数据口en=0;}void lcd_init() //1602初始化函数{lcd_wcom(0x38); //8位数据,双列,5*7字形lcd_wcom(0x0c); //开启显示屏,关光标,光标不闪烁lcd_wcom(0x06); //显示地址递增,即写一个数据后,显示位置右移一位lcd_wcom(0x01); //清屏}void display(){ uchar i,j;j=num+0x46;lcd_wcom(0x80+j);i=keycmp[num];i=i+0x30;table[0]=i;lcd_wdat(table[0]);}void right(){uchar n=0;uchar code table1[]="welcome";lcd_wcom(0x01);lcd_wcom(0x84);for(n=0;n<7;n++){lcd_wdat(table1[n]);delay(200);}num=0;flg=2;in=1;}void indisplay(){uchar n=0;uchar code table5[]="input password";lcd_wcom(0x01);lcd_wcom(0x80);for(n=0;n<14;n++){lcd_wdat(table5[n]);delay(200);}}void setdisplay(){uchar n=0;uchar code table2[]="change password";lcd_wcom(0x01);lcd_wcom(0x80);for(n=0;n<15;n++){lcd_wdat(table2[n]);delay(200);}}void error(){uchar n,m;uchar code table3[]="ERROR!";uchar code table4[]="input again";lcd_wcom(0x01);lcd_wcom(0x85);for(n=0;n<6;n++){lcd_wdat(table3[n]);delay(200);}lcd_wcom(0x80+0x42);for(m=0;m<11;m++){lcd_wdat(table4[m]);delay(200);}ala=ala+1;num=0;}void set(){if(in==1){num=0;flg=1;setdisplay();in=0;}else {error();flagpd();} }void okdisplay(){uchar code table6[]="OK";lcd_wcom(0x01);lcd_wcom(0x87);for(n=0;n<2;n++){lcd_wdat(table6[n]);delay(200);}}void ok(){uchar i=0;if(flg==0){for(i=0;i<4;i++)if(keyword[i]!=keycmp[i]){error();return;}if(num==4){right();return;}}if(flg==1){if(num==4){num=0;for(i=0;i<4;i++)keyword[i]=keycmp[i];okdisplay();flg=2;return;}else error();return;}if(flg==2){indisplay();num=0;flg=0;return;}}void keyscan(){uchar temp1,temp2,temp3;P1=0xfe;//令第一列为低电平,检测第1列temp1=P1;if(temp1!=0xfe){delay(5); //去抖temp2=P1;if(temp1==temp2){switch(temp2){case 0xf6:if(num<4){key=1;keycmp[num]=key;display();num++;}else {error(); flagpd();}break;case 0xee:if(num<4){key=4;keycmp[num]=key;display();num++;}else {error(); flagpd();}break;case 0xde:if(num<4){key=7;keycmp[num]=key;display();num++;}else {error(); flagpd();}break;case 0xbe:set();break;}}}while(temp1!=0xfe) temp1=P1;//等待按键释放P1=0xfd;//检测第2列temp1=P1;if(temp1!=0xfd){delay(5); //去抖temp2=P1;if(temp1==temp2){switch(temp2){case 0xf5:if(num<4){key=2;keycmp[num]=key;display();num++;}else {error(); flagpd();}break;case 0xed:if(num<4){key=5;keycmp[num]=key;display();num++;}else {error(); flagpd();} break;case 0xdd:if(num<4){key=8;keycmp[num]=key;display();num++;}else {error(); flagpd();} break;case 0xbd:if(num<4){key=0;keycmp[num]=key;display();num++;}else {error(); flagpd();}break;}}}while(temp1!=0xfd) temp1=P1;//等待按键释放P1=0xfb;//检测第3列temp1=P1;if(temp1!=0xfb){delay(5); //去抖temp2=P1;if(temp1==temp2){switch(temp2){case 0xf3:if(num<4){key=3;keycmp[num]=key;display();num++;}else {error(); flagpd();} break;case 0xeb:if(num<4){key=6;keycmp[num]=key;display();num++;}else {error(); flagpd();} break;case 0xdb: if(num<4) {key=9;keycmp[num]=key;display();num++;}else {error(); flagpd();}break;case 0xbb:flagpd();break;}}}while(temp1!=0xfb) temp1=P1;//等待按键释放key0=1;temp3=key0;if(temp3!=1){ num=0;flg=0;in=0;indisplay();}}void flagpd(){if(flg==0) ok();if(flg==1) ok();if(flg==2) ok();else error(); }main(){lcd_init();indisplay();while(1){keyscan();if(ala==3){alarm();ala=0;}}}。