初始密码1,2,3,4也可在函数init_main()函数中修改
密码锁上电后,锁合灯亮,初始密码为1,2,3,4 。
当输入的四位密码按确定键后,密码正确时锁开灯亮,锁合灯灭。当不正确时,锁合灯继续亮,蜂鸣器短报警
累计有三次密码输入错误时,蜂鸣器一直叫,键盘会自动锁定
在输入密码的过程中可以按取消键重新输入密码
在锁开的状态下按下修改密码键可以修改密码, 红灯闪三下后可以输入四位新密码,然后按确定键修改成功,锁合灯亮
若输入的新密码不为四位,红灯快闪三下,提醒没有修改成功,可以重新输入四位新密码
--------------------------------------------------------------------------------------------------------------------------------------------------------*/
/
*--------------------------------------------密码锁硬件简要说明-----------------------------------------------------------------------------
黄灯接P2.7,绿灯接P2.5,蓝灯接P2.3,红灯P2.1,蜂鸣器接P2.0 都是低电平时工作
键盘接法 行 P1.2 P1.1 P1.0 P1.3
列 P.4 P1.5 P1.6 P1.7
键盘分布 7 8 9 修改密码
4 5 6 取消
1 2 3 确定
0
---------------------------------------------------------------------------------------------------------------------------------------------------------*/
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar count; // 密码位计数
uchar pw[4]; // 初始密码存储区
uchar pwbuf[4]; // 输入密码存储区
uchar selfdefinebuf[4]; //自定义密码存储区
uchar error_cnt; //错误次数计数器
bit enterflag; // 确认键按下与否标志
bit pwflag; // 密码正确与否标志
bit last_pwflag; //前一次密码输入正确与否标志
sbit open=P2^5; //锁开指示灯,绿灯。低电平亮
sbit beep=P2^0; //蜂鸣器,低电平叫
sbit red=P2^1; //红灯,低电平亮
sbit close=P2^7; //锁合指示灯,黄。低电平亮
sbit youxiao=P2^3; //蓝灯,按键有效指示。低电平亮
void flashred_L(void); //闪红灯,表示可输入自定义密码
void flashred_S(void); //快闪红灯,重新输入自定义密码
void flashall(void); //三盏灯全亮,不能继续输入
/* 键消抖延时函数 */
void delay(void)
{
uint i;
for (i=8000;i>0;i--);
}
//蓝灯亮一下,再灭,用来表示按键按下有效
void youxiaoled()
{
youxiao=0;
delay();
youxiao=1;
}
// 蜂鸣器短叫 报警
void baojing()
{
beep=0;
delay();
beep=1;
delay();
beep=0;
delay();
beep=1;
}
/* 键扫描函数 */
uchar keyscan() //键盘扫描函数
{ uchar temp;
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(); //键盘去抖,
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{ youxiaoled(); //按键有效指示灯亮,即蓝灯亮
temp=P1;
switch(temp)
{
case 0xee: return 1;break;
case 0xde: return 2;break;
case 0xbe:return 3;break;
case 0x7e:return 11;break; //确定键 11
}
while(temp!=0xf0) //按键抬起检测
{
temp=P1;
temp=temp&0xf0;
}
}
else return 0;//无键按下返回0
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay();
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{ youxiaoled();
temp=P1;
switch(temp)
{
case 0xed: return 4;break;
case 0xdd: return 5;break;
case 0xbd:return 6;break;
case 0x7d:return 12;break;//取消键12
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
else return 0;
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay();
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{ youxiaoled();
temp=P1;
switch(temp)
{
case 0xeb:return 7;break;
case 0xdb: return 8;break;
case 0xbb:return 9;break;
case 0x7b:return 13;break;//重设密码键13
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
else return 0;
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay();
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{ youxiaoled();
temp=P1;
switch(temp)
{
case 0xe7:return 10;break;//数字0
default :break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
else return 0;
}
}
/* 密码比较函数 */
bit pwcmp(void)
{
bit flag;
uchar i;
for (i=0;i<4;i++)
{
if (pw[i]==pwbuf[i])
flag = 1;
else
{
flag = 0;
i = 4;
error_cnt++; //错误次数加1
}
}
return(flag);
}
//初始化设置函数
void init_main()
{
count = 0; // 初始没有输入密码,计数器设为0
error_cnt=0; //错误次数归0
enterflag = 0; // 没有按下确认键
pwflag = 0; // 密码标志先置为0
last_pwflag=0;
close=0; //锁合灯亮,其它灯灭
open = 1;
beep = 1;
red=1;
/* 假设内定密码为1234, 修改初始密码可在这里改*/
pw[0] = 1;
pw[1] = 2;
pw[2] = 3;
pw[3] = 4;
}
//长闪红灯,表示可输入自定义密码
void flashred_L(void)
{
red=0;
delay();
delay();
delay();
delay();
red=1;
delay();
delay();
delay();
delay();
red=0;
delay();
delay();
delay();
delay();
red=1;
delay();
delay();
delay();
delay();
red=0;
delay();
delay();
delay();
delay();
red=1;
}
//快闪红灯,重新输入自定义密码
void flashred_S(void)
{
red=0;
delay();
delay();
red=1;
delay();
delay();
red=0;
delay();
delay();
red=1;
delay();
delay();
red=0;
delay();
delay();
red=1;
}
void flashall(void)
{
beep=0;
open=0;
red=0;
delay();
delay();
beep=1;
open=1;
red=1;
}
/* 主程序 */
void main()
{
uchar j, key;
uchar tempkey;
init_main();
while(1)
{
if(error_cnt<3) //错误次数小于3
{
key = keyscan(); // 调用键盘扫描函数
if(key>0&&key<=10) //用户输入密码
{
if(key==10)
key=0;
if (count<4)
{
pwbuf[count] = key;
count++;
密码修改}
}
else if(key==11) // 确认键按下
{
enterflag = 1; // 确认键按下
if (count==4) // 只有输入4个密码后按确认键才作密码比较
{
delay( );
pwflag = pwcmp();
}
else
{
pwflag = 0; // 否则直接pmflag赋0
error_cnt++; //错误次数加一
}
last_pwflag=pwflag; //前一次密码输入正确与否标志
enterflag = 0; // 标志位置回0
count = 0; // 密码位计数器清零
delay( );
if (pwflag==1)
{open = 0; close=1;red=1;beep=1;} //密码正确时,绿灯亮,其它灯灭
else
{open=1;close=0;red=1;baojing(); } //密码错误时,黄灯亮并短报警
}
else if(key==12) // 取消键按下
{
count = 0; // 密码计数清零
}
else if(key==13) //重设密码键按下
{ open=1;
if(last_pwflag==1) //判断上次用户输入密码正确与否
{
flashred_L(); //闪红灯表示可输入自定义密码
while(last_pwflag)
{
tempkey=keyscan();
if(tempkey>0&&tempkey<=10) //用户输入密码
{
if(tempkey==10)
tempkey=0;
if (count<4)
{
selfdefinebuf[count] = tempkey; //保存用户自定义密码
count++;
}
}
else if(tempkey==11) //确认键按下
{
enterflag=1;
if(count==4)
{close=0;open=1;beep=1;
for(j=0;j<4;j++)
pw[j]=selfdefinebuf[j]; //修改密码存储数组
last_pwflag=0;
enterflag=0;
count=0;
}
else //如果输入数据
不足四位或大于四位,输入作废,重新输入
{
flashred_S(); //快闪红灯,重新输入自定义密码
count = 0; // 密码计数清零
}
}
}
}
}
}
else
{
while(1) //错误次数超过三次,停止工作蜂鸣器一直叫
beep=0;
}
}
}
发布评论