51单片机电子密码锁

电子密码锁

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;
			}
		}
 
   }

}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值