![](http://tiebapic.baidu.com/forum/w%3D580/sign=432940f3d816fdfad86cc6e6848d8cea/c5e9d3f50ad162d91615d9c454dfa9ec8813cd57.jpg?tbpicau=2025-02-20-05_de7d01c57e2d2b19705c4e400f78975e)
#include<reg51.h>
#include<lcd.h>
sbit P3_3 = P3^3;
sbit P2_7 = P2^7;
bit pw_flag;//密码正确与否
unsigned char str1[]="password:";//第一行显示的
unsigned char str2[]={0,0,0,0,0,0,0,0};//写入密码
unsigned char str3[]={0,0,0,0,0,0}; //密码初始值
unsigned char KeyDriver();
void KeyAction(unsigned char x);
void Passwordsetup();
void delay(unsigned int i)
{
unsigned int k;
for(k=0;k<i;k++);
}
void main()
{
unsigned char key;
InitLcd1602();//初始化LCD160
LcdShowStr(0,0,str1);//password: ****** 第一行第一列
LcdWriteCmd(0xC0);
// LcdShowStr(1,0,'A');
// LcdShowStr(3,0,'P');
// LcdWriteDat('A');
while(1)
{
key=KeyDriver();
KeyAction(key);
}
}
unsigned char KeyDriver()//判断按键是否按下
{
unsigned char button,temp,n,m,key;
unsigned char i,u;
P0=0x0F;//0000 1111
P2=0xF0; //1111 0000
button = P0;
if(button!=0x0F)
{
delay(1200); //延时消抖
button = P2; //再次读取
if(button!=0x0F)
{
for(i=0;i<4;i++)//循环列
{
u=0x01;//0001 0000 0010 0000 0100 0000 1000 0000
P2=~(u<<=i);// 1110 1111 1101 1111 1011 1111 0111 1111
temp=P0;
temp&=0x0F;
if(temp!=0x0F)
{
n=i;
switch(temp)
{
case 0x0E: m=0;key=m*4+n;break;//0000 1110
case 0x0D:m=1;key=m*4+n;break;//0000 1101
case 0x0B:m=2;key=m*4+n;break;//0000 1011
case 0x07:m=3;key=m*4+n;break;//0000 0111
default:break;
}
return key;
}
}
}
}
}
void KeyAction(unsigned char x)//按键动作
{
unsigned char i;
static unsigned count=0;
if(x>=0&&x<=9)
{
str2[count] =x;
//LcdShowStr(1,1,str2);
LcdWriteDat(x+0x30);//ASCII 0+0x30 ='0' //LcdWritedat(输入16进制)
count++;//5++ = 6
while(P0!=0x0F);//判断按键是否松开
}
// else if(x==11)
// {
// LcdWriteDat('A');
// }
else if(x==10)//按下确认件 第一个是个数是否符合 密码是否相同
{
pw_flag = 1;
if(count!=6)//不满足个数 //直接按也会count!=6 pw_flag
{
pw_flag = 0;
}
else//满足个数 str2 与 str3比较
{
for(i=0;i<6;i++)
{
if(str2[i]!=str3[i])//输入密码和初始化密码比较
{
pw_flag = 0;//密码错误
break;
}
}
}
while(P0!=0x0F); //判断10是否松开
if(pw_flag==0)//密码不正确 pw_flag = 0
{
LcdWriteCmd(0x01);
// LcdWriteCmd(0xC0);
LcdShowStr(4,0,"error");//显示密码错误
P3_3 = 1;//灯不亮
}
if(pw_flag==1)//密码正确 pw_flag =1
{
// LcdWriteCmd(0x8A);
// InitLcd1602();
LcdWriteCmd(0x01);
LcdShowStr(4,0,"pass");
// LcdWriteDat("pass");
P3_3=0;//灯亮
x=KeyDriver();
if(x==11)//只有密码输入正确 才能按下重设密码按键
{
LcdWriteDat('A');
while(P0!=0x0F);//判断按键是否松开
}
}
}
}
void Passwordsetup()//重设密码 更改初始值 str3[]
{
unsigned char key;
static unsigned char count=0;
unsigned char str4[]="password setup:";
LcdWriteCmd(0x01);//清屏
LcdShowStr(0,0, str4);//第一行第一列
while(1)//循环输入
{
key=KeyDriver();
LcdWriteDat('*');//显示*
str3[count]=key; //放入密码数组
count++;
if(count==6)
{
break;
}
}
}
想问下为什么当我按下10键以后 pw_flag=1 显示密码正确 我想再进去keyDriver()函数 按下11按键 void Passwordsetup()//重设密码 但是没办法做到呢