#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include"lcd1602.h"
#include"i2c.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit BUZZER=P2^3; //蜂鸣器控制引脚
sbit LED=P3^4;
#define GPIO_KEY P1 //4X4矩阵键盘输入
unsigned char KeyValue; //用来存放读取到的键值
unsigned char saved_Value[6]; //初始密码
unsigned char input_Value[6];
unsigned char input[]="input a password";
unsigned char old[]="old password ";
unsigned char new[]="new password ";
unsigned char Right_flg=0,Right_flg0=0;//密码输入正确标志
unsigned char set_flg=0,LOCK_flg=0; //修改密码和锁定标志
unsigned char temp00;
unsigned int time_cnt,delay_ddll;
long int DECvalue=0;
u8 ding,dong,flag,stop;
u16 n;
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(unsigned int s)
{
while(s--);
}
//蜂鸣器
void beep1(void) //按键响声
{
BUZZER=0;
Lcd1602_Delay1ms(5);
BUZZER=1;
}
void beep2(void) //输入错误
{
BUZZER=0;
Lcd1602_Delay1ms(100);
BUZZER=1;
}
void beep3(void) //三次输入错误
{
char u=100;
while(u--)
{
BUZZER=~BUZZER;
}
}
//存储芯片存储的内容
/*===============================================
地址: 0 1 2 3 4 5 6 7
数据:无 密码 密码 密码 密码 密码 密码 错误次数
=================================================*/
//门铃输入正确
void biaohaoinit() //各个标号初始化
{
ding=0; //叮声音 计数标志
dong=0; //咚声音 计数标志
n=0; //定时0.5s标志
flag=0;
stop=0; //结束标志
}
void TimerConfiguration(void); //定时中断
void KeyDown(); //检测按键函数
void At24c02Write(unsigned char addr,unsigned char dat);
unsigned char At24c02Read(unsigned char addr);
void clear_window();
void Lcd1602_Delay1ms();
//主函数
void main()
{
char i=0,j=0,k=0;
unsigned char u;
clear_window();
TimerConfiguration(); //初始化定时器
LcdInit(); //液晶初始化
for(i=0;i<16;i++)
{
// LcdWriteCom(0x80);
LcdWriteData(input[i]);
}
delay(100);
// for(u=0;u<6;u++)
// {
// At24c02Write(u+1,0);
// delay(1000); //间隔一段时间扫描
// }
At24c02Write(7,0); ////清除错误输入次数
delay(1000); //间隔一段时间扫描
for(u=0;u<6;u++)
{
saved_Value[u]=At24c02Read(u+1);
delay(100); //间隔一段时间扫描
}
LED=1;
BUZZER=1;
while(1)
{
KeyDown(); //按键扫描
//输入密码
if (KeyValue<=14 && !set_flg && !LOCK_flg) //有按键按下
{
LcdWriteCom(0x80);
LcdWriteData('I');
LcdWriteData('N');
LcdWriteData('P');
LcdWriteData('U');
LcdWriteData('T');
beep1();
input_Value[i]=KeyValue;
if (Right_flg0)
{ clear_window(); //错误清屏
Right_flg0=0;
}
LcdWriteCom(0x80+0x40+i); //显示当前按键的值
LcdWriteData('*');
i++;
if(i>=6) //判断
{
Right_flg0=0;
for (j=0;j<6;j++)
{
if (input_Value[j]!=saved_Value[j])
Right_flg0=1;
}
clear_window();
TR0=0;
if(!Right_flg0) //密码输入正确
{
TR0=1; //打开定时器0
while(!stop);
LED=0;
Lcd1602_Delay1ms(1000);
LED=1;
clear_window();
LcdWriteCom(0x80+i);
LcdWriteData('O');
LcdWriteData('P');
LcdWriteData('E');
LcdWriteData('N');
LcdWriteData('!');
Lcd1602_Delay1ms(1000);
// TR0=1; //打开定时器0
// while(!stop);
// LED=0;
// Lcd1602_Delay1ms(5);
// LED=1;
clear_window();
LcdWriteCom(0x80);
LcdWriteData('I');
LcdWriteData('N');
LcdWriteData('P');
LcdWriteData('U');
LcdWriteData('T');
At24c02Write(7,0); //清除错误输入次数
}
else
{
LED=1;
// BUZZER=0; //声音报警
// delay(10000);
// BUZZER=1; //声音报警
beep2();
LcdWriteCom(0x80+i);
LcdWriteData('W');
LcdWriteData('R');
LcdWriteData('O');
LcdWriteData('N');
LcdWriteData('G');
Lcd1602_Delay1ms(500);
clear_window();
LcdWriteCom(0x80);
LcdWriteData('I');
LcdWriteData('N');
LcdWriteData('P');
LcdWriteData('U');
LcdWriteData('T');
temp00=At24c02Read(7); ////存储输入错误次数
if (temp00>=2) //连续输入错误超过3次
{
clear_window();
LOCK_flg=1;
// BUZZER=0; //声音报警
// Lcd1602_Delay1ms(2000);
//// BUZZER=1; //声音报警
// beep3();
LcdWriteCom(0x80+5);
LcdWriteData('C');
LcdWriteData('L');
LcdWriteData('0');
LcdWriteData('S');
LcdWriteData('E');
BUZZER=0; //声音报警
Lcd1602_Delay1ms(2000);
}
At24c02Write(7,temp00+1);
}
i=0;
}
}
//修改密码
if (KeyValue<=14 && set_flg && !LOCK_flg) //有按键按下 KeyValue!=64
{
input_Value[k]=KeyValue;
LcdWriteCom(0x80+k); //显示当前按键的值
LcdWriteData('*');
k++;
if(k>=6) //判断
{
if (set_flg==2)
{
for (j=0;j<6;j++)
{
saved_Value[j]=input_Value[j];
At24c02Write(j+1,saved_Value[j]);
delay(1000); //间隔一段时间扫描
}
clear_window();
set_flg=0;
delay_ddll =1;
LcdWriteCom(0x80+6);
LcdWriteData('O');
LcdWriteData('K');
Lcd1602_Delay1ms(1000);
clear_window();
LcdWriteCom(0x80);
LcdWriteData('I');
LcdWriteData('N');
LcdWriteData('P');
LcdWriteData('U');
LcdWriteData('T');
}
if (set_flg==1)
{///============================================
Right_flg=0;
for (j=0;j<6;j++)
{
if(input_Value[j]!=saved_Value[j])
Right_flg=1;
}
clear_window();
if(!Right_flg) ///旧密码输入正确
{
set_flg=2; ///可以进行下一步操作
LcdWriteCom(0x80+0x40);
for(i=0;i<16;i++)
{
// LcdWriteCom(0x80);
LcdWriteData(new[i]);
}
}
else
{
LcdWriteCom(0x80+5);
LcdWriteData('W');
LcdWriteData('R');
LcdWriteData('O');
LcdWriteData('N');
LcdWriteData('G');
Lcd1602_Delay1ms(1000);
clear_window();
LcdWriteCom(0x80);
LcdWriteData('I');
LcdWriteData('N');
LcdWriteData('P');
LcdWriteData('U');
LcdWriteData('T');
temp00=At24c02Read(7); ////存储输入错误次数
if (temp00>=2)
{
LOCK_flg=1;
clear_window();
LcdWriteCom(0x80+6);
LcdWriteData('C');
LcdWriteData('L');
LcdWriteData('O');
LcdWriteData('S');
LcdWriteData('0');
}
At24c02Write(7,temp00+1);
}
} ///============================================
k=0;
}
}
//修改密码
if (KeyValue==0x0F && !LOCK_flg) //有按键按下
{
clear_window();
set_flg=1;
LcdWriteCom(0x80+0x40); //
for(i=0;i<16;i++)
{
// LcdWriteCom(0x80);
LcdWriteData(old[i]);
}
k=0; //=================
}
}
}
/**********************