目录
器件选择
电路图
代码
1、LCD显示功能
1)LCD端口
2)字模的定义
3)提示符的显示
4)输入密码/重置密码时密码行的显示
2、总控制
1)主函数
2)key函数---判断用户想要进行的操作
3)display函数功能---接收用户输入数据并调用相应函数进行操作
4)判断密码正误
5)重置密码
6)in_code函数---将后一个数组内容复制到前一个数组中
程序运行效果
1、启动
2、输入密码时的显示
3、重置密码时的显示
4、其他提示符的显示
1)密码输入正确提示符
2)密码输入错误提示符
3)密码错误三次时的提示符
本设计是基于AT89C51单片机的电子密码锁设计,实现电子密码锁的基本功能。
器件选择
电路图
代码
1、LCD显示功能
1)LCD端口
/*LCD端口定义*/sbit RS=P2^0;sbit RW=P2^1;sbit E=P2^2;
2)字模的定义
/*字模的定义*/ uchar code string1[]={"input code"};//输入密码字符显示uchar code string2[]={"INCORRET"};//提示密码错误uchar code string3[]={"TRY AGAIN"};//输入密码字符显示uchar code string4[]={"CORRET"};//密码正确提示uchar code string5[]={"UNLOCK"};uchar code string6[]={"ERROR THREE TIMES"};//密码错误三次提示uchar code string7[]={"LOCK ---"};//密码正确提示uchar code string8[]={"input new code"};//提示输入新密码uchar code string9[]={"SUCCESS!"};//提示输入新密码/*坐标*/uchar data table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
3)提示符的显示
/*输出提示字符*//*input code*/void ic(uchar m){for(m=0;m<sizeof(string1);m++)lcd_write(m+3,0,string1[m]);}/*密码正确提示*/void correct(uchar m){ for(m=0;m<sizeof(string4);m++){lcd_write(m+5,0,string4[m]);}for(m=0;m<sizeof(string5);m++){lcd_write(0,m+5,string5[m]);}delay(1000);initialize();lcd_wcom(0x01); //清显示,光标复位到地址00H位置 }/*密码错误提示*/void incorrect(uchar m){for(m=0;m<sizeof(string2);m++){lcd_write(m+4,0,string2[m]);}for(m=0;m<sizeof(string3);m++){lcd_write(0,m+3,string3[m]);}delay(500);lcd_init(); //清显示,光标复位到地址00H位置initialize(); }/*密码错误三次提醒*/void three(uchar m){uint i;for(i=0;i<6;i++){for(m=0;m<sizeof(string6);m++){lcd_write(m,0,string6[m]);}for(m=0;m<sizeof(string7);m++){lcd_write(0,m+1,string7[m]);}delay(500);lcd_write(0,10,table[5-i]);lcd_write(0,11,'s');}lcd_init(); //清显示,光标复位到地址00H位置initialize();} /*输入新密码提示*/void new_code(uchar m){for(m=0;m<sizeof(string8);m++)lcd_write(m+1,0,string8[m]);}/*成功提示*/void new_su(uchar m){for(m=0;m<sizeof(string9);m++)lcd_write(m+5,0,string9[m]);delay(1000);lcd_init(); //清显示,光标复位到地址00H位置initialize();}/*输出input code*/void string_show(uchar choice){uchar m;lcd_init();switch(choice){case 1:ic(m);break;//输入提示case 2:correct(m);break;//正确提示case 3:incorrect(m);break;//错误提示case 4:three(m);break;//错误三次提示case 5:new_code(m);break;//输入新密码提示case 6:new_su(m);break;//重置密码成功default:break;}}
4)输入密码/重置密码时密码行的显示
/*显示密码初始位及用户进行输入时的状态*/uchar data nnumin[]={"- - - -"};uchar code nnum[]={"- - - -"};uchar code numshow[]={"* * * *"};/*初始化初始状态显示数组*/void initialize(){uint i;for(i=0;i<sizeof(nnum);i++){nnumin[i]=nnum[i];}}/*用户输入密码时的显示*/void input(uchar num) { uchar n,i;for(n=0;n<8;n++){if(sizeof(num)!=0){if(num!=0){for(i=0;i<num;i++){nnumin[2*i]=numshow[2*i];}}else initialize();//输入密码时按下A/B按钮,则重新开始}lcd_write(0,n+5,nnumin[n]);} }/*用户重置密码时显示*/void reset_code(uint c,uchar *num){uchar n,i;for(n=0;n<8;n++){if(c!=0){for(i=0;i<sizeof(num)+1;i++){if(num[i]!='-')nnumin[2*i]=table[num[i]]; }}lcd_write(0,n+5,nnumin[n]);}}
2、总控制
负责完成实现电子密码锁的重置密码,判断密码正误等功能。
1)主函数
void main(){ lcd_init(); //初始化lcdlcd_wcom(0x40); //设定CGRAM地址 LEDR=1;LEDG=1;while(1){key();//判断用户想要进行的操作(开锁or重置密码)if(keyin==1){display();}}}
2)key函数---判断用户想要进行的操作
bit keyin=0;//输入状态bit keyre=0;//判断是否为重置密码状态/*判断按键的内容*/void key(){num=KeyPro();if(num=='A'){keyin=~keyin;LEDR=0;}if(num=='B') {keyre=~keyre;//重置密码之前需先解锁display();reset();} }
3)display函数功能---接收用户输入数据并调用相应函数进行操作
密码行初始状态为“----”,输入的密码位会显示为“*”,用户完全输入4位密码后会判断密码正误并根据具体情况输出相应提示符,同时亮相应颜色LED灯。
若用户在输入密码中途触发按钮“A”或“B”则之前输入的密码会清空,密码行状态重置为“----”。
uchar data scode[]={0,0,0,0};//设置的密码,初始为0000uchar data ncode[]={0,0,0,0};//设置的密码,初始为0000uchar data ncode2[]={9,9,9,9};//储存用户输入的内容bit keyin=0;//输入状态bit keyre=0;//判断是否为重置密码状态uint inc=1;//判断是否出现连续三次的错误/*输入密码,若判断为正确则解锁,为错误则跳转界面重新输入*/void display(){uint count=1;string_show(1);input(0);while(count<5)//输入四位密码后验证并跳转{num=KeyPro();if(num!=0xff){if(num>=0&&num<=9){ncode2[count-1]=num;input(count);count++;}else//若在输入途中点击按钮A或B,则清零重新输入{memset(ncode2,'-',sizeof(ncode2));//ncode2重置count=1;input(0);}}}//判断后输出提示if(confirm()){LEDG=0;string_show(2); if(keyre!=1) keyin=0;//LCD停止显示inc=1;//红灯亮,绿灯灭LEDG=1;LEDR=0;}else {LEDR=0;if(inc<3){string_show(3);inc++; }else{//错误三次后设置密码失效,锁定5秒in_code(scode,ncode);//将密码初始化为最初状态string_show(4);inc=1;}count=1;}}
4)判断密码正误
uchar data ncode[]={0,0,0,0};//设置的密码,初始为0000uchar data ncode2[]={9,9,9,9};//储存用户输入的内容bit check;//判断输入密码是否正确/*验证密码,按钮A功能*/uchar confirm(void){uint i,j;LEDR=1;LEDG=1;for(i=0;i<4;i++){j=i;if(ncode[i]==ncode2[j]){check=1;}else{check=0;break; }}memset(ncode2,'-',sizeof(ncode2));return check;}
5)重置密码
uchar data ncode2[]={9,9,9,9};//储存用户输入的内容bit keyre=0;//判断是否为重置密码状态/*重置密码*/void reset(){uint count=1,cc;string_show(5);reset_code(0,ncode2);while(count<6){num=KeyPro();if(num!=0xff){if(num>=0&&num<=9){ncode2[count-1]=num;reset_code(1,ncode2);count++;cc=1;}else//若在输入途中点击按钮A或B,则停止{cc=0;count=6; break;}}}//若成功输入四位密码,则成功修改密码if(cc==1){in_code(ncode,ncode2);}string_show(6);keyre=0;}
6)in_code函数---将后一个数组内容复制到前一个数组中
void in_code(uchar *cc,uchar *cc1){uint i,j;for(i=0;i<4;i++){j=i;cc[i]=cc1[i];}}