写一个基于STC89C51和lcd1602的密码锁代码,要求密码不少于6位
时间: 2023-05-31 11:03:26 浏览: 62
以下是基于STC89C51和lcd1602的密码锁代码,密码为6位,密码为123456:
```c
#include <reg52.h>
#include <string.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS = P2^6; // LCD的RS端口
sbit EN = P2^7; // LCD的EN端口
sbit D0 = P0^0; // 数据线D0
sbit D1 = P0^1; // 数据线D1
sbit D2 = P0^2; // 数据线D2
sbit D3 = P0^3; // 数据线D3
sbit D4 = P0^4; // 数据线D4
sbit D5 = P0^5; // 数据线D5
sbit D6 = P0^6; // 数据线D6
sbit D7 = P0^7; // 数据线D7
uchar code table[] = "123456"; // 设置密码
uchar password[7] = ""; // 存储输入的密码
uchar len = 0; // 输入的密码长度
void delay(uint xms) // 延时函数
{
uint i, j;
for (i=0; i<xms; i++)
for (j=0; j<112; j++);
}
void write_com(uchar com) // 写入命令函数
{
RS = 0; // RS = 0,发送命令
EN = 0; // EN = 0,准备发送
P0 = com; // 将命令送入数据线
delay(1); // 等待一段时间
EN = 1; // EN = 1,发送命令
delay(5); // 等待一段时间
EN = 0; // EN = 0,完成发送
}
void write_data(uchar dat) // 写入数据函数
{
RS = 1; // RS = 1,发送数据
EN = 0; // EN = 0,准备发送
P0 = dat; // 将数据送入数据线
delay(1); // 等待一段时间
EN = 1; // EN = 1,发送数据
delay(5); // 等待一段时间
EN = 0; // EN = 0,完成发送
}
void init_lcd() // 初始化LCD函数
{
write_com(0x38); // 设置为8位数据接口,2行显示,5x7点阵字符
write_com(0x0c); // 开启显示,光标不显示,光标闪烁不显示
write_com(0x06); // 设置光标移动方向,不移动屏幕
write_com(0x01); // 清屏
}
void show_string(uchar x, uchar y, uchar *str) // 在指定位置显示字符串函数
{
uchar i;
if (y == 0)
write_com(0x80 + x); // 在第一行
else
write_com(0xc0 + x); // 在第二行
for (i=0; i<strlen(str); i++)
write_data(str[i]);
}
void main()
{
uchar i;
uchar input[7] = "";
init_lcd(); // 初始化LCD
show_string(2, 0, "Password Lock"); // 在第一行显示字符串
while (1)
{
for (i=0; i<6; i++) // 读取6个按键
{
if (P1 & (1<<i)) // 按键按下
{
password[len] = '0' + i + 1; // 将按键编号转换为字符
len++; // 输入密码长度加1
show_string(0, 1, password); // 在第二行显示输入的密码
delay(500); // 等待一段时间
}
}
if (len == 6) // 输入的密码长度为6
{
if (strcmp(password, table) == 0) // 输入的密码正确
{
show_string(0, 1, "Password OK"); // 在第二行显示密码正确
delay(1000); // 等待一段时间
len = 0; // 输入密码长度清零
password[0] = '\0'; // 输入的密码清空
show_string(0, 1, " "); // 在第二行清空显示
show_string(2, 0, "Password Lock"); // 在第一行显示字符串
}
else // 输入的密码不正确
{
show_string(0, 1, "Password Error"); // 在第二行显示密码错误
delay(1000); // 等待一段时间
len = 0; // 输入密码长度清零
password[0] = '\0'; // 输入的密码清空
show_string(0, 1, " "); // 在第二行清空显示
show_string(2, 0, "Password Lock"); // 在第一行显示字符串
}
}
}
}
```