51单片机简易按键密码锁两个独立按键控制数码管显示密码,密码为两位,当密码达到设定值时,呼吸灯闪烁
时间: 2024-05-03 21:22:44 浏览: 184
下面是一个51单片机简易按键密码锁的代码,使用两个独立按键控制数码管显示密码,密码为两位,当密码达到设定值时,呼吸灯闪烁。
```
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY1 = P3^2; // 定义按键1,连接到P3.2
sbit KEY2 = P3^3; // 定义按键2,连接到P3.3
sbit LED = P1^0; // 定义LED,连接到P1.0
sbit DIO = P2^0; // 定义数码管DIO,连接到P2.0
sbit CLK = P2^1; // 定义数码管CLK,连接到P2.1
uchar code LED_Table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 数码管显示表
void delay(uint i) { // 延时函数
while(i--);
}
void Write_Dat(uchar dat) { // 向数码管写入数据
uchar i;
CLK = 0;
for(i = 0; i < 8; i++) {
DIO = dat & 0x01;
dat >>= 1;
CLK = 1;
CLK = 0;
}
}
void Display(uchar n) { // 在数码管上显示一个数字
Write_Dat(LED_Table[n/10]); // 显示十位
Write_Dat(LED_Table[n%10]); // 显示个位
}
void main() {
uchar pwd1 = 0; // 第一位密码
uchar pwd2 = 0; // 第二位密码
while(1) {
if(KEY1 == 0) { // 按键1按下
delay(1000); // 延时去抖动
if(KEY1 == 0) {
pwd1++; // 第一位密码加1
if(pwd1 > 9) pwd1 = 0; // 如果超过9,则从0开始
}
}
if(KEY2 == 0) { // 按键2按下
delay(1000); // 延时去抖动
if(KEY2 == 0) {
pwd2++; // 第二位密码加1
if(pwd2 > 9) pwd2 = 0; // 如果超过9,则从0开始
}
}
Display(pwd1*10+pwd2); // 在数码管上显示密码
if(pwd1 == 5 && pwd2 == 8) { // 如果密码为58
LED = 1; // 点亮LED
for(uchar i = 0; i < 10; i++) { // 循环10次
for(uchar j = 0; j < 100; j++) { // 延时
LED = ~LED; // LED翻转
delay(1000);
}
}
LED = 0; // 熄灭LED
pwd1 = 0; // 重置密码
pwd2 = 0;
}
}
}
```
在这个代码中,使用了两个独立按键控制密码的输入,使用了数码管来显示密码。当密码输入正确时,LED会呼吸灯闪烁。需要注意的是,在输入密码时需要去除按键的抖动,否则会导致密码错误。
阅读全文