基于c51单片机的密码锁数码管显示
时间: 2023-11-01 18:07:55 浏览: 161
基于51单片机的数码管显示4位密码锁.docx
5星 · 资源好评率100%
以下是基于C51单片机的密码锁数码管显示的简单示例代码:
```c
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[] = {
0x3f, //0
0x06, //1
0x5b, //2
0x4f, //3
0x66, //4
0x6d, //5
0x7d, //6
0x07, //7
0x7f, //8
0x6f //9
};
uchar code password[] = {
1, 2, 3, 4 //密码为1234
};
void delay(uint i) {
while (i--);
}
void main() {
uchar i, j, k, n;
uchar input[4] = {0, 0, 0, 0}; //初始化输入为0000
P2 = 0x00; //P2口设置为输出口
while (1) {
for (i = 0; i < 4; i++) {
P1 = 0x0f; //将P1口低四位设置为输出
switch (i) {
case 0: P0 = 0xfe; break; //第一位数码管
case 1: P0 = 0xfd; break; //第二位数码管
case 2: P0 = 0xfb; break; //第三位数码管
case 3: P0 = 0xf7; break; //第四位数码管
}
delay(1000); //延时一段时间,防止闪烁
P1 = 0xf0; //将P1口高四位设置为输入
n = P1; //读取输入的值
n = n & 0xf0; //只取高四位
if (n != 0xf0) { //如果有按键按下
delay(1000); //简单消抖
n = P1; //再次读取输入的值
n = n & 0xf0; //只取高四位
if (n != 0xf0) { //如果确认有按键按下
switch (n) {
case 0xe0: input[i] = 1; break; //1键按下
case 0xd0: input[i] = 2; break; //2键按下
case 0xb0: input[i] = 3; break; //3键按下
case 0x70: input[i] = 4; break; //4键按下
}
for (j = 0; j <= i; j++) { //显示输入的数字
P2 = 0x00; //清空显示
for (k = 0; k < 10; k++) {
if (input[j] == k) {
P2 = table[k];
break;
}
}
delay(1000);
}
}
}
}
if (input[3] != 0) { //如果输入了4位密码
for (i = 0; i < 4; i++) {
if (input[i] != password[i]) { //判断密码是否正确
input[0] = 0; //密码错误,清空输入
input[1] = 0;
input[2] = 0;
input[3] = 0;
break;
}
}
if (i == 4) { //密码正确
P2 = 0xff; //点亮所有数码管
while (1); //程序停止
}
}
}
}
```
该程序实现了一个简单的密码锁,用户可以通过按键输入4位数字密码,程序会将输入的数字显示在4个数码管上,并在输入完成后判断密码是否正确。如果密码正确,程序会点亮所有数码管并停止运行。
阅读全文