AVR128单片机密码锁

发布于:2025-04-05 ⋅ 阅读:(19) ⋅ 点赞:(0)

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);
}
}


网站公告

今日签到

点亮在社区的每一天
去签到