【单片机毕业设计】【jj-005】电子密码锁 | 智能锁 | 多功能锁 | 智能门锁
*******按键函数
*****/
void Key_function(void)
{
u8 i = 0,uart_data = 0xff;
key_num = Chiclet_Keyboard_Scan();
if(USART1_WaitRecive() == 0)
uart_data = usart1_buf[0];
if(key_num != 0xff || uart_data != 0xff) //当有按键按下时
{
if(flag_key_en == 0)
{
BEEP = 1;
delay_ms(100);
BEEP = 0;
}
else
{
if(key_num == 3) //按键A:
{
}
else if(key_num == 7) //按键B:
{
}
else if(key_num == 11 || uart_data == 'C') //按键C:一键还原密码
{
flag_reset_password = 5;
password_num = 0;
Oled_Clear_All();
Oled_ShowCHinese(1,2,"还原密码");
Oled_ShowCHinese(2,0,"管理员:");
UsartPrintf(USART1,"\r\n还原密码");
UsartPrintf(USART1,"\r\n管理员:");
}
else if(key_num == 15 || uart_data == 'D') //按键D:重新设置密码
{
flag_reset_password = 1;
password_num = 0;
Oled_Clear_All();
Oled_ShowCHinese(1,2,"设置密码");
Oled_ShowCHinese(2,0,"管理员:");
UsartPrintf(USART1,"\r\n设置密码");
UsartPrintf(USART1,"\r\n管理员:");
}
else if(key_num == 12 || uart_data == '*') //按键 * :删除
{
if(password_num > 0)
{
password_num--;
Oled_ShowChar(4,(password_num)*8,' ');
}
}
else if(key_num == 14 || uart_data == '#') //按键 # :确认
{
Oled_Clear_All();
Ensure_function();
}
else if(((key_num<12 && key_num%4<3) || key_num==13) || (uart_data >= '0' && uart_data <= '9')) //按下的是数字键
{
if(key_num != 13)
key_num = (key_num/4*3 + (key_num%4+1));
else
key_num = 0;
if(uart_data >= '0' && uart_data <= '9')
key_num = uart_data-'0';
if(password_num < 12) //当输入的密码少于12位时,接受输入并保存
{
if(flag_reset_password < 3 || flag_reset_password == 5)
password_input[password_num++] = key_num; //将数字键的码赋值给password_input[]数组暂存
else if(password_num < 6) //设置新密码时,只能输入6位
{
if(flag_reset_password == 4)
password_reset[password_num++] = key_num; //将数字键的码赋值给password_reset[]数组暂存
else
password_input[password_num++] = key_num;
}
for(i = 0;i < password_num;i++)
Oled_ShowChar(4,i*8,'*');
}
else //输入数据位数大于12后,忽略前方输入
{
password_num = 12;
for(i = 0; i < 11; i++)
{
password_input[i] = password_input[i+1];
}
password_input[i] = key_num;
}
}
}
}
}
/****
*******确认函数
*****/
void Ensure_function(void)
{
char temp_source[12] = {0};
char temp_sub[6] = {0};
u8 i = 0;
for(i = 0;i < 12;i++) //将输入的密码暂存
{
temp_source[i] = password_input[i]+'0';
}
for(i = 0;i < 6;i++) //将需要被对比的密码暂存
{
if(flag_reset_password == 0 || flag_reset_password == 2)
temp_sub[i] = password[i]+'0';
else if(flag_reset_password == 1 || flag_reset_password == 5)
temp_sub[i] = admipassword[i]+'0';
else if(flag_reset_password == 4)
temp_sub[i] = password_reset[i]+'0';
}
if(flag_reset_password == 0) //不是重置密码模式
{
if(strstr(temp_source,temp_sub) != NULL) //用户密码与输入密码相同,进行开门
{
Oled_ShowCHinese(1,2,"密码锁");
Oled_ShowCHinese(2,0,"门已打开");
UsartPrintf(USART1,"\r\n门已打开");
DOOR = 1;
delay_ms(1500);
delay_ms(1500);
DOOR = 0;
Oled_ShowString(2,0," ");
Oled_ShowCHinese(2,0,"密码:");
flag_error_num = 0;
memset(password_input,'\r',12);
}
else //用户密码与输入密码不相同,错误次数+1
{
Oled_ShowCHinese(1,2,"密码锁");
Oled_ShowCHinese(2,0,"密码错误");
UsartPrintf(USART1,"\r\n密码错误");
delay_ms(1000);
Oled_ShowString(2,0," ");
Oled_ShowCHinese(2,0,"密码:");
flag_error_num++;
memset(password_input,'\r',12);
}
}
else if(flag_reset_password == 1) //重置密码模式1
{
if(strstr(temp_source,temp_sub) != NULL) //管理员密码与输入密码相同,进入输入旧密码界面
{
Oled_ShowCHinese(1,2,"设置密码");
Oled_ShowCHinese(2,0,"密码正确");
UsartPrintf(USART1,"\r\n密码正确");
delay_ms(1000);
Oled_ShowCHinese(1,2,"设置密码");
Oled_ShowCHinese(2,0,"旧密码:");
UsartPrintf(USART1,"\r\n旧密码:");
flag_reset_password++;
flag_error_num = 0;
memset(password_input,'\r',12);
}
else //管理员密码与输入密码不相同,错误次数+1
{
Oled_ShowCHinese(2,0,"密码错误");
UsartPrintf(USART1,"\r\n密码错误");
delay_ms(1000);
Oled_ShowCHinese(1,2,"设置密码");
Oled_ShowCHinese(2,0,"管理员:");
UsartPrintf(USART1,"\r\n管理员:");
flag_error_num++;
memset(password_input,'\r',12);
}
}
else if(flag_reset_password == 2) //重置密码模式2
{
if(strstr(temp_source,temp_sub) != NULL) //旧密码与输入密码相同,进入输入新密码界面
{
Oled_ShowCHinese(1,2,"设置密码");
Oled_ShowCHinese(2,0,"密码正确");
UsartPrintf(USART1,"\r\n密码正确");
delay_ms(1000);
Oled_ShowCHinese(1,2,"设置密码");
Oled_ShowCHinese(2,0,"新密码:");
UsartPrintf(USART1,"\r\n新密码:");
flag_reset_password++;
flag_error_num = 0;
memset(password_input,'\r',12);
}
else //旧密码与输入密码不相同,错误次数+1
{
Oled_ShowCHinese(2,0,"密码错误");
UsartPrintf(USART1,"\r\n密码错误");
delay_ms(1000);
Oled_ShowCHinese(1,2,"设置密码");
Oled_ShowCHinese(2,0,"旧密码:");
UsartPrintf(USART1,"\r\n旧密码:");
flag_error_num++;
memset(password_input,'\r',12);
}
}
else if(flag_reset_password == 3) //重置密码模式3,再次输入新密码
{
Oled_ShowCHinese(1,2,"设置密码");
Oled_ShowCHinese(2,0,"新密码:");
delay_ms(1000);
Oled_ShowCHinese(1,2,"设置密码");
Oled_ShowCHinese(2,0,"再输入:");
UsartPrintf(USART1,"\r\n再输入:");
flag_reset_password++;
}
else if(flag_reset_password == 4) //重置密码模式4
{
if(strstr(temp_source,temp_sub) != NULL) //两次新密码相同,新密码修改成功
{
strncpy((char*)password,(char*)password_reset,6); //更换新密码
AT24CXX_Write(1,password,6);
Oled_ShowCHinese(1,2,"设置密码");
Oled_ShowCHinese(2,0,"设置完成");
UsartPrintf(USART1,"\r\n设置完成");
delay_ms(1000);
Oled_ShowString(2,0," ");
Oled_ShowString(1,0," ");
Oled_ShowCHinese(1,2,"密码锁");
Oled_ShowCHinese(2,0,"密码:");
flag_reset_password = 0;
memset(password_input,'\r',12);
memset(password_reset,'\r',6);
}
else //两次新密码不相同,新密码修改失败
{
Oled_ShowCHinese(2,0,"设置失败");
UsartPrintf(USART1,"\r\n设置失败");
delay_ms(1000);
Oled_ShowString(1,0," ");
Oled_ShowString(2,0," ");
Oled_ShowCHinese(1,2,"密码锁");
Oled_ShowCHinese(2,0,"密码:");
flag_reset_password = 0;
memset(password_input,'\r',12);
memset(password_reset,'\r',6);
}
}
else if(flag_reset_password == 5) //还原密码模式
{
if(strstr(temp_source,temp_sub) != NULL) //管理员密码与输入密码相同,还原密码
{
for(i = 0;i < 6;i++)
password[i] = i+1;
AT24CXX_Write(1,password,6);
Oled_ShowCHinese(2,0,"还原完成");
UsartPrintf(USART1,"\r\n还原完成");
delay_ms(1000);
Oled_ShowString(2,0," ");
Oled_ShowString(1,0," ");
Oled_ShowCHinese(1,2,"密码锁");
Oled_ShowCHinese(2,0,"密码:");
flag_reset_password = 0;
memset(password_input,'\r',12);
}
else //管理员密码与输入密码不相同,还原失败
{
Oled_ShowCHinese(2,0,"还原失败");
UsartPrintf(USART1,"\r\n还原失败");
delay_ms(1000);
Oled_ShowString(1,0," ");
Oled_ShowString(2,0," ");
Oled_ShowCHinese(1,2,"密码锁");
Oled_ShowCHinese(2,0,"密码:");
flag_error_num++;
flag_reset_password = 0;
memset(password_input,'\r',12);
}
}
password_num = 0;
}
/****
*******锁定键盘函数
*****/
void Key_lock_function(void)
{
if(flag_error_num >= 3) //三次输入错误
{
flag_key_en = 0;
if(time_num % 10 == 0) //3分钟倒计时开始
{
flag_error_time--;
}
Oled_ShowCHinese(1,2,"按键锁定");
sprintf(display_buf," %d%d:%d%d:%d%d", flag_error_time/3600/10%10,flag_error_time/3600/1%10,
flag_error_time%3600/60/10%10,flag_error_time%3600/60/1%10,
flag_error_time%60/10%10,flag_error_time%60/1%10);
Oled_ShowString(2,0,display_buf);
if(flag_error_time == 0) //倒计时结束
{
flag_key_en = 1;
flag_error_time = 180;
flag_error_num = 0;
flag_reset_password = 0;
Oled_Clear_All();
Oled_ShowCHinese(1,2,"密码锁");
Oled_ShowCHinese(2,0,"密码:");
}
}
}