能成功利用矩阵键盘和存储芯片24c02实现密码锁功能,包括正确密码进入欢迎界面、修改密码、输入错误密码3次锁死15秒、密码掉电存储的C语言程序代码
时间: 2023-11-26 20:06:47 浏览: 34
以下是一个基本的密码锁功能程序,使用矩阵键盘和存储芯片24c02。请注意,这个程序可能需要根据具体电路设计进行调整。
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA = P2^0; // I2C总线数据线
sbit SCL = P2^1; // I2C总线时钟线
sbit LED = P1^0; // 指示灯
sbit BEEP = P1^1; // 蜂鸣器
uchar code password[4] = {1, 2, 3, 4}; // 初始密码
uchar passwordInput[4] = {0, 0, 0, 0}; // 输入的密码
uchar passwordIndex = 0; // 当前输入的密码位
uint errorCount = 0; // 错误次数
bit locked = 0; // 是否锁定
void delay(uint t) // 延时函数
{
uint i, j;
for (i = 0; i < t; i++)
for (j = 0; j < 120; j++);
}
void start() // I2C总线开始信号
{
SDA = 1;
SCL = 1;
_nop_();
_nop_();
_nop_();
SDA = 0;
_nop_();
_nop_();
_nop_();
SCL = 0;
}
void stop() // I2C总线停止信号
{
SDA = 0;
SCL = 1;
_nop_();
_nop_();
_nop_();
SDA = 1;
_nop_();
_nop_();
_nop_();
}
void ack() // I2C总线应答信号
{
SDA = 0;
SCL = 1;
_nop_();
_nop_();
_nop_();
SCL = 0;
SDA = 1;
}
void nack() // I2C总线非应答信号
{
SDA = 1;
SCL = 1;
_nop_();
_nop_();
_nop_();
SCL = 0;
SDA = 1;
}
void writeByte(uchar byte) // 写入一个字节到I2C总线
{
uchar i;
for (i = 0; i < 8; i++)
{
SDA = (byte & 0x80) >> 7;
byte <<= 1;
SCL = 1;
_nop_();
_nop_();
_nop_();
SCL = 0;
}
ack(); // 写入完成后等待应答信号
}
uchar readByte() // 从I2C总线读取一个字节
{
uchar i, byte = 0;
SDA = 1;
for (i = 0; i < 8; i++)
{
byte <<= 1;
SCL = 1;
_nop_();
_nop_();
_nop_();
byte |= SDA;
SCL = 0;
}
return byte;
}
void writePassword() // 将密码写入24c02芯片
{
uchar i;
start();
writeByte(0xa0); // 写入地址1010000,最高位0表示写入
writeByte(0); // 写入地址0,表示从第0个字节开始写入
for (i = 0; i < 4; i++)
writeByte(password[i]);
stop();
}
void readPassword() // 从24c02芯片读取密码
{
uchar i;
start();
writeByte(0xa0); // 写入地址1010000,最高位0表示写入
writeByte(0); // 写入地址0,表示从第0个字节开始读取
start();
writeByte(0xa1); // 写入地址1010001,最高位1表示读取
for (i = 0; i < 4; i++)
{
password[i] = readByte();
if (i < 3)
ack();
}
nack(); // 读取完成后发送非应答信号
stop();
}
void checkPassword() // 检查输入的密码是否正确
{
uchar i;
for (i = 0; i < 4; i++)
if (passwordInput[i] != password[i])
return;
locked = 0;
errorCount = 0;
LED = 1;
BEEP = 0;
delay(500);
BEEP = 1;
delay(500);
}
void lock() // 锁定
{
locked = 1;
errorCount = 0;
LED = 0;
BEEP = 0;
delay(500);
BEEP = 1;
delay(500);
}
void main()
{
uchar key, i;
readPassword();
while (1)
{
key = P3; // 读取键盘输入
if (key == 0xff) // 没有按键按下
continue;
delay(50); // 延时去抖动
if (key == 0xff) // 再次检查是否有按键按下
continue;
for (i = 0; i < 4; i++) // 根据按下的按键确定输入的密码
if (key == (0x80 >> i))
{
passwordInput[passwordIndex++] = i + 1;
break;
}
if (passwordIndex == 4)
{
if (locked)
{
BEEP = 0;
delay(500);
BEEP = 1;
delay(500);
}
else if (errorCount < 3)
{
checkPassword();
if (locked)
lock();
}
else
{
lock();
delay(15000);
}
passwordIndex = 0;
}
}
}
```
这个程序使用了一个24c02芯片来存储密码,并使用了一个矩阵键盘来输入密码。程序会检查输入的密码是否正确,如果错误次数达到3次,则会锁定15秒钟。如果在锁定期间输入正确的密码,则会解锁。如果输入了错误的密码超过3次,则会一直锁定直到输入正确的密码。程序还包括了一个指示灯和一个蜂鸣器来提示用户输入密码的状态。