使用Keil uVision5软件编程控制两个led 主程序设定6位密码 矩阵键盘输入密码正确 第一个灯亮。连续三次输入错误,第二个灯亮 p1引脚控制键盘 p2引脚控制灯 当单片机启动时 没有灯亮 89c51单片机完整程序
时间: 2023-12-15 07:07:36 浏览: 28
好的,以下是一个完整的89c51单片机程序,实现了控制两个LED并使用矩阵键盘输入密码的功能。其中,P1口控制矩阵键盘,P2口控制LED灯。
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
char password[6] = {'1', '2', '3', '4', '5', '6'}; // 设定的密码
char input_password[6]; // 已经输入的密码
unsigned char input_index = 0; // 输入密码的下标
unsigned char error_count = 0; // 连续输入错误的次数
unsigned char key_scan(void)
{
unsigned char i, j;
unsigned char key_val = 0xFF; // 默认没有按键按下
for (i = 0; i < 4; i++) // 扫描行
{
P1 = ~(0x01 << i); // 该行为低电平,其他行为高电平
for (j = 0; j < 4; j++) // 检测列
{
if (!(P1 & (0x10 << j))) // 检测到按键按下
{
key_val = i * 4 + j; // 计算按键编号
while (!(P1 & (0x10 << j))); // 等待按键释放
}
}
}
return key_val; // 返回按键编号
}
void check_password(void)
{
unsigned char i;
while (1)
{
unsigned char key_val = key_scan(); // 扫描矩阵键盘
if (key_val != 0xFF) // 检测到按键按下
{
input_password[input_index++] = key_val + '0'; // 将按键编号转换为字符,并记录到已输入密码中
if (input_index == 6) // 输入的密码已经达到6位
{
for (i = 0; i < 6; i++) // 比较输入的密码和设定的密码是否相同
{
if (input_password[i] != password[i])
{
break; // 输入密码错误
}
}
if (i == 6) // 输入密码正确
{
P2 &= ~(0x01 << 1); // 第一个LED亮起
break;
}
else // 输入密码错误
{
input_index = 0; // 重新输入密码
}
}
}
}
}
void main(void)
{
P2 = 0xFF; // 初始化P2为高电平,两个LED都不亮
while (1)
{
check_password(); // 检测密码是否正确
error_count++; // 输入密码错误,计数器加一
if (error_count == 3) // 连续输入错误三次
{
P2 &= ~(0x01 << 0); // 第二个LED亮起
while (1); // 程序停止运行
}
}
}
```
需要注意的是,该程序中使用了一些宏定义,如`uchar`和`uint`,可以在程序开头进行定义,也可以直接使用`unsigned char`和`unsigned int`代替。在具体实现中,需要根据自己的需求来进行修改和完善。