电子密码锁
1.LCD1602显示
2.有修改密码的功能
3.使用51单片机模拟I2C通信,数据通过读写EEPROM进行存储
代码
此代码只包含程序的主体(main),各使用器件的初始化放个其它引用文件中,程序中定义了很多标志位,变量名取的很随意取的。开机会显示一下密码
#include"reg52.h"
#include"key.h"
#include"lcd.h"
#include"iic.h"
#define u16 unsigned int
#define u8 unsigned char
//EEPROM的读写--不能有0号位置
u8 poi[]="pji";
u8 datt,state,sta1;passqors_length=6,orig_password[10],enter_password[10],enter_pass_Length,enter_pass_Length2,Length_f,Length1_f,fs=3,lop=0,lop2=0,i=0,Length1_f2;
u16 key_va;
void state_0();
void state_1();
void state_2();
void state_3();
void state_4();
void state_5();
void state_6();
u8 input_password();
u8 cantrast();
void main(){
u8 a,data1;
//lcd_com(0x01);//进来先清下lcd屏幕
lcd_init();
for(data1=1;data1<passqors_length+3;data1++) // 开始的时候屏幕会显示下EEPROM中的数据
{
a=At24c02Read(data1)+0x30;
lcd_data(a);
}
delay(100);
if(At24c02Read(1)!=1){ //判断1位置--标志位{密码是否存在}--不存在初始化密码---888888
At24c02Write(1,1); //储存都是一个字节八位数据
At24c02Write(2,6); //密码长度定义为六
for(datt=3;datt<passqors_length+3;datt++){
At24c02Write(datt,8);
}
}
delay(100);
for(a=1;a<passqors_length+1;a++){ //将密码读出来---保存到数组orig_password中去
orig_password[a]=At24c02Read(a+2);
}
enter_pass_Length=0;
sta1=0; //用于判断--是进入修改密码---还是登录
state=0;
Length_f=0;
Length1_f=0;
Length1_f2=0;
while(1){
key_va=keyvalude(); //每时每刻都在获取键值
switch(state){
case(0):
state_0();
break;
case(1):
state_1();
break;
case(2):
state_2();
break;
case(3):
state_3();
break;
case(4):
state_4();
break;
case(5):
state_5();
break;
case(6):
state_6();
break;
}
}
}
void state_0(){
show(0x00,"----welcome----");
// show(0x1f,key_va);
if(key_va==16){
state=1;
}
}
void state_1(){
show(0x00,"change password");
show(0x0f,"<");
show(0x10,"enter password");
show(0x1f," ");
state=5;
}
void state_2(){
u8 flag;
if(Length_f==1){
enter_pass_Length=0;
Length_f=0;
}
if(lop==0){
lcd_com(0x01);
show(0x00,"original password:");
lcd_com(0x80+0x40);
//lcd_com(0x06);
lop=1;
}
if(key_va>0 && key_va<10){
// enter_pass_Length=0;
enter_password[enter_pass_Length]=key_va; //密码长度不会冲突
enter_pass_Length++; //输入密码的长度
lcd_data(0x30+key_va);
}
if(key_va==16){
flag=cantrast();
if(flag==0){ //密码修改成功---返回初始状态
lcd_com(0x01);
show(0x00,"OK");
delay(1000);
state=4;
}else{
lcd_com(0x01);
show(0x00,"err_changep");
delay(100);
state=2;
Length_f=1;
lop=0;
}
enter_pass_Length=0;
}
}
void state_3(){
u8 flag;
if(Length1_f2==1){
enter_pass_Length=0;
Length1_f2=0;
}
if(lop2==0){
lcd_com(0x01);
show(0x00,"password:");
lcd_com(0x80+0x40);
lop2=1;
}
if(key_va>0 && key_va<10){
// enter_pass_Length=0;
enter_password[enter_pass_Length]=key_va;
enter_pass_Length++; //输入密码的长度
lcd_data('*');
}
if(key_va==16){
flag=cantrast();
if(flag==0){ //
lcd_com(0x01);
show(0x00,"china");
delay(1000);
}else{
lcd_com(0x01);
show(0x00,"err");
delay(1000);
Length1_f=1;
lop2=0;
state=3;
}
}
}
void state_4(){
if(i==0){
show(0x00,"new password:");
lcd_com(0x80+0x40);
}
if(key_va>0 && key_va<10){
i=1;
At24c02Write(fs,key_va);
fs++;
lcd_data('*');
}
if(key_va==16){
lcd_com(0x01);
show(0x00,"pass ok password");
delay(1000);
state=6;
}
}
void state_5(){
if(key_va==1){
show(0x0f,"<");
show(0x1f," ");
sta1=0;
}
if(key_va==5){
show(0x0f," ");
show(0x1f,"<");
sta1=1;
}
if(key_va==16){
if(sta1==0){
state=2; //修改密码
}else{
state=3; //输入密码
}
}
}
void state_6(){
lcd_com(0x01);
show(0x00,"zengcheng");
enter_pass_Length=0;
sta1=0;
Length_f=0;
Length1_f=0;
lop=0;
lop2=0;
i=0;
fs=3;
delay(10000);
state=0;
}
u8 cantrast(){
u8 x=0,y=0;
if(enter_pass_Length==passqors_length){
for(x=1;x<7;x++){
if(enter_password[x-1]==At24c02Read(x+2)){
break;
}else{
return 1;
}
}
}else{
return 1;
}
return 0;
}
u8 input_password(){
u8 flag;
while(1){
if(key_va>0 && key_va<10){
// enter_pass_Length=0;
enter_password[enter_pass_Length]=key_va; //密码长度不会冲突
enter_pass_Length++; //输入密码的长度
lcd_data(0x30+key_va);
}
if(key_va==16){
flag=cantrast();
if(flag==0){ //密码修改成功---返回初始状态
lcd_com(0x01);
show(0x00,"OK");
delay(50);
// state=4;
return 4;
}else{
lcd_com(0x01);
show(0x00,"err_changep");
delay(50);
// state=2;
Length_f=1;
lop=0;
return 2;
}
}
}
}