基于51单片机利用矩阵按键实现密码锁
时间: 2023-12-05 18:06:00 浏览: 183
实现基于51单片机的密码锁,需要用到矩阵按键和LCD液晶显示屏。具体步骤如下:
1. 设计硬件电路,将矩阵按键和LCD液晶显示屏连接到51单片机上。
2. 编写程序,初始化矩阵按键和LCD液晶显示屏。
3. 设定一个密码,将密码存储到51单片机的EEPROM中。
4. 等待用户输入密码,获取用户输入的按键值,将按键值与设定的密码进行比较。
5. 如果输入的密码正确,显示“Welcome”并开启锁;如果输入的密码错误,显示“Error”并不开启锁。
6. 在开启锁的状态下,用户可以进行相关操作,如修改密码等。
需要注意的是,为了保证密码的安全性,需要对密码进行加密处理,如MD5等。同时,为了防止密码被破解,需要设置密码输入次数限制,超过限制次数会锁定系统。
相关问题
基于51单片机利用矩阵按键实现密码锁 c语言
以下是基于51单片机利用矩阵按键实现密码锁的C语言代码,你可以参考一下:
```
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS = P2^6; // LCD1602液晶显示屏接口定义
sbit RW = P2^5;
sbit EN = P2^7;
sbit KEY_IN_1 = P1^0; // 矩阵按键接口定义
sbit KEY_IN_2 = P1^1;
sbit KEY_IN_3 = P1^2;
sbit KEY_IN_4 = P1^3;
sbit KEY_OUT_1 = P1^4;
sbit KEY_OUT_2 = P1^5;
sbit KEY_OUT_3 = P1^6;
sbit KEY_OUT_4 = P1^7;
uchar password[4] = {1, 2, 3, 4}; // 设置初始密码
uchar keyvalue = 0;
uchar keyflag = 0;
uchar input_pwd[4] = {0, 0, 0, 0};
uchar input_count = 0;
uchar error_count = 0;
void init_lcd1602() // LCD1602液晶显示屏初始化
{
delay(20);
write_com(0x38);
delay(5);
write_com(0x38);
delay(5);
write_com(0x38);
delay(5);
write_com(0x38);
delay(5);
write_com(0x08);
delay(5);
write_com(0x01);
delay(5);
write_com(0x06);
delay(5);
write_com(0x0c);
delay(5);
}
void delay(uint x) // 延时函数
{
uint i, j;
for(i = x; i > 0; i--)
for(j = 110; j > 0; j--);
}
void write_com(uchar com) // 写指令函数
{
RS = 0;
RW = 0;
P0 = com;
EN = 1;
_nop_();
EN = 0;
}
void write_data(uchar dat) // 写数据函数
{
RS = 1;
RW = 0;
P0 = dat;
EN = 1;
_nop_();
EN = 0;
}
void keyscan() // 矩阵按键扫描函数
{
KEY_OUT_1 = 0;
if(KEY_IN_1 == 0)
{
keyvalue = 1;
keyflag = 1;
}
if(KEY_IN_2 == 0)
{
keyvalue = 2;
keyflag = 1;
}
if(KEY_IN_3 == 0)
{
keyvalue = 3;
keyflag = 1;
}
if(KEY_IN_4 == 0)
{
keyvalue = 4;
keyflag = 1;
}
KEY_OUT_1 = 1;
KEY_OUT_2 = 0;
if(KEY_IN_1 == 0)
{
keyvalue = 5;
keyflag = 1;
}
if(KEY_IN_2 == 0)
{
keyvalue = 6;
keyflag = 1;
}
if(KEY_IN_3 == 0)
{
keyvalue = 7;
keyflag = 1;
}
if(KEY_IN_4 == 0)
{
keyvalue = 8;
keyflag = 1;
}
KEY_OUT_2 = 1;
KEY_OUT_3 = 0;
if(KEY_IN_1 == 0)
{
keyvalue = 9;
keyflag = 1;
}
if(KEY_IN_2 == 0)
{
keyvalue = 10;
keyflag = 1;
}
if(KEY_IN_3 == 0)
{
keyvalue = 11;
keyflag = 1;
}
if(KEY_IN_4 == 0)
{
keyvalue = 12;
keyflag = 1;
}
KEY_OUT_3 = 1;
KEY_OUT_4 = 0;
if(KEY_IN_1 == 0)
{
keyvalue = 13;
keyflag = 1;
}
if(KEY_IN_2 == 0)
{
keyvalue = 14;
keyflag = 1;
}
if(KEY_IN_3 == 0)
{
keyvalue = 15;
keyflag = 1;
}
if(KEY_IN_4 == 0)
{
keyvalue = 16;
keyflag = 1;
}
KEY_OUT_4 = 1;
}
void display_pwd() // 显示密码函数
{
uchar i;
write_com(0x80);
write_data('I');
write_data('n');
write_data('p');
write_data('u');
write_data('t');
write_data(':');
for(i = 0; i < 4; i++)
{
write_data(input_pwd[i] + '0');
}
}
void main()
{
init_lcd1602(); // 初始化LCD1602液晶显示屏
while(1)
{
keyscan(); // 扫描矩阵按键
if(keyflag == 1 && input_count < 4) // 如果有按键按下且密码未输入完整
{
input_pwd[input_count++] = keyvalue; // 记录输入的密码
display_pwd(); // 显示输入的密码
keyflag = 0;
}
if(input_count == 4) // 如果密码输入完整
{
if(input_pwd[0] == password[0] && input_pwd[1] == password[1] && input_pwd[2] == password[2] && input_pwd[3] == password[3]) // 如果密码正确,开锁
{
write_com(0xc0);
write_data('W');
write_data('e');
write_data('l');
write_data('c');
write_data('o');
write_data('m');
write_data('e');
delay(1000);
input_count = 0;
error_count = 0;
write_com(0x01);
}
else // 如果密码错误
{
error_count++; // 记录错误次数
if(error_count >= 3) // 如果错误次数超过3次,锁定系统
{
write_com(0x01);
write_com(0x80);
write_data('S');
write_data('y');
write_data('s');
write_data('t');
write_data('e');
write_data('m');
write_data(' ');
write_data('L');
write_data('o');
write_data('c');
write_data('k');
delay(5000);
error_count = 0;
write_com(0x01);
}
else // 如果错误次数未超过3次,显示错误信息
{
write_com(0xc0);
write_data('E');
write_data('r');
write_data('r');
write_data('o');
write_data('r');
write_data('!');
delay(1000);
input_count = 0;
write_com(0x01);
}
}
}
}
}
```
以上代码仅供参考,实际应用中可能还需要根据具体情况进行修改和完善。
51单片机lcd矩阵键盘密码锁程序初始6位密码
以下是一个基于51单片机和LCD矩阵键盘的简单密码锁程序,初始密码为"123456":
```
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS = P1^0; //LCD1602的接口定义
sbit RW = P1^1;
sbit EN = P1^2;
sbit k1 = P3^0; //矩阵键盘的接口定义
sbit k2 = P3^1;
sbit k3 = P3^2;
sbit k4 = P3^3;
sbit k5 = P3^4;
sbit k6 = P3^5;
sbit k7 = P3^6;
sbit k8 = P3^7;
uchar password[6] = {'1', '2', '3', '4', '5', '6'}; //初始密码
uchar input[6]; //输入的密码
uchar i = 0; //计数器
void delayms(uint x) //延时函数
{
uint i, j;
for(i = x; i > 0; i--)
for(j = 110; j > 0; j--);
}
void init() //LCD1602初始化函数
{
delayms(15);
RS = 0;
RW = 0;
EN = 1;
P0 = 0x38;
EN = 0;
delayms(5);
EN = 1;
P0 = 0x38;
EN = 0;
delayms(5);
EN = 1;
P0 = 0x38;
EN = 0;
delayms(5);
EN = 1;
P0 = 0x0C;
EN = 0;
delayms(5);
EN = 1;
P0 = 0x06;
EN = 0;
delayms(5);
EN = 1;
P0 = 0x01;
EN = 0;
delayms(5);
}
void write_com(uchar com) //写命令函数
{
RS = 0;
RW = 0;
EN = 1;
P0 = com;
EN = 0;
delayms(5);
}
void write_data(uchar dat) //写数据函数
{
RS = 1;
RW = 0;
EN = 1;
P0 = dat;
EN = 0;
delayms(5);
}
void display(uchar *s) //显示函数
{
while(*s != '\0')
write_data(*s++);
}
void main()
{
init();
write_com(0x80);
display("Enter Password:");
while(1)
{
if(k1 == 0) //按下1键
{
input[i] = '1';
i++;
delayms(10);
while(k1 == 0);
}
if(k2 == 0) //按下2键
{
input[i] = '2';
i++;
delayms(10);
while(k2 == 0);
}
if(k3 == 0) //按下3键
{
input[i] = '3';
i++;
delayms(10);
while(k3 == 0);
}
if(k4 == 0) //按下4键
{
input[i] = '4';
i++;
delayms(10);
while(k4 == 0);
}
if(k5 == 0) //按下5键
{
input[i] = '5';
i++;
delayms(10);
while(k5 == 0);
}
if(k6 == 0) //按下6键
{
input[i] = '6';
i++;
delayms(10);
while(k6 == 0);
}
if(k7 == 0) //按下7键(确认键)
{
if(i == 6) //输入了6位密码
{
uchar j;
for(j = 0; j < 6; j++)
{
if(input[j] != password[j]) //密码错误
{
write_com(0xC0);
display("Wrong Password!");
delayms(1000);
write_com(0xC0);
display("Enter Password:");
i = 0;
break;
}
}
if(j == 6) //密码正确
{
write_com(0xC0);
display("Password Correct");
delayms(1000);
write_com(0xC0);
display("Enter Password:");
i = 0;
}
}
else //输入的密码不足6位
{
write_com(0xC0);
display("Input Incomplete");
delayms(1000);
write_com(0xC0);
display("Enter Password:");
i = 0;
}
while(k7 == 0);
}
if(k8 == 0) //按下8键(清除键)
{
write_com(0xC0);
display("Enter Password:");
i = 0;
while(k8 == 0);
}
if(i >= 6) //输入的密码超过6位
{
write_com(0xC0);
display("Password Too Long");
delayms(1000);
write_com(0xC0);
display("Enter Password:");
i = 0;
}
}
}
```
注意:此代码仅供参考,具体实现要根据实际情况进行调整和优化。