#include<avr/io.h>
#include<avr/eeprom.h>
#include"delay.h"
#include"keyboard.h"
#include"lcd1602.h"
unsigned char name[]={" code lock"};
unsigned char name1[]={"key:"};
unsigned char name2[]={"set:"};
unsigned char new1[]={"new1:"};
unsigned char new2[]={"new2:"};
unsigned char rightname[]={" right!"};
unsigned char errorname[]={" error!"};
unsigned char setname[]={" set ok!"};
unsigned char keyvalue[]={0,0,0,0,0,0}; //输入缓冲区
unsigned char keyvalue1[]={0,0,0,0,0,0}; //密码设置缓冲区
unsigned char keyvalue2[]={0,0,0,0,0,0};
unsigned char keyvalue4[]={0,0,0,0,0,0}; //密码读出缓冲区
unsigned char i=0;
unsigned char key;
void keyvalue_init() // 输入缓冲区清0
{
unsigned char k;
for(k=0;k<6;k++)
{
keyvalue[k]=0;
}
}
void keyvalue1_init() //密码设置缓冲区1清0
{
unsigned char k;
for(k=0;k<6;k++)
{
keyvalue1[k]=0;
}
}
void keyvalue2_init() //密码设置缓冲区2清0
{
unsigned char k;
for(k=0;k<6;k++)
{
keyvalue2[k]=0;
}
}
void keyvalue4_init() //密码设置缓冲区2清0
{
unsigned char k;
for(k=0;k<6;k++)
{
keyvalue2[k]=0;
}
}
void inputcode() //数字密码的输入
{
if(key==0)
{
LCD_write_char(0,'0');
keyvalue[i]=0+0x30;
}
else if(key==1)
{
LCD_write_char(0,'1');
keyvalue[i]=1+0x30;
}
else if(key==2)
{
LCD_write_char(0,'2');
keyvalue[i]=2+0x30;
}
else if(key==3)
{
LCD_write_char(0,'3');
keyvalue[i]=3+0x30;
}
else if(key==4)
{
LCD_write_char(0,'4');
keyvalue[i]=4+0x30;
}
else if(key==5)
{
LCD_write_char(0,'5');
keyvalue[i]=5+0x30;
}
else if(key==6)
{
LCD_write_char(0,'6');
keyvalue[i]=6+0x30;
}
else if(key==7)
{
LCD_write_char(0,'7');
keyvalue[i]=7+0x30;
}
else if(key==8)
{
LCD_write_char(0,'8');
keyvalue[i]=8+0x30;
}
else if(key==9)
{
LCD_write_char(0,'9');
keyvalue[i]=9+0x30;
}
i++;
}
void resetcode() //密码的重置
{
unsigned char number,number1=0,flag=1,flag1=1,flag2=1;
LCD_Init();
DisplayListChar(0,0,name);
DisplayListChar(0,1,name2); //set:
LCD_write_char(LCD_CURSOR_SET2,0); // 光标设定模式2,光标会出现在地址计数器所指的位置,光标闪烁
LCD_write_char(0x80+0x40+4,0);
while(flag)
{
if(key_scan())
{
key = get_key();
if((key==0)|(key==1)|(key==2)|(key==3)|(key==4)|(key==5)|(key==6)|(key==7)|(key==8)|(key==9))
{
inputcode();
}
else if(key==10) //返回普通密码输入状态
{
i=0;
keyvalue_init();
flag=0;
LCD_Init();
DisplayListChar(0,0,name);
DisplayListChar(0,1,name1); //key:
LCD_write_char(LCD_CURSOR_SET2,0);
LCD_write_char(0x80+0x40+4,0);
}
else if(key==11) //确认,比较输入密码与正确密码
{
number=0,number1=0;
i=0;
for(number=0;number<6;number++)
{
if(keyvalue[number]==keyvalue4[number]) //keyvalue4[number]为eeprom读出来的数据
number1++;
}
if(number1!=number) //密码不正确
{
number1=0,number=0;
keyvalue_init();
LCD_Init();
//relay=1;
DisplayListChar(0,0,name);
DisplayListChar(0,1,errorname);
delay_ms(1000);
LCD_Init();
//relay=1;
DisplayListChar(0,0,name);
DisplayListChar(0,1,name2); //set:
LCD_write_char(LCD_CURSOR_SET2,0);
}
else if(number1==number) //密码输入正确
{
number=0,number1=0;
LCD_Init();
keyvalue_init();
DisplayListChar(0,0,name);
DisplayListChar(0,1,new1); //new1:
LCD_write_char(LCD_CURSOR_SET2,0);
while(flag1) //输入新密码
{
keyvalue_init();
if(key_scan())
{
key = get_key();
if((key==0)|(key==1)|(key==2)|(key==3)|(key==4)|(key==5)|(key==6)|(key==7)|(key==8)|(key==9))
{
inputcode();
}
else if(key==10)
{
i=0;
keyvalue_init();
flag=0,flag1=0;
}
else if(key==11) //确认
{
number=0,number1=0;
i=0;
for(number=0;number<6;number++)
{
keyvalue1[number]=keyvalue[number];
delay_1ms();
}
LCD_Init();
//relay=0;
DisplayListChar(0,0,name);
DisplayListChar(0,1,new2); //new2
LCD_write_char(LCD_CURSOR_SET2,0);
while(flag2)
{
keyvalue_init();
if(key_scan())
{
key = get_key();
if((key==0)|(key==1)|(key==2)|(key==3)|(key==4)|(key==5)|(key==6)|(key==7)|(key==8)|(key==9))
{
inputcode();
}
else if(key==10)
{
i=0;
keyvalue_init();
flag=0,flag1=0,flag2=0;
}
else if(key==11) //两次新密码输入相同,设置成功
{
number=0,number1=0;
i=0;
for(number=0;number<6;number++)
{
keyvalue2[number]=keyvalue[number];
}
keyvalue_init();
for(number=0;number<6;number++)
{
if(keyvalue2[number]==keyvalue1[number])
number1++;
}
if(number1==number)
{
number=0,number1=0;
LCD_Init();
DisplayListChar(0,0,name);
DisplayListChar(0,1,setname);//set ok!
delay_ms(1000);
LCD_Init();
//relay=0;
DisplayListChar(0,0,name);
DisplayListChar(0,1,name1); //key:
LCD_write_char(LCD_CURSOR_SET2,0);
flag2=0;
flag1=0;
flag=0;
for(number=0;number<6;number++) //密码设置成功,把密码输入到eeprom里面
{
eeprom_busy_wait();
eeprom_write_byte(0x20+number,keyvalue2[number]);
}
keyvalue1_init();
keyvalue2_init();
}
else if(number1!=number) //两次新密码输入不相同,设置不成功
{
number=0,number1=0;
LCD_Init();
DisplayListChar(0,0,name);
DisplayListChar(0,1,errorname);
delay_ms(1000);
LCD_Init();
//relay=1;
DisplayListChar(0,0,name);
DisplayListChar(0,1,name2); //set:
LCD_write_char(LCD_CURSOR_SET2,0);
flag2=0;
flag1=0;
keyvalue1_init();
keyvalue2_init();
}
}
}
}
}
}
}
}
}
}
}
}
void rightkey() //正确的密码
{
LCD_Init();
//relay=0;
DisplayListChar(0,0,name);
DisplayListChar(0,1,rightname);
delay_ms(1000);
LCD_Init();
//relay=0;
DisplayListChar(0,0,name);
DisplayListChar(0,1,name1);
LCD_write_char(LCD_CURSOR_SET2,0);
}
void errorkey() //错误的密码
{
LCD_Init();
//relay=1;
DisplayListChar(0,0,name);
DisplayListChar(0,1,errorname);
delay_ms(1000);
LCD_Init();
//relay=1;
DisplayListChar(0,0,name);
DisplayListChar(0,1,name1);
LCD_write_char(LCD_CURSOR_SET2,0);
}
void initkey()
{
memory_init();
LCD_Init();
DisplayListChar(0,0," INIT OK!");
delay_ms(1000);
LCD_Init();
DisplayListCha