【单片机毕业设计】【jj-005】电子密码锁 | 智能锁 | 多功能锁 | 智能门锁

时间:2025-03-09 16:16:46
*******按键函数 *****/ 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,"密码:"); } } }