单片机密码锁用于AT89C52的代码
时间: 2023-07-09 13:39:22 浏览: 54
以下是一个基于AT89C52单片机的密码锁代码示例:
```
#include <reg52.h> // 引入AT89C52的头文件
sbit rs=P2^0; // 连接LCD的RS引脚
sbit rw=P2^1; // 连接LCD的RW引脚
sbit en=P2^2; // 连接LCD的EN引脚
sbit key1=P1^0; // 连接按键1
sbit key2=P1^1; // 连接按键2
sbit key3=P1^2; // 连接按键3
sbit key4=P1^3; // 连接按键4
unsigned char code password[4] = {0x31, 0x32, 0x33, 0x34}; // 预设的4位密码,这里设置为"1234"
unsigned char input[4]; // 存储用户输入的4位密码
void delay_ms(unsigned int ms) // 延时函数
{
unsigned int i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<120;j++);
}
}
void write_com(unsigned char com) // 写命令函数
{
rs=0; // 将RS引脚置为0,表示写入的是命令
rw=0; // 将RW引脚置为0,表示写入的是写操作
en=1; // 将EN引脚置为1,表示使能LCD
P0=com; // 将命令写入P0口
delay_ms(1); // 延时1ms
en=0; // 将EN引脚置为0,表示禁能LCD
}
void write_data(unsigned char dat) // 写数据函数
{
rs=1; // 将RS引脚置为1,表示写入的是数据
rw=0; // 将RW引脚置为0,表示写入的是写操作
en=1; // 将EN引脚置为1,表示使能LCD
P0=dat; // 将数据写入P0口
delay_ms(1); // 延时1ms
en=0; // 将EN引脚置为0,表示禁能LCD
}
void init() // LCD初始化函数
{
write_com(0x38); // 设置显示模式为8位数据,2行显示,5x7点阵字符
write_com(0x0c); // 打开显示,关闭光标
write_com(0x06); // 文本显示不动,光标右移
write_com(0x01); // 清屏
write_com(0x80); // 光标移动到第一行第一列
}
void main()
{
unsigned char i;
unsigned char success=0;
init(); // 初始化LCD
while(1)
{
if(key1==0) // 如果按键1被按下
{
input[0]='1'; // 将用户输入的字符存储到input数组中
write_data('*'); // 在LCD上显示星号
delay_ms(100); // 延时100ms
}
else if(key2==0) // 如果按键2被按下
{
input[1]='2'; // 将用户输入的字符存储到input数组中
write_data('*'); // 在LCD上显示星号
delay_ms(100); // 延时100ms
}
else if(key3==0) // 如果按键3被按下
{
input[2]='3'; // 将用户输入的字符存储到input数组中
write_data('*'); // 在LCD上显示星号
delay_ms(100); // 延时100ms
}
else if(key4==0) // 如果按键4被按下
{
input[3]='4'; // 将用户输入的字符存储到input数组中
write_data('*'); // 在LCD上显示星号
delay_ms(100); // 延时100ms
for(i=0;i<4;i++) // 检查用户输入的密码是否正确
{
if(input[i]!=password[i]) // 如果有一个字符不匹配,终止循环
{
break;
}
if(i==3) // 如果全部字符都匹配,设置success标志位并终止循环
{
success=1;
break;
}
}
if(success==1) // 如果密码正确
{
write_com(0x01); // 清屏
write_com(0x80); // 光标移动到第一行第一列
write_data('S'); // 在LCD上显示"Success!"
write_data('u');
write_data('c');
write_data('c');
write_data('e');
write_data('s');
write_data('s');
delay_ms(2000); // 延时2秒
write_com(0x01); // 清屏
write_com(0x80); // 光标移动到第一行第一列
write_data('P'); // 在LCD上显示"Password:"
write_data(' '); // 在LCD上显示一个空格
write_data('*'); // 在LCD上显示一个星号
write_data('*'); // 在LCD上显示一个星号
write_data('*'); // 在LCD上显示一个星号
write_data('*'); // 在LCD上显示一个星号
success=0; // 将success标志位清零,准备下一次验证
}
else // 如果密码错误
{
write_com(0x01); // 清屏
write_com(0x80); // 光标移动到第一行第一列
write_data('E'); // 在LCD上显示"Error!"
write_data('r');
write_data('r');
write_data('o');
write_data('r');
delay_ms(2000); // 延时2秒
write_com(0x01); // 清屏
write_com(0x80); // 光标移动到第一行第一列
write_data('P'); // 在LCD上显示"Password:"
write_data(' '); // 在LCD上显示一个空格
write_data('*'); // 在LCD上显示一个星号
write_data('*'); // 在LCD上显示一个星号
write_data('*'); // 在LCD上显示一个星号
write_data('*'); // 在LCD上显示一个星号
for(i=0;i<4;i++) // 将input数组清零,准备下一次输入
{
input[i]=0;
}
}
}
}
}
```
这个代码示例实现了一个简单的四位密码锁,用户需要依次按下预设的四个按键来输入密码,如果输入正确,LCD上会显示"Success!",并且在两秒后自动清屏;如果输入错误,LCD上会显示"Error!",并且在两秒后自动清屏。用户每次输入完成后,LCD上会重新显示"Password: ****",表示等待下一次输入。
需要注意的是,这个代码示例仅供参考,实际应用中可能需要根据具体情况进行修改和优化。另外,建议使用更加安全可靠的密码算法,避免密码被破解。