51单片机密码锁程序
- 格式:doc
- 大小:140.50 KB
- 文档页数:32
51单片机密码锁制作的程序和流程图(很详细) 一、基本组成:单片机小系统+4*4矩阵键盘+1602显示+DC电机基本电路:键盘和和显示键盘接P1口,液晶的电源的开、关通过P2.7口控制电机(控制口P2.4)二、基本功能描述:1.验证密码、修改密码a)锁的初始密码是123456(密码最长为10位,最短为1位)。
2.恢复初始密码a)系统可以恢复初始密码,否则一旦忘记密码而又不能恢复初始密码,该锁就永远打不开。
但是又不能让用户自行修改密码,否则其他人也可以恢复该初始密码,使得锁的安全性大大下降。
3.使系统进入低功耗状态a)在实际使用中,锁只有在开门时才被使用。
因而在大多数的时间里,应该让锁进入休眠状态、以降低功耗,这使系统进入掉电状态,可以大大降低系统功耗。
b)同时将LCD背光灯关闭4.DC电机模拟开锁动作。
a)DC电机启动时解除开锁把手的锁定,允许通过把手开锁。
DC电机不直接开锁,使得DC电机的功率不用太大,系统的组成和维护将变得简单,功耗也降了下来。
三、密码锁特点说明:1.0 输入将被以字符形式输入,最长为10位。
超过10位时系统将自动截取前10位、但不作密码长度溢出提示。
2.0 开锁10秒后不允许更改密码、并提示修改超时_进入初始态,需要重新输入密码方可再次修改密码。
3.0 系统未使用存储器存储密码故掉电后密码自动恢复为初始密码。
4.0 若2分钟内无任何操作,系统自动进入省电模式运行,同时关闭液晶显示,以节省电力。
5.0 输入密码正确后、电机允许开锁时间为5秒, 5秒后需要再次输入密码才可以再次开锁。
6.0 修改密码键和恢复初始密码键最好置于室内。
这是Proteus仿真结果:输入密码123456:显示结果:密码正确时电机启动、电机将持续5秒:这是键盘:开锁键是接INT0引脚接的一个独立按键,用于唤醒CPU工作、进而开启整个系统密码正确时可以修改密码:再次输入新密码,两次输入相同时、更改有效当然你可以随时放弃修改密码改进:1.0 密码锁的秘密没有存储,因而在掉电时最新的密码将丢失,重新上电后密码将恢复成为初始密码。
基于51单⽚机的电⼦密码锁—1这个程序是为了实现基于51单⽚机的电⼦密码锁,⽬前,程序解决了最重要之⼀的输⼊的密码和保存的正确密码相⽐较的问题。
通过定义了两个数组:uchar table2[6]; //临时密码保存uchar password[6]="123456"; //进门密码将输⼊的密码写⼊到table2[]中有⼀点需要特别注意:因为我写到table2[]数组内的是ASCII值的0-9,⽽ASCII值的0-9对应的符号却是NUT,SOH... (省略)所以在刚开始调试时,LCD1602屏幕输出的总是奇怪的字符,⽽不是我想要的0-9,通过查询ASCLL码表可以知道字符(0-9)对应的数值是48-57,所以我通过定义了⼀个新的数组,uchar smgduan[10]={48,49,50,51,52,53,54,55,56,57};以及lcd_write_data(smgduan[table2[i]]);的⽅式,实现了在LCD上输出字符0-9的功能。
在最后做两个数组⽐较时,开始同样出现了这个情况,因为数字1和字符1对应的ASCII值不同,所以password[i]不等于table2[i],需要进⾏转换,我的⽅式的是password[i]==smgduan[table2[i]];罗⾥吧嗦这个多,主要还是给未来的⾃⼰看看,当初犯得错误多么低级。
---------------------------------------------------分割线-----------------------------------------------------------------------------------下⼀版改进考虑把重复按键选择数字改成矩阵按键,加进些其他的功能。
---------------------------------------------------分割线-----------------------------------------------------------------------------------程序部分:/*这个⽅案是我写基于51单⽚机的电⼦密码锁过程中,未完成全部功能的程序。
AT89C51单片机电子密码锁#include"main.h"/******************** LCD PART START *******************************///5ms延时void Delay5Ms(void){unsigned int TempCyc = 5552;while(TempCyc--);}//读状态unsigned char ReadStatusLCM(void){LCM_Data = 0xFF;LCM_RS = 0;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;Delay5Ms();while (LCM_Data & Busy); //检测忙信号return(LCM_Data);}//写数据void WriteDataLCM(unsigned char WDLCM){ReadStatusLCM(); //检测忙LCM_Data = WDLCM;LCM_RS = 1;LCM_RW = 0;LCM_E = 0; //若晶振速度太高能够在这后加小的延时LCM_E = 0; //延时LCM_E = 1;}//写指令void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCM(); //根据需要检测忙LCM_Data = WCLCM;LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 0;LCM_E = 1;}//读数据unsigned char ReadDataLCM(void){LCM_RS = 1;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;return(LCM_Data);}void LCMInit(void) //LCM初始化{LCM_Data = 0;WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08,1); //关闭显示WriteCommandLCM(0x01,1); //显示清屏WriteCommandLCM(0x06,1); // 显示光标移动设置WriteCommandLCM(0x0C,1); // 显示开及光标设置}//按指定位置显示一个字符,x表示列,Y表示行void LCD_write_char(unsigned char X,unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y)X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; // 算出指令码WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码WriteDataLCM(DData);}//按指定位置显示一串字符void LCD_write_string(unsigned char X,unsigned char Y, unsigned char code *DData){unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1while (*DData) //若到达字串尾则退出'\0'就是0{if (X <= 0xF) //X坐标应小于0xF{LCD_write_char(X,Y, *DData); //显示单个字符DData++;X++;}}}/************/#include<reg52.h>#include<math.h>#define uchar unsigned char#define uint unsigned int/******************** LCD PART START *******************************/void delay(uint z) //延时{uint x,y;for(x=z;x>0;x--)for(y=124;y>0;y--);}sbit e=P2^5;sbit rw=P2^6;sbit sr=P2^7;uchar code name[]="zxs";uchar code name1[]="zcf";uchar code name2[]="zx";void write_com(uchar com){int rs;rs=0;P0=com;delay(5);e=1;delay(5);e=0;}void write_data(uchar date){int rs;rs=1;P0=date;delay(5);e=1;delay(5);e=0;}void init(){e=0;rw=0;write_com(0x38);write_com(0x0c); write_com(0x06);write_com(0x01);write_com(0x80);}void display(){uchar i;for(i=0;i<3;i++){write_data(name[i]);}write_com(0x80+0x40);for(i=0;i<3;i++){write_data(name1[i]);}}void main(){init();display();}#include <AT89X51.h>#define uchar unsigned charuchar starbuf[10];uchar wordbuf[8];uchar pw[8]={1,2,3,4,5,6,7,8};uchar pwbuf[8];uchar count=0;// 初始没有输入密码,计数器设为0 uchar inputflag=0;// 先处于密码输入状态,非密码修改状态bit enterflag=0; // 没有按下确认键bit pwflag=0;// 密码标志先置为0sbit warn=P3^6;#define lcd_data P0sbit rs=P2^7;sbit rw=P2^6;sbit e=P2^5;///////////////////////LCD1602驱动程序///////////////////////void delay_1602(unsigned int i){while(i--);}void enrw(){rs=0;rw=0;e=0;delay_1602(250);e=1;}write_data(uchar c){lcd_data=c;rs=1;rw=0;e=0;delay_1602(250);e=1;}init_lcd(void)//初始化{lcd_data=0x01;//清屏幕enrw();lcd_data=0x38;//数据长度为8位,双行显示,5*7字符。
课程设计基于51单片机的8位电子密码锁/****************************************************8位电子密码锁程序****************************************************/#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit fmq=P3^0;sbit led1=P3^1;sbit led2=P3^2;sbit scl=P3^4;sbit sda=P3^5;uchar code wela[]={0xf7,0xfb,0xfd,0xfe,0xef,0xdf,0xbf,0x7f};uchar code dula[]={0x24,0xbd,0xe0,0xa8,0x39,0x2a,0x22,0xbc,0x20,0x28,0x24,0xfb,0xee,0x31,0Xef};uchar temp;uchar *play;uchar screa_ok=0;uchar at24c02[8]={0,0,0,0,0,0,0,0}; //存储源密码uchar atdata[8]={11,11,11,11,11,11,11,11}; //存储开锁密码uchar atdata1[8]={12,12,12,12,12,12,12,12}; //存储HHHHHHHH uchar atdata2[8]={11,11,11,11,11,11,11,11}; //存储修改密码uchar atdata3[8]={14,14,14,14,14,14,14,14}; //存储换密码时输入的密码void at24c02_init();void start();void stop();void respons0(); //应答void respons1() ;void write_add(uchar address,uchar date);uchar read_add(uchar address);void read_data(void);void write_data(void);uchar keyscan();void display();void keyprocess();void delay(){ ;;;;;;}void delayms(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){// at24c02_init();play=atdata2;read_data();//write_data();while(1){display();keyprocess();}}void display(){uchar j;for(j=0;j<=7;j++){P1=0Xff;P0=dula[play[j]];P1=wela[j];P1=0Xff;}}uchar keyscan(){uchar num=0xff;P2=0xfe;temp=P2;temp=temp&0xf0;while(temp!=0xf0){delayms(5);temp=P2;temp=temp&0xf0;while(temp!=0xf0){temp=P2;switch(temp){case 0xee:num=1;break;case 0xde:num=2;break;case 0xbe:num=3;break;case 0x7e:num=4;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}}}P2=0xfd;temp=P2;temp=temp&0xf0;while(temp!=0xf0){delayms(5);temp=P2;temp=temp&0xf0;while(temp!=0xf0){temp=P2;switch(temp){case 0xed:num=5;break;case 0xdd:num=6;break;case 0xbd:num=7;break;case 0x7d:num=8;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}}}P2=0xfb;temp=P2;temp=temp&0xf0;while(temp!=0xf0){delayms(5);temp=P2;temp=temp&0xf0;while(temp!=0xf0){temp=P2;switch(temp){case 0xeb:num=9;break;case 0xdb:num=0;break;case 0xbb:num=11;break;case 0x7b:num=12;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}}}P2=0xf7;temp=P2;temp=temp&0xf0;while(temp!=0xf0){delayms(5);temp=P2;temp=temp&0xf0;while(temp!=0xf0){temp=P2;switch(temp){case 0xe7:num=13;break;case 0xd7:num=14;break;case 0xb7:num=15;break;case 0x77:num=16;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}}}return num;}void keyprocess(){uchar keydata=0;uchar i,error=0;static unsigned char flag=0;static unsigned char num=0;keydata=keyscan();if(keydata==0xff)return;switch(keydata){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 0:if(flag==1){if(num<8){atdata3[num]=13;atdata[num]=keydata;num++;}}elseif(flag==2){if(num<8){atdata1[num]=keydata;num++;}}else{if(num<8){atdata2[num]=13;atdata[num]=keydata;num++;}}break;case 11:if(flag==0&&num==8){num=0;for(i=0;i<8;i++){if(atdata[i]==at24c02[i]){;}elseerror=1;}}if(error==0){led1=0;delayms(1000);led1=1;}else{led2=0;fmq=0;delayms(500);led2=1;fmq=1;delayms(500);led2=0;fmq=0;delayms(500);led2=1;fmq=1;delayms(500);led2=0;fmq=0;delayms(500);led2=1;fmq=1;}error=0;for(i=0;i<8;i++){atdata[i]=11;atdata2[i]=11;}}elseif(flag==1&&num==8) { num=0;for(i=0;i<8;i++) {if(atdata[i]==at24c02[i]) ;else{error=1;}}if(error==0){flag=2;play=atdata1;}else{led2=0;fmq=0;delayms(500);led2=1;fmq=1;delayms(500);led2=0;fmq=0;delayms(500);led2=1;fmq=1;delayms(500);led2=0;fmq=0;delayms(500);led2=1;fmq=1;}error=0;for(i=0;i<8;i++){atdata[i]=11;atdata3[i]=14;}}break;case 12:if(num>0){num--;if(flag==1){atdata3[num]=14;}if(flag==2){atdata1[num]=12;}else{ atdata[num]=11;atdata2[num]=11;}}break;case 13:if(flag==0){play=atdata3;flag=1;}break;case 14:if(flag==2&&num==8){write_data();for(i=0;i<8;i++){at24c02[i]=atdata1[i];}led1=0;delayms(300);led1=1;delayms(300);led1=0;delayms(300);led1=1;delayms(300);led1=0;delayms(300);led1=1;for(i=0;i<8;i++){atdata2[i]=11;}play=atdata2;for(i=0;i<8;i++){atdata1[i]=12;}flag=0;num=0;}break;case 15:flag=0;play=atdata2;break;case 16:/* on=0;flag=0;num=0;play=atdata2;for(i=0;i<8;i++){atdata2[i]=11;}*/break;}}void start() //开始信号{sda=1;delay();scl=1;delay();sda=0;delay();}void stop() //停止{sda=0;delay();scl=1;delay();sda=1;delay();}void respons0() //应答{sda=0;delay();scl=1;delay();scl=0;delay();}void respons1() //应答{sda=1;delay();scl=1;delay();scl=0;delay();}void init(){sda=1;delay();scl=1;delay();}void write_byte(uchar date) {uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;scl=0;delay();sda=CY;delay();scl=1;delay();// scl=0;// delay();}scl=0;delay();sda=1;delay();}uchar read_byte(){uchar i,k;scl=0;delay();sda=1;delay();for(i=0;i<8;i++){scl=1;delay();k=(k<<1)|sda;scl=0;delay();}return k;}void write_add(uchar address,uchar date) {start();write_byte(0xa0);respons0();write_byte(address);respons0();write_byte(date);respons0();stop();}uchar read_add(uchar address) {uchar date;start();write_byte(0xa0);respons0();write_byte(address);respons0();start();write_byte(0xa1);respons0();date=read_byte();respons1();stop();return date;}void read_data(){uchar i;for(i=0;i<8;i++){delayms(5);at24c02[i]=read_add(i);delayms(5);}}void write_data(){uchar i;for(i=0;i<8;i++){delayms(5);write_add(i,atdata1[i]);delayms(5);}}。
#include <reg52.h>#define uint unsigned int#define uchar unsigned char#define KEY P3 //键盘输入端口#define No_key 20 //无按键时的返回值#define lcddata P2 //1602的数据输入端口sbit lcden= P1^2。
sbit lcdrs= P1^0。
sbit lcdrw= P1^1。
sbit light= P1^3。
sbit light1= P1^4。
uchar j 。
//用来统计输入个数的全局变量uchar aa。
//用来在定时器中计数的全局变量uchar code table[]= " Hello!"。
uchar code table1[]=" OK! " 。
uchar code table2[]="Enter please:" 。
uchar code key_table[16] ={1,2,3,10,4,5,6,11,7,8,9,12,0,13,14,15}。
uchar password[]={2,0,1,0,9,3} 。
//设定初始密码uchar save[6]。
//保存输入的数据uchar conflag 。
//确认标志uchar lockflag。
//锁键盘标志uchar startflag。
//开始标志void delay(uint z>。
//延时子函数void wright_com(uchar com>。
//写指令函数void wright_data(uchar date> 。
//写数据函数void init(>。
//初始化void display_OK(>。
// 显示OKvoid delete(>。
//删除输入的最后一个数uchar keyscan(> 。
自己做的基于单片机的密码锁设计(c语言设计)时间:2011-08-16 21:08:01 来源:作者:自己做的基于单片机的密码锁设计(c语言设计)系统说明该系统如图所示使用了80C51单片机、普通键盘、排阻、1602液晶。
该系统的功能:①该系统输入正确的密码LED灯会亮(其实就是很多操作都可以,用LED只是代表作用,主要是操作简单,效果明显。
)②系统可以修改密码;(系统断电后重启后必须用初始密码(初始密码是:000000)重新改密,当然修改的密码可以与掉电前的一样。
)具体操作:①系统开机时显示请输入密码的提示,直接输入密码#键确认②系统会自动提醒密码错误,数秒后系统会再次提醒重新输密码。
③在系统提醒输入密码的界面可以按*键修改密码,系统会提醒输入两次密码,并且会检查两次密码是否相同。
同则修改成功。
否则在数秒后可以重新按*键修改。
④在改密前(就是按了*键后系统)会提醒身份识别,请输入旧密码,系统判断旧密码正确方可更改密码。
源程序#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit lcdrs=P3^0;sbit lcdrw=P3^1;sbit lcden=P3^2;sbit h1=P1^0;sbit h2=P1^1;sbit h3=P1^2;sbit sa=P1^3;sbit sb=P1^4;sbit sc=P1^5;sbit sd=P1^6;sbit kd=P3^7;uchar code table[]=" PLEASE INPUT ";uchar code table1[]="CODE: ";uchar code table2[]=" *****WIN*****";uchar code table3[]=" PLEASE AFFIRM";uchar code table4[]=" *****FAIL*****";uchar code table5[]=" MODIFICATION";uchar code table6[]=" IDENTITY LIMITS ";uchar unm,M1,M2,M3,M4,M5,M6,sex,k1,k2,k3,k4,k5,k6,flge,flge1;uchar q1,q2,q3,q4,q5,q6,w1,w2,w3,w4,w5,w6,g;void delay(int z){int x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void delay1(int z){int x,y;for(x=z;x>0;x--)for(y=20000;y>0;y--);}void writen_(uchar ) //1602写命令{lcdrs=0;P0=;delay(1);lcden=1;delay(1);lcden=0;}void writen_dat(uchar dat) //1602写数据{lcdrs=1;P0=dat;delay(1);lcden=1;delay(1);lcden=0;}void main();void cheak_mima() //检查第二次确认密码是否与第一次相同{if(q1==w1){if(q2==w2){if(q3==w3){if(q4==w4){if(q5==w5){if(q6==w6){writen_(0x01);writen_(0x0f);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++){writen_dat(table5[unm]);delay(5);}writen_(0x80+0x40+1);for(unm=0;unm<14;unm++){writen_dat(table2[unm]);delay(5);}M1=w1;M2=w2;M3=w3;M4=w4;M5=w5;M6=w6;delay1(6);main();}/*-----------------------------------*/ //密码确认错误返回 writen_(0x01);writen_(0x80);for(unm=0;unm<14;unm++){writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x01);writen_(0x80);for(unm=0;unm<14;unm++){writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x01);writen_(0x80);for(unm=0;unm<14;unm++){writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x01);writen_(0x80);for(unm=0;unm<14;unm++){writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x01);writen_(0x80);for(unm=0;unm<14;unm++){writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x01);writen_(0x80);for(unm=0;unm<14;unm++){writen_dat(table4[unm]);delay(5);}delay1(6);main();}/*------------------------------------*/ //第二次确认密码void affirm_code(){P1=0x07;if(P1!=0x07)delay(1);if(P1!=0x07){P1=0x77;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:w1=1;break;case 1:w2=1;break;case 2:w3=1;break;case 3:w4=1;break;case 4:w5=1;break;case 5:w6=1;break;}sex++;}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');{case 0:w1=2;break;case 1:w2=2;break;case 2:w3=2;break;case 3:w4=2;break;case 4:w5=2;break;case 5:w6=2;break;}sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:w1=3;break;case 1:w2=3;break;case 2:w3=3;break;case 3:w4=3;break;case 4:w5=3;break;case 5:w6=3;break;}sex++;}}/*-------------------------------*/ P1=0x6f;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');{case 0:w1=4;break;case 1:w2=4;break;case 2:w3=4;break;case 3:w4=4;break;case 4:w5=4;break;case 5:w6=4;break;}sex++;}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:w1=5;break;case 1:w2=5;break;case 2:w3=5;break;case 3:w4=5;break;case 4:w5=5;break;case 5:w6=5;break;}sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 1:w2=6;break;case 2:w3=6;break;case 3:w4=6;break;case 4:w5=6;break;case 5:w6=6;break;}sex++;}}/*--------------------------------*/ P1=0x5f;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:w1=7;break;case 1:w2=7;break;case 2:w3=7;break;case 3:w4=7;break;case 4:w5=7;break;case 5:w6=7;break;}sex++;}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 1:w2=8;break;case 2:w3=8;break;case 3:w4=8;break;case 4:w5=8;break;case 5:w6=8;break;}sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:w1=9;break;case 1:w2=9;break;case 2:w3=9;break;case 3:w4=9;break;case 4:w5=9;break;case 5:w6=9;break;}sex++;}}/*-----------------------------------*/ P1=0x3f;if(h2==0) //0键扫描{delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 1:w2=0;break;case 2:w3=0;break;case 3:w4=0;break;case 4:w5=0;break;case 5:w6=0;break;}sex++;}}if(h3==0) //#键扫描{delay(1);if(h3==0){while(!h3);while(!flge1)cheak_mima();}}}}/*--------------------------------------*/ //修改密码自己做的基于单片机的密码锁设计(c语言设计)时间:2011-08-16 21:08:01 来源:作者:void set_mima(){P1=0x07;if(P1!=0x07)delay(1);if(P1!=0x07){P1=0x77;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:q1=1;break;case 1:q2=1;break;case 2:q3=1;break;case 3:q4=1;break;case 4:q5=1;break;case 5:q6=1;break;}sex++;}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:q1=2;break;case 1:q2=2;break;case 2:q3=2;break;case 3:q4=2;break;case 4:q5=2;break;case 5:q6=2;break;}sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 1:q2=3;break;case 2:q3=3;break;case 3:q4=3;break;case 4:q5=3;break;case 5:q6=3;break;}sex++;}}P1=0x6f;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:q1=4;break;case 1:q2=4;break;case 2:q3=4;break;case 3:q4=4;break;case 4:q5=4;break;case 5:q6=4;break;}sex++;}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:q1=5;break;case 2:q3=5;break;case 3:q4=5;break;case 4:q5=5;break;case 5:q6=5;break; }sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:q1=6;break;case 1:q2=6;break;case 2:q3=6;break;case 3:q4=6;break;case 4:q5=6;break;case 5:q6=6;break;}sex++;}}P1=0x5f;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:q1=7;break;case 1:q2=7;break;case 3:q4=7;break;case 4:q5=7;break;case 5:q6=7;break; }sex++;}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:q1=8;break;case 1:q2=8;break;case 2:q3=8;break;case 3:q4=8;break;case 4:q5=8;break;case 5:q6=8;break;}sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:q1=9;break;case 1:q2=9;break;case 2:q3=9;break;case 3:q4=9;break;case 5:q6=9;break;}sex++;}}P1=0x3f;if(h2==0) //0键扫描{delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:q1=0;break;case 1:q2=0;break;case 2:q3=0;break;case 3:q4=0;break;case 4:q5=0;break;case 5:q6=0;break;}sex++;}}if(h3==0) //#键扫描{delay(1);if(h3==0){while(!h3);writen_(0x01);writen_(0x0f);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++){writen_dat(table3[unm]);delay(5);}writen_(0x80+0x40);for(unm=0;unm<5;unm++){writen_dat(table1[unm]);delay(5);}sex=0;while(!flge1)affirm_code();}}}}void init();void cheak_identity2(){if(k1==M1){if(k2==M2){if(k3==M3){if(k4==M4){if(k5==M5){if(k6==M6){sex=0;init();while(!flge1)set_mima();}writen_(0x01);writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++){writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x01);writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x01);writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x01);writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x01);writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table4[unm]);delay(5);}delay1(6);main();}void cheak_identity() {P1=0x07;if(P1!=0x07)delay(1);if(P1!=0x07){P1=0x77;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=1;break;case 1:k2=1;break;case 2:k3=1;break;case 3:k4=1;break;case 4:k5=1;break;case 5:k6=1;break;}sex++;}}if(h2==0)delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=2;break;case 1:k2=2;break;case 2:k3=2;break;case 3:k4=2;break;case 4:k5=2;break;case 5:k6=2;break;}sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=3;break;case 1:k2=3;break;case 2:k3=3;break;case 3:k4=3;break;case 4:k5=3;break;case 5:k6=3;break;}sex++;}}/*-------------------------------*/ P1=0x6f;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=4;break;case 1:k2=4;break;case 2:k3=4;break;case 3:k4=4;break;case 4:k5=4;break;case 5:k6=4;break;}sex++;}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=5;break;case 1:k2=5;break;case 2:k3=5;break;case 3:k4=5;break;case 4:k5=5;break;case 5:k6=5;break;}sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=6;break;case 1:k2=6;break;case 2:k3=6;break;case 3:k4=6;break;case 4:k5=6;break;case 5:k6=6;break;}sex++;}}/*--------------------------------*/ P1=0x5f;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=7;break;case 1:k2=7;break;case 2:k3=7;break;case 3:k4=7;break;case 4:k5=7;break;case 5:k6=7;break;}sex++;}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=8;break;case 1:k2=8;break;case 2:k3=8;break;case 3:k4=8;break;case 4:k5=8;break;case 5:k6=8;break;}sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=9;break;case 1:k2=9;break;case 2:k3=9;break;case 3:k4=9;break;case 4:k5=9;break;case 5:k6=9;break;}sex++;}}/*-----------------------------------*/ P1=0x3f;if(h2==0) //0键扫描{delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=0;break;case 1:k2=0;break;case 2:k3=0;break;case 3:k4=0;break;case 4:k5=0;break;case 5:k6=0;break;}sex++;}}if(h3==0) //#键扫描{delay(1);if(h3==0){while(!h3);while(!flge1)cheak_identity2();}}}}/*---------------------------------------*/ //键盘扫描void keyscan(){P1=0x07;if(P1!=0x07)delay(1);if(P1!=0x07){P1=0x77;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=1;break;case 1:k2=1;break;case 2:k3=1;break;case 3:k4=1;break;case 4:k5=1;break;case 5:k6=1;break; }sex++;}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=2;break;case 1:k2=2;break;case 2:k3=2;break;case 3:k4=2;break;case 4:k5=2;break;case 5:k6=2;break;}sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=3;break;case 1:k2=3;break;case 2:k3=3;break;case 3:k4=3;break;case 4:k5=3;break;case 5:k6=3;break;}sex++;}}P1=0x6f;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=4;break;case 1:k2=4;break;case 2:k3=4;break;case 3:k4=4;break;case 4:k5=4;break;case 5:k6=4;break;}sex++;}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=5;break;case 1:k2=5;break;case 2:k3=5;break;case 3:k4=5;break;case 4:k5=5;break;case 5:k6=5;break;}}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=6;break;case 1:k2=6;break;case 2:k3=6;break;case 3:k4=6;break;case 4:k5=6;break;case 5:k6=6;break;}sex++;}}/*--------------------------------*/ P1=0x5f;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=7;break;case 1:k2=7;break;case 2:k3=7;break;case 3:k4=7;break;case 4:k5=7;break;case 5:k6=7;break;}}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=8;break;case 1:k2=8;break;case 2:k3=8;break;case 3:k4=8;break;case 4:k5=8;break;case 5:k6=8;break;}sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=9;break;case 1:k2=9;break;case 2:k3=9;break;case 3:k4=9;break;case 4:k5=9;break;case 5:k6=9;break;}sex++;}/*-----------------------------------*/ P1=0x3f;if(h1==0) //*键扫描{delay(1);if(h1==0){while(!h1);writen_(0x0f);writen_(0x06);writen_(0x80);for(unm=0;unm<16;unm++){writen_dat(table6[unm]);delay(5);}while(!flge1)cheak_identity();}}if(h2==0) //0键扫描{delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=0;break;case 1:k2=0;break;case 2:k3=0;break;case 3:k4=0;break;case 4:k5=0;break;case 5:k6=0;break;}sex++;}}if(h3==0) //#键扫描delay(1);if(h3==0){while(!h3);flge=1;}}}}/*-------------------------------------*/ //密码检查void init();void check_code(){if(k1==M1){if(k2==M2){if(k3==M3){if(k4==M4){if(k5==M5){if(k6==M6){writen_(0x01);kd=0;writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++){writen_dat(table2[unm]);delay(5);}delay1(6);kd=1;main();writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table4[unm]); delay(5);}delay1(6);main();}writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table4[unm]);delay(5);}delay1(6);main();}}writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table4[unm]);delay(5);}delay1(6);main();}void now_mima(){M1=0;M2=0;M3=0;M4=0;M5=0;M6=0;g=0;}void init(){if(g==0)now_mima();g=1;flge1=0;flge=0;sex=0;lcdrw=0;lcden=0;writen_(0x01);writen_(0x38);writen_(0x0f);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table[unm]);delay(5);}writen_(0x80+0x40);for(unm=0;unm<5;unm++) {writen_dat(table1[unm]);delay(5);}}void main(){while(1){init();set_mima();while(!flge)keyscan();check_code();}}。