c51单片机想要做一个重置密码的按键,想通过AT24C02来存储重置开锁的密码应该要怎么控制?
#include<reg51.h>
#include<string.h>
// 定义LCD和按键相关SFR
sbit lcd_RS = P2^0;
sbit lcd_RW = P2^1;
sbit lcd_E = P2^2;
sbit jidianqi = P2^7;
sbit buzzer = P3^0;
sbit SDA = P3^3;
sbit SCL = P3^2;
// 定义键值数组
char key[] = {0, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30};
// 定义字符串常量
char key2[] = "Correct";
char key3[] = "Error";
char table[] = "password";
char table1[] = "input:";
char passwordInput[5];
// 延时函数
void delay(unsigned int x) {
unsigned int i;
for(x = 0; x < 100; x++)
for(i = 0; i < x; i++);
}
// 五元音报警函数
void wuyuan() {
int k;
for(k = 0; k < 20; k++) {
buzzer = 1;
delay(39999);
buzzer = 0;
delay(39999);
}
}
// 写命令到LCD函数
void write_com(unsigned char com) {
while(lcd_busy());
lcd_RS = 0;
lcd_RW = 0;
delay(200);
P0 = com;
delay(200);
lcd_E = 1;
delay(200);
lcd_E = 0;
}
// 写数据到LCD函数
void write_dat(unsigned char dat) {
while(lcd_busy());
lcd_RS = 1;
lcd_RW = 0;
P0 = dat;
delay(200);
lcd_E = 1;
delay(200);
lcd_E = 0;
}
// 写密码字符到LCD函数
void write_password_char() {
write_dat(42);
}
// 判断LCD是否忙函数
lcd_busy() {
unsigned char temp;
lcd_RS = 0;
lcd_RW = 1;
delay(20);
P0 = 0xff;
delay(20);
lcd_E = 1;
delay(20);
temp = P0;
delay(20);
lcd_E = 0;
return(temp & 0x80);
}
// LCD初始化函数
void init() {
write_com(0x01);
write_com(0x38);
write_com(0x0c);
write_com(0x06);
}
// 检测矩阵键盘函数
unsigned char juxingjianpan() {
unsigned char KeyNumber, x, y;
P1 = 0x0f;
x = P1;
P1 = 0xf0;
y = P1;
switch(x + y) {
case 0xee: KeyNumber = 1; break;
case 0xde: KeyNumber = 2; break;
case 0xbe: KeyNumber = 3; break;
case 0x7e: KeyNumber = 4; break;
case 0xed: KeyNumber = 5; break;
case 0xdd: KeyNumber = 6; break;
case 0xbd: KeyNumber = 7; break;
case 0x7d: KeyNumber = 8; break;
case 0xeb: KeyNumber = 9; break;
case 0xdb: KeyNumber = 10; break;
case 0xbb: KeyNumber = 11; break;
case 0x7b: KeyNumber = 12; break;
case 0xe7: KeyNumber = 12; break;
}
return KeyNumber;
}
void main() {
static unsigned char position = 0, x = 0, y;
unsigned int i, KeyNum, passwordLen = 0;
// 初始化LCD
init();
// 在LCD上显示"password"和"input:"
write_com(0x80);
for(i = 0; i < 8; i++) {
write_dat(table[i]);
}
write_com(0xc0);
for(i = 0; i < 6; i++) {
write_dat(table1[i]);
}
while(1) {
write_com(0xc6 + position);
// 获取当前按键值
KeyNum = juxingjianpan();
if(KeyNum) {
if(KeyNum <= 10 && x <= 3) {
write_password_char();
delay(5);
passwordInput[passwordLen++] = key[KeyNum];
position++;
x++;
} else if(KeyNum == 11) { // 确认键
if(strcmp(passwordInput, "1234") == 0) {
write_com(0x01);
delay(20);
write_com(0x86);
jidianqi = 0;
for(y = 0; y < 7; y++) {
write_dat(key2[y]);
delay(5);
}
} else {
write_com(0x01);
delay(20);
write_com(0x86);
wuyuan();
for(y = 0; y < 5; y++) {
write_dat(key3[y]);
delay(5);
}
}
memset(passwordInput, 0, sizeof(passwordInput));
passwordLen = 0;
x = 0;
position = 0;
} else if(KeyNum == 12) { // 清除键
memset(passwordInput, 0, sizeof(passwordInput));
passwordLen = 0;
x = 0;
position = 0;
buzzer = 1;
delay(20);
buzzer = 0;
delay(20);
jidianqi = 1;
write_com(0x01);
write_com(0x80);
for(i = 0; i < 8; i++) {
write_dat(table[i]);
}
write_com(0xc0);
for(i = 0; i < 6; i++) {
write_dat(table1[i]);
}
}
}
}
}