主控芯片:ATmega128。
显示装置:LCD12864。
输入装置:矩阵键盘。
默认密码:123456。
运行仿真后,蜂鸣器短响一声。显示屏上会显示出
“密码锁”
“请输入密码”的提示。
当前输入的密码会直接进行显示,上一位密码会显示为星号。
密码输入错误时会在显示器上进行提示。
密码输入错误3次,显示屏上会显示“锁定”提示,并通过蜂鸣器进行报警。
密码输入正确时显示器会提示密码正确,同时左侧LED会亮起,LED亮约2秒钟后会熄灭。
按下复位按钮后装置会复位可以再次进行密码输入。
部分代码如下。
//***********************************************************************
// 主程序
//***********************************************************************
void main(void)
{
uint key_store=0x01;
system_init(); //单片机资源初始化
LCDchushihua(); //液晶显示器初始化
LCDQingPing(); //液晶显示器清屏
Display(); //设置显示屏初始内容
timer1_init(); //定时器初始化
TIMSK=0x04; //设置定时器中断
SEI(); //开中断
codea[0] = 1 ; //6位密码初始化位123456
codea[1] = 2 ;
codea[2] = 3 ;
codea[3] = 4 ;
codea[4] = 5 ;
codea[5] = 6 ;
ledoff();
beer0(); //关LED关蜂鸣器
while(1)
{
keyboardscan(); //扫描矩阵键盘
if(key!=0xff&flag==0) //如果有按键按下,则显示该按键键值0~15
{
flag = 1 ;
if(key>=0&key<10) //输入密码0-9
{
switch(key)
{
case 0 :buf=0; break ;
case 1 :buf=1; break ;
case 2 :buf=2; break ;
case 3 :buf=3; break ;
case 4 :buf=4; break ;
case 5 :buf=5; break ;
case 6 :buf=6; break ;
case 7 :buf=7; break;
case 8 :buf=8; break ;
case 9 :buf=9; break ;
}
code[sw_cnt]=buf; //将输入的密码数据存储到数组中
Display_Code(sw_cnt); //对输入的密码进行显示
if(sw_cnt<6) //6位密码循环计数
{
sw_cnt++;
}else
{
sw_cnt=7;
}
if(sw_cnt==6) //当6位密码全部输入完成,对密码进行判断
{
if(code[0]==codea[0]&code[1]==codea[1]&code[2]==codea[2]&code[3]==codea[3]&code[4]==codea[4]&code[5]==codea[5])
{
Display_Right(); //密码正确提示
right = 1 ;
LCD_display816(6,40,(uchar*) (wordx));
LCD_display816(6,48,(uchar*) (wordx));
LCD_display816(6,56,(uchar*) (wordx));
LCD_display816(6,64,(uchar*) (wordx));
LCD_display816(6,72,(uchar*) (wordx));
LCD_display816(6,80,(uchar*) (wordx)); //6位密码全部显示星号
}else
{
if(error_cnt<2) //密码错误次数小于3
{
error_cnt++; //错误计数累加
sw_cnt = 0 ;
Display_Error(); //如果输入的密码与设定的密码不一致
LCD_display816(6,40,(uchar*) (wordx));
LCD_display816(6,48,(uchar*) (wordx));
LCD_display816(6,56,(uchar*) (wordx));
LCD_display816(6,64,(uchar*) (wordx));
LCD_display816(6,72,(uchar*) (wordx));
LCD_display816(6,80,(uchar*) (wordx));
_delay_ms(1000);
Display_ClearPassword();
Display_ClearMsg(); //清除显示内容
}else
{
error = 1 ;
Display_Lock();
LCD_display816(6,40,(uchar*) (wordx));
LCD_display816(6,48,(uchar*) (wordx));
LCD_display816(6,56,(uchar*) (wordx));
LCD_display816(6,64,(uchar*) (wordx));
LCD_display816(6,72,(uchar*) (wordx));
LCD_display816(6,80,(uchar*) (wordx));
_delay_ms(1000);
Display_ClearPassword();
}
}
}
}else
{
if(key==10) //复位操作
{
Display_ClearMsg();
Display_ClearPassword();
sw_cnt = 0 ;
enable = 0 ;
}
}
}else if(key==0xff)
{
flag = 0 ;
}
}
}