以前帮别人做过一个类似的
#include
#include
#include"lcd.c"
ucharkey;
ucharnum;
sbitalarm=P2^4;
sbitopen=P2^1;
ucharcodetable[]={'','1','2','3',
'4','5','6','7',
'8','9','0'};
voidkeyscan();
ucharhptable[10];
ucharpassword[6];
ucharwordbuf[6];
ucharfom[]="inputpassword:";
ucharchange[]="setmask:";
ucharstate1[]="right";
ucharstate2[]="error";
ucharsflag;
uchardflag,cnt;
ucharsetf,fset;
ucharflag;
voidmain()
{
ucharhp;
alarm=0;
flag=0;
setf=0;
fset=0;
dflag=0;
lcden=0;
lcdrw=1;
lcdrs=1;
P3=0x0f;
for(hp=0;hp<6;hp++)
{
password[hp]='8';
}
write(0x38,0); //0为写命令
delay(9);
write(0x08,0);
write(0x01,0);
write(0x06,0);
write(0x0c,0);
write(0x80,0);
for(hp=0;hp<15;hp++)
{
write(fom[hp],1);
}
while(1)
{
// alarm=!alarm;
keyscan();
if(setf==0)
{
if(num>=1&&num<=10)
{
write(0x80+0x40+cnt,0);
write('*',1);
wordbuf[cnt]=table[num];
cnt++;
num=0;
}
}
else
{
write(0x01,0);
write(0x80,0);
for(hp=0;hp<9;hp++)
{
write(change[hp],1);
}
fset=1;
cnt=0;
while(fset)
{
keyscan();
if(num>=1&&num<=10)
{
write(0x80+0x40+cnt,0);
write('*',1);
password[cnt]=table[num];
cnt++;
num=0;
}
if(num==11)
{
write(0x80+0x40+cnt-1,0);
write('\0',1);
cnt--;
num=0;
}
if(num==13)
{
flag=1;
num=0;
fset=0;
setf=0;
// gotochuz;
}
}
cnt=0;
}
if(flag==1)
{
write(0x01,0);
write(0x80,0);
for(hp=0;hp<15;hp++)
{
write(fom[hp],1);
}
flag=0;
}
if(num==11)
{
write(0x80+0x40+cnt-1,0);
write('\0',1);
cnt--;
num=0;
}
if(num==12)
{
if(dflag==1)
setf=1;
num=0;
}
if(num==13)
{
num=0;
write(0x80+0x40+10,0);
if(wordbuf[0]==password[0]&&wordbuf[1]==password[1]&&wordbuf[2]==password[2]&&wordbuf[3]==password[3]&&wordbuf[4]==password[4]&&wordbuf[5]==password[5])
{
for(hp=0;hp<5;hp++)
{
write(state1[hp],1);
}
sflag=0;
dflag=1;
}
else
{
for(hp=0;hp<5;hp++)
{
write(state2[hp],1);
}
sflag++;
}
}
if(sflag==3)
{
alarm=!alarm;
//delay(9);
}
if(num==14)
{
num=0;
cnt=0;
write(0x01,0);
write(0x80,0);
for(hp=0;hp<15;hp++)
{
write(fom[hp],1);
}
}
if(num==15)
{
if(dflag==1)
{
open=0;
dflag=0;
}
}
}
}
voidkeyscan()
{
uchartem,temp;
P3=0xfe;
temp=P3;
tem=temp&0xf0;
if(tem!=0xf0) //没有键按下时它的值是不变的,即仍为0XF0,而有键接下时要变
{
delay(5); //延时消抖
temp=P3;
tem=temp&0xf0;
if(tem!=0xf0) //确认有键按下
{
temp=P3;
tem=temp&0xf0; //这里也可以不要这一步,但下面的case里的值也要变
switch(tem)
{
case0xe0:num=0;break;
case0xd0:num=1;break;
case0xb0:num=2;break;
case0x70:num=3;break;
default: ;break;
}
while(tem!=0xf0) //等待松手
{
temp=P3;
tem=temp&0xf0;
}
}
}
P3=0xfd;
temp=P3;
tem=temp&0xf0;
if(tem!=0xf0)
{
delay(5);
temp=P3;
tem=temp&0xf0;
if(tem!=0xf0)
{
temp=P3;
tem=temp&0xf0;
switch(tem)
{
case0xe0:num=4;break;
case0xd0:num=5;break;
case0xb0:num=6;break;
case0x70:num=7;break;
default: ;break;
}
while(tem!=0xf0)
{
temp=P3;
tem=temp&0xf0;
}
}
}
P3=0xfb;
temp=P3;
tem=temp&0xf0;
if(tem!=0xf0)
{
delay(5);
temp=P3;
tem=temp&0xf0;
if(tem!=0xf0)
{
temp=P3;
tem=temp&0xf0;
switch(tem)
{
case0xe0:num=8;break;
case0xd0:num=9;break;
case0xb0:num=10;break;
case0x70:num=11;break;
default: ;break;
}
while(tem!=0xf0)
{
temp=P3;
tem=temp&0xf0;
}
}
}
P3=0xf7;
temp=P3;
tem=temp&0xf0;
if(tem!=0xf0)
{
delay(5);
temp=P3;
tem=temp&0xf0;
if(tem!=0xf0)
{
temp=P3;
tem=temp&0xf0;
switch(tem)
{
case0xe0:num=12;break;
case0xd0:num=13;break;
case0xb0:num=14;break;
case0x70:num=15;break;
default: ;break;
}
while(tem!=0xf0)
{
temp=P3;
tem=temp&0xf0;
}
}
}
}