51单片机矩阵键盘和数码管设计密码锁代码
时间: 2024-02-10 14:10:27 浏览: 101
以下是一个简单的密码锁设计代码,使用 4x4 的矩阵键盘和 4 位数码管显示屏,基于 51 单片机:
```C
#include <reg52.h>
sbit D1 = P2^4; // 数码管 D1
sbit D2 = P2^5; // 数码管 D2
sbit D3 = P2^6; // 数码管 D3
sbit D4 = P2^7; // 数码管 D4
sbit K1 = P1^0; // 矩阵键盘按键 K1
sbit K2 = P1^1; // 矩阵键盘按键 K2
sbit K3 = P1^2; // 矩阵键盘按键 K3
sbit K4 = P1^3; // 矩阵键盘按键 K4
sbit K5 = P1^4; // 矩阵键盘按键 K5
sbit K6 = P1^5; // 矩阵键盘按键 K6
sbit K7 = P1^6; // 矩阵键盘按键 K7
sbit K8 = P1^7; // 矩阵键盘按键 K8
unsigned char code Password[4] = {'1', '2', '3', '4'}; // 设定密码
unsigned char KeySta[4][4] = { // 矩阵键盘按键状态表
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1}
};
unsigned char KeyDown(void) { // 检测矩阵键盘是否按下
unsigned char i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (KeySta[i][j] == 0) {
while (!KeySta[i][j]); // 等待按键释放
switch (i) {
case 0:
switch (j) {
case 0: return '1';
case 1: return '2';
case 2: return '3';
case 3: return 'A';
}
case 1:
switch (j) {
case 0: return '4';
case 1: return '5';
case 2: return '6';
case 3: return 'B';
}
case 2:
switch (j) {
case 0: return '7';
case 1: return '8';
case 2: return '9';
case 3: return 'C';
}
case 3:
switch (j) {
case 0: return '*';
case 1: return '0';
case 2: return '#';
case 3: return 'D';
}
}
}
}
}
return 0;
}
void Display(unsigned char dat) { // 数码管显示函数
D1 = 1; D2 = 1; D3 = 1; D4 = 1;
switch (dat) {
case 0: D1 = 0; break;
case 1: D2 = 0; break;
case 2: D3 = 0; break;
case 3: D4 = 0; break;
default: break;
}
}
void main(void) {
unsigned char i, j, key, cnt = 0, flag = 0;
while (1) {
key = KeyDown();
if (key) {
if (key == Password[cnt]) {
cnt++;
if (cnt == 4) {
cnt = 0;
flag = 1;
}
} else {
cnt = 0;
}
}
if (flag) { // 密码正确,开锁
for (i = 0; i < 5; i++) { // 闪烁数码管
for (j = 0; j < 4; j++) {
Display(j);
delay_ms(50);
}
}
flag = 0;
}
Display(cnt); // 显示当前输入密码的位数
delay_ms(50);
}
}
```
代码的主要思路是:检测矩阵键盘是否按下,如果按下则获取按键值;与预设密码进行比较,如果匹配则打开锁;否则清空输入密码的位数并等待下一个按键输入。同时,使用数码管显示当前输入密码的位数,以及开锁时的闪烁效果。
需要注意的是,该代码只是一个简单的示例,密码储存在代码中,实际应用中应该使用更为安全的密码储存方式。另外,为了简化代码,该示例中使用了延时函数,实际应用中应该使用定时器等更为可靠的方式。
阅读全文