1、密码锁控制使用4X4键盘,显示使用LCD芯片LM016L或LM016L。
2、设定的初始密码是6位阿拉伯数字123456。
3、当逐位输入密码时,在LCD上逐一显示当前数字,并将前一位显示的数字改为号,同时在LCD上显示当前为第几次输入密码。(例密码123456,输入时LCD上分别显示为1;2;3;4;5;6;确认键按下后显示为。)
4、当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则门开,此处用发光二极管长亮一秒钟作为提示,并在LCD上做相应的提示。
5、若密码不正确,则可以重新输入密码,如连续三次输入错误,则禁止输入,并有连续一分钟的报警声,并在LCD上做相应的提示。
6、所用时间间隔用ATmega128的定时器完成。
部分程序:
//************************************************************
// 键盘扫描子程序,采用逐键扫描的方式
//**********************************************************************
uchar Key_DownScan(void)
{
uchar statevalue,key_checkin,key_check;
key_io=0xf0; //在IO口由输出方式变为输入方式时要延迟一个周期
key_io=0xf0; //采取写两次的方法延时
key_checkin=key_ior; //读取IO口状态,判断是否有键按下
if(key_checkin!=0xf0) //IO口值发生变化则表示有键按下
{
delay_nms(20); //键盘消抖,延时20MS
key_checkin=key_ior;
if(key_checkin!=0xf0)
{
key_io=0xfe; //逐行扫描开始
key_io=0xfe; //写两次延时,下同
key_check=key_ior;
KeyLock = 1; // 按键按下过
switch (key_check) //根据读到的IO口值判断按键的按下情况
{
case 0xee:key=15;break;
case 0xde:key=11;break;
case 0xbe:key=8;break;
case 0x7e:key=4;break;
}
key_io=0xfd;
key_io=0xfd;
key_check=key_ior;
switch (key_check)
{
case 0xed:key=14;break;
case 0xdd:key=10;break;
case 0xbd:key=7;break;
case 0x7d:key=3;break;
}
key_io=0xfb;
key_io=0xfb;
key_check=key_ior;
switch (key_check)
{
case 0xeb:key=13;break;
case 0xdb:key=0;break;
case 0xbb:key=6;break;
case 0x7b:key=2;break;
}
key_io=0xf7;
key_io=0xf7;
key_check=key_ior;
switch (key_check)
{
case 0xe7:key=12;break;
case 0xd7:key=9;break;
case 0xb7:key=5;break;
case 0x77:key=1;break;
}
}
}
else
{
if(KeyLock == 1)
{
KeyLock = 0;
KeyFlag = 1; // 有按键按下
}
statevalue=0xff; //无按键时返回值
key=statevalue;
return(key);
}
}