#include <REGX52.H>
#include <Buttons.h>
#include <AT24C02.h>
#include <LCD1602.h>
#include <Delay.h>
#include <security.h>
#include <Buzzer.h>
unsigned char Original_Password[6] = {0}; // 原始密码数组
unsigned char Now_Password[6] = {0}; // 当前输入的密码数组
/**
* @brief 开门操作函数
*/
void Open_Door()
{
LCD_ShowString(1,1 ,"door is open "); // 在第一行显示门已开
}
/**
* @brief 关门操作函数
*/
void Off_Door()
{
LCD_ShowString(1,1 ,"door is Off "); // 在第一行显示门已关
}
/**
* @brief 主函数
*/
void main()
{
char Door_status_flag = 0; // 门的状态标志,0 表示关,1 表示开
LCD_Init(); // 初始化 LCD
Buzzer_Init(); // 初始化蜂鸣器
Boorbell_Init(); // 初始化门铃
Password_Init(Original_Password); // 初始化密码
while (1)
{
switch (Read_JZ_Buttons()) // 根据读取的按键值进行处理
{
case key_up: // 向上按键
if(Password_Input(Now_Password)){ // 输入密码
if(Password_Proofread(Original_Password, Now_Password)){ // 验证密码
Door_status_flag = 1; // 密码正确,门状态设为开
doorbell_Start();
}
}
break;
case key_down: // 向下按键
Door_status_flag = 0; // 门状态设为关
break;
case key_mode: // 模式按键
if(Password_Change(Original_Password)){ // 修改密码
Buzzer_On(); // 蜂鸣器响
Delay_ms(50); // 延时
Buzzer_Off(); // 蜂鸣器停
}
break;
case key_OK: // 确定按键
doorbell_Start(); // 启动门铃
break;
default:
break;
}
if (Door_status_flag ) // 根据门的状态显示相应信息
{
Open_Door();
} else {
Off_Door();
}
}
}
#include <Delay.h>
/**
* @brief 实现毫秒级延时的函数
* @param ms 要延时的毫秒数
*/
void Delay_ms(unsigned int ms)
{
int i,j;
// 通过双重循环实现延时
for(i=ms;i>0;i--)
for(j=114;j>0;j--);
}
#ifndef __DELAY_H
#define __DELAY_H
/**
* @brief 声明一个毫秒级延时函数
* @param ms 要延时的毫秒数
*/
void Delay_ms(unsigned int ms);
#endif
#include <Buttons.h>
#include <REGX52.H>
#include <Delay.h>
// 读取普通按钮状态的函数
unsigned char Read_Buttons(void)
{
unsigned char Button = 0x00; // 初始化按钮状态变量为 0
// 如果按钮状态不是全 1(即有按钮按下)
if(SW!= 0xff) {
Delay_ms(20); // 延时 20 毫秒消抖
} else {
return Button; // 如果没有按钮按下,直接返回初始状态 0
}
// 判断各个按钮是否按下,若按下则将对应位设为 1
if(sw1 == 0) Button = Button | 0x01;
if(sw2 == 0) Button = Button | 0x02;
if(sw3 == 0) Button = Button | 0x04;
if(sw4 == 0) Button = Button | 0x08;
// 等待按钮释放
while(SW!= 0xff);
Delay_ms(20);
return Button;
}
// 读取矩阵按钮状态的函数
unsigned char Read_JZ_Buttons(void)
{
unsigned char Button = 0x00; // 初始化按钮状态变量为 0
unsigned char Button_SMzb;
unsigned char i = 4;
SW = 0xff; // 设置某个端口为全 1
sw_x1 = 0;
sw_x2 = 0;
sw_x3 = 0;
sw_x4 = 0;
// 如果按钮状态与预期一致
if(SW!= SW_Cmp) {
Delay_ms(20); // 延时 20 毫秒消抖
} else {
return Button; // 如果状态符合预期,直接返回初始状态 0
}
// 通过循环依次检查不同的按钮组合
while (i--)
{
switch (i)
{
case 3:
Button_SMzb = 0x10; // 设置一个中间变量的值
SW = 0xff;
sw_x1 = 0;
break;
case 2:
Button_SMzb = 0x20;
SW = 0xff;
sw_x2 = 0;
break;
case 1:
Button_SMzb = 0x40;
SW = 0xff;
sw_x3 = 0;
break;
case 0:
Button_SMzb = 0x80;
SW = 0xff;
sw_x4 = 0;
break;
default:
break;
}
// 判断各个按钮是否按下,若按下则将对应位设为 1,并与中间变量组合
if(sw1 == 0)Button |= 0x01 | Button_SMzb;
if(sw2 == 0)Button |= 0x02 | Button_SMzb;
if(sw3 == 0)Button |= 0x04 | Button_SMzb;
if(sw4 == 0)Button |= 0x08 | Button_SMzb;
}
SW = 0xff;
sw_x1 = 0;
sw_x2 = 0;
sw_x3 = 0;
sw_x4 = 0;
while(SW!= SW_Cmp);
D
标签:include,sw,Button,51,Password,单片机,ms,SW,密码锁
From: https://blog.csdn.net/m0_73849363/article/details/144568176