单片机电子密码锁可以修改设置密码基于51单片机与AT24C02与LCD1602显示Word文档格式.docx
《单片机电子密码锁可以修改设置密码基于51单片机与AT24C02与LCD1602显示Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机电子密码锁可以修改设置密码基于51单片机与AT24C02与LCD1602显示Word文档格式.docx(15页珍藏版)》请在冰点文库上搜索。
"
;
ucharDSY_BUFFER1[16]="
ucharUserpassword[6]={0};
sbitrs=P0^4;
sbitrd=P0^3;
sbitlcden=P0^2;
sbitled=P3^0;
ucharcodetable2[]="
123456"
ucharcodetable[]="
YourPassword..."
voiddelayms(uintz)
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
voiddelay()//短延时,两个机器周期,做总线的延时用
{;
voidwrite_com(ucharcom)
rs=0;
rd=0;
lcden=0;
P2=com;
delayms(3);
lcden=1;
voidwrite_date(uchardate)
rs=1;
P2=date;
voidDisplay_String(uchar*p,ucharcom)
{uchari;
write_com(com);
for(i=0;
i<
16;
i++)
{
write_date(p[i]);
}
voidinit_lcd()
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
Display_String(table,0x80);
Display_String("
LockOK!
0xc0);
voidstart()
sda=1;
scl=1;
delay4us();
sda=0;
scl=0;
voidstop()
voidinit()//初始化
sda=1;
delay();
scl=1;
voidack()
voidnoack()
ucharrecbyte()
uchari,rd;
rd=0x00;
8;
scl=1;
rd<
<
=1;
rd|=sda;
delay4us();
scl=0;
returnrd;
ucharsendbyte(ucharwd)
uchari;
bitack0;
sda=(bit)(wd&
0x80);
_nop_();
wd<
ack0=!
sda;
returnack0;
ucharRecstring(ucharslave,ucharsubaddr,uchar*buffer,ucharn)
start();
if(!
sendbyte(slave))return0;
sendbyte(subaddr))return0;
sendbyte(slave+1))return0;
n-1;
buffer[i]=recbyte();
ack();
buffer[n-1]=recbyte();
noack();
stop();
return1;
ucharSendstring(ucharslave,ucharsubaddr,uchar*buffer,ucharn)
n;
if(!
sendbyte(buffer[i]))return0;
voidclear_password()
6;
Userpassword[i]='
'
DSY_BUFFER[i]='
ucharKeys_Scan()
{
uchartemp,keynum;
P1=0x0F;
delayms(5);
temp=P1^0x0F;
switch(temp)
case1:
keynum=0;
break;
case2:
keynum=1;
case4:
keynum=2;
case8:
keynum=3;
break;
P1=0xF0;
temp=P1>
>
4^0x0F;
keynum+=0;
keynum+=4;
keynum+=8;
keynum+=12;
delayms(600);
returnkeynum;
voidmain()
{uchartemp,i=0,j=0,k=0,n;
ucharIS_valid_user;
beep=1;
init();
init_lcd();
aa=Sendstring(0xa0,1,table2,6);
aa=Recstring(0xa0,1,buffer,6);
delayms(10);
P1=0x0f;
while
(1)
{
if(P1!
=0x0f)
{
temp=Keys_Scan();
switch(temp)
case0:
case1:
case2:
case3:
case4:
case5:
case6:
case7:
case8:
case9:
if(i<
=5)//密码限制在6位以内
Userpassword[i]=temp;
*'
Display_String(DSY_BUFFER,0xc0);
i++;
}
break;
case10:
//按A键开锁
for(k=0;
k<
k++)
{
if(buffer[k]==(Userpassword[k]+48))
flag=1;
else
flag=0;
}
if(flag==1)
{flag=0;
i=0;
led=0;
//点亮LED
clear_password();
OPENOK!
IS_valid_user=1;
j=0;
else
{
j++;
led=1;
//关闭LED
ERROR!
Havetry"
write_com(0xcf);
write_date(0x30+j);
IS_valid_user=0;
i=0;
case11:
//按B键上锁
case12:
//按C键设置新密码
//如果是合法用户则提示输入新密码
if(!
IS_valid_user)
{
i=0;
Display_String("
Norights!
delayms(1000);
0x80);
}
NewPassword:
case13:
//按D键保存新密码
IS_valid_user)
{i=0;
delayms(1000);
Display_String("
{i=0;
init();
delayms(5);
for(k=0;
Userpassword[k]=Userpassword[k]+48;
aa=Sendstring(0xa0,1,Userpassword,6);
Display_String(table,0x00);
PasswordSaved!
Dolockagian?
}
case14:
//按E键消除所有输入
break;
case15:
//清除一位
if(i!
=0)i--;
for(n=0;
n<
i;
n++)
DSY_BUFFER1[n]='
Display_String(DSY_BUFFER1,0xc0);
P1=0x0f;
}
if(j==3)
{Display_String("
THIEF!
!
"
j=0;
beep=0;
}