Skip to main content

全部逻辑整合

总逻辑流程图

只包含大致逻辑喵!

SUN的贴心提示

直接抄主逻辑是没意义的哦!

直接抄主逻辑是没意义的喵!直接抄捅似你喵!
版本提示

这份代码可能不是最新的,因为它毕竟不能随着我的github的更新同步修改文档代码内容

main.c

#include <REGX52.H>
#include "LCD1602.h"
#include "matrixkey.h"
#include "Buzzer.h"
#include "Delay.h"
#include <math.h>

unsigned char KeyNum;
unsigned int Password1 = 0, Password2 = 0, count = 0;
unsigned int secret1 = 11111;
unsigned int secret2 = 1;

unsigned int newSecret1 = 0, newSecret2 = 0;
unsigned char mode = 0; // 0: 正常模式, 1: 修改密码模式, 2: 确认新密码模式
unsigned char loginAttempts = 3;
unsigned char lockFlag = 0; // 锁定状态标志
unsigned char lockTime = 180; // 锁定时间 3分钟 (180秒)
unsigned char Min = 3, Sec = 0; // 3分钟倒计时
unsigned int lockCount = 0; // 特此醒目立碑纪念它给我带来的黄金赤石体验

void clearPassword() {
Password1 = 0;
Password2 = 0;
count = 0;
LCD_ShowString(2, 1, "------ ");
}

void showPasswordFormat(unsigned char length) {
unsigned char i;
for(i = 0; i < length; i++) {
if (i < count) {
LCD_ShowChar(2, 1 + i, '*');
} else {
LCD_ShowChar(2, 1 + i, '-');
}
}
}

// 锁定状态倒计时
void startLockCountdown() {
LCD_ShowString(1, 1, "Locked for 3min");
LCD_ShowString(2, 1, " :");
while (lockTime > 0)
{
LCD_ShowNum(2, 1, Min, 1); // 显示分钟
LCD_ShowNum(2, 3, Sec, 2); // 显示秒数

Delay(1000); // 每秒延迟一次

if (Sec > 0)
{
Sec--;
}
else
{
if (Min > 0)
{
Min--;
Sec = 59;
}
}

if (Min == 0 && Sec == 0)
{
lockFlag = 0; // 解除锁定
LCD_ShowString(2, 1, "Time up!"); // 显示倒计时结束
Delay(2000); // 显示 "Time up!" 2秒
LCD_ShowString(2, 1, "------ ");
LCD_ShowString(1, 1, "PassWord: "); // 恢复显示
break;
}
}
}

void main()
{
LCD_Init();
LCD_ShowString(1, 1, "PassWord:");
showPasswordFormat(6);

while(1)
{
// 如果处于锁定状态,执行锁定倒计时
if(lockFlag) {
startLockCountdown(); // 启动3分钟倒计时
continue; // 锁定期间跳过密码输入
}

// 处理按键输入
KeyNum = Matrixkey();
if(KeyNum)
{
if(KeyNum <= 10) // 如果s1~s10按键按下,输入密码
{
if(count < 5)
{
Password1 *= 10; // 密码左移一位
Password1 += KeyNum % 10; // 获取一位密码
count++; // 计次
}
else if (count == 5)
{
Password2 = KeyNum % 10;
count++;
}
}
showPasswordFormat(6);
}

if(KeyNum == 11) // 确认键
{
if(mode == 0) // 正常模式
{
if(Password1 == secret1 && Password2 == secret2)
{
clearPassword();
LCD_ShowString(1, 1, "Successfully ");
LCD_ShowString(2, 1, "Log in! "); // 更新
P2_1 = 0; // 绿灯亮
loginAttempts = 3; // 重置登录尝试次数
}
else
{
loginAttempts--; // 减少尝试次数
if(loginAttempts > 0)
{
LCD_ShowString(1, 1, "ERROR "); // 更新
LCD_ShowString(2, 1, " TryAgain"); // 更新
clearPassword();
P2_1 = 1; // 绿灯灭
P2_0 = 0; // 红灯亮
Delay(1000);
P2_0 = 1; // 红灯灭
Buzzer_Time(1000); // 蜂鸣器响
LCD_ShowNum(1, 14, loginAttempts, 1); // 显示剩余尝试次数
}
else
{
LCD_ShowString(1, 1, "ERROR"); // 更新
LCD_ShowString(2, 1, "Log in Disabled "); // 更新
LCD_ShowString(2, 1, " "); // 清空第二行显示
loginAttempts = 3; // 重置尝试次数
lockFlag = 1; // 锁定状态激活
Delay(1000); // 稍等一会再开始倒计时
}
}
}
else if(mode == 1) // 修改密码模式
{
if(Password1 == secret1 && Password2 == secret2)
{
clearPassword();
LCD_ShowString(1, 1, "Reset Password:");
mode = 2; // 进入确认新密码模式
}
else
{
LCD_ShowString(1, 14, "ERR");
clearPassword();
P2_0 = 0; // 亮红灯
Delay(1000);
P2_0 = 1;
Buzzer_Time(1000); // 蜂鸣器响
}
}
else if(mode == 2) // 设置新密码第一步
{
if(count >= 5) // 确保已经输入了新的密码
{
newSecret1 = Password1;
newSecret2 = Password2;
clearPassword();
LCD_ShowString(1, 1, "Re-ResetPassword");
mode = 3; // 进入确认新密码模式第二步
}
}
else if(mode == 3) // 设置新密码第二步
{
if(count >= 5 && Password1 == newSecret1 && Password2 == newSecret2) // 确保两次输入的密码一致
{
secret1 = newSecret1;
secret2 = newSecret2;
LCD_ShowString(1, 1, "Successfully ");
LCD_ShowString(2, 1, "Change PassWord!");
Delay(2000);
mode = 0; // 返回正常模式
clearPassword();
LCD_ShowString(2, 1, " "); // 清除第二行显示
LCD_ShowString(1, 1, "PassWord: "); // 恢复显示
}
else
{
LCD_ShowString(1, 1, "------ERR------ ");
clearPassword();
P2_0 = 0; // 亮红灯
Delay(1000);
P2_0 = 1;
Buzzer_Time(1000); // 蜂鸣器响
}
}
}

if(KeyNum == 12) // 退位
{
if(count > 0)
{
if(count <= 5)
{
Password1 /= 10;
}
else
{
Password2 = 0;
}
count--;
showPasswordFormat(6);
}
}

if(KeyNum == 13) // 进入修改密码模式
{
mode = 1; // 修改密码模式
LCD_ShowString(1, 1, "Old Password:");
clearPassword();
}
if(KeyNum == 14) // 取消键
{
if(mode == 1 || mode == 2 || mode == 3) // 如果在修改密码模式、设置新密码模式或确认新密码模式
{
mode = 0; // 返回正常模式
clearPassword();
LCD_ShowString(1, 1, "PassWord: "); // 恢复显示
}
}
}
}