#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void key_scan();
uchar count0,count1,count3,num,n=0,temp,a,j,count4;
uchar mima[6]=0; //初始密码存储区
uchar tab_key[50]; //输入密码存储区
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
bit enterflag; //确认键按下与否的标志
bit mimaflag; //密码正确与否的标志
bit xiugaiflag; //修改密码标志
bit enter1flag; //修改密码确认键标志
sbit red=P2^2;
sbit rs=P2^6;
sbit rw=P2^5;
sbit lcden=P2^7;
sbit scl=P2^1;
sbit sda=P2^0;
uchar code table1[]="input pass word ";
uchar code table2[]="de: ------";
uchar code table3[]="*";
uchar code table4[]="right (^_^) ";
uchar code table5[]="first error!!!!";
uchar code table6[]="second error!!!!";
uchar code table7[]="third error see ";
uchar code table8[]="u tomorrow (^_^)";
uchar code table9[]="define the passc";
uchar code table10[]="ode: ------";
uchar code table11[]="code is new";
void delay1()
{ ;; }
void delay2(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//void start() //开始信号
//{
// sda=1;
// delay1();
// scl=1;
// delay1();
// sda=0;
// delay1();
//}
//void stop() //停止
//{
// sda=0;
// delay1();
// scl=1;
// delay1();
// sda=1;
// delay1();
//}
////****************************应答信号*************************************
//void respond()
//{
// uchar i;
// scl=1;
// delay1();
// while((sda==1)&&(i<250))i++;
// scl=0;
// delay1();
//}
////*****************************写字节操作函数**********************************
//void write_byte(uchar date)
//{
// uchar i,temp;
// temp=date;
// for(i=0;i<8;i++)
// {
// temp=temp<<1; //保持最高位,左移到进位CY
// scl=0;
// delay1();
// sda=CY;
// delay1();
// scl=1;
// delay1();
// }
// scl=0;
// delay1();
// sda=1;//总线释放
// delay1();
//}
////*******************************读字节操作函数*****************************
//uchar read_byte()
//{
// uchar i,k;
// scl=0;
// delay1();
// sda=1;
// delay1();
// for(i=0;i<8;i++)
// {
// scl=1;
// delay1();
// k=(k<<1)|sda; //或运算,放到最低位
// scl=0;
// delay1();
// }
// return k;
//}
////**********************************写地址函数******************************
//void write_add(uchar address,uchar date)
//{
// start();
// write_byte(0xa0);
// respond();
// write_byte(address);
// respond();
// write_byte(date);
// respond();
// stop();
//}
////*******************************读地址函数*************************************
//uchar read_add(uchar address)
//{
// uchar date;
// start();
// write_byte(0xa0);
// respond();
// write_byte(address);
// respond();
// start();
// write_byte(0xa1);
// respond();
// date=read_byte();
// stop();
// return date;
//}
void start() //开始信号
{
sda=1;
delay1();
scl=1;
delay1();
sda=0;
delay1();
}
void stop() //停止
{
sda=0;
delay1();
scl=1;
delay1();
sda=1;
delay1();
}
void respons() //应答
{
uchar i;
scl=1;
delay1();
while((sda==1)&&(i<250))i++;
scl=0;
delay1();
}
// void init()
// {
// sda=1;
// delay();
// scl=1;
// delay();
// }
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay1();
sda=CY;
delay1();
scl=1;
delay1();
// scl=0;
// delay();
}
scl=0;
delay1();
sda=1;
delay1();
}
uchar read_byte()
{
uchar i,k;
scl=0;
delay1();
sda=1;
delay1();
for(i=0;i<8;i++)
{
scl=1;
delay1();
k=(k<<1)|sda;
scl=0;
delay1();
}
return k;
}
void write_add(uchar address,uchar date)
{
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
}
uchar read_add(uchar address)
{
uchar date;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;
}
//****************************LCD1602的初始化*******************************
void write_com(uchar com)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
bit mimacmp()
{
bit flag;
uchar i;
for(i=0;i<6;i++)
{
if(mima[i]==tab_key[i])
flag=1;
else
{
flag=0;
i=6;
}
}
return(flag); //返回flag
}
void lcd_display()
{
uchar i=0;
write_com(0x80+0x40+10);
for(i=0;i<n;i++)
{
write_date(table3[0]);
}
}
void key_manage1()
{
tab_key[n]=0;
n++;
if(xiugaiflag==1)
{
mima[count4]=0;
count4++;
}
}
void key_manage2()
{
tab_key[n]=1;
n++;
if(xiugaiflag==1)
{
mima[count4]=1;
count4++;
}
}
void key_manage3()
{
tab_key[n]=2;
n++;
if(xiugaiflag==1)
{
mima[count4]=2;
count4++;
}
}
void key_manage4()
{
tab_key[n]=3;
n++;
if(xiugaiflag==1)
{
mima[count4]=3;
count4++;
}
}
void key_manage5()
{
tab_key[n]=4;
n++;
if(xiugaiflag==1)
{
mima[count4]=4;
count4++;
}
}
void key_manage6()
{
tab_key[n]=5;
n++;
if(xiugaiflag==1)
{
mima[count4]=5;
count4++;
}
}
void key_manage7()
{
tab_key[n]=6;
n++;
if(xiugaiflag==1)
{
mima[count4]=6;
count4++;
}
}
void key_manage8()
{
tab_key[n]=7;
n++;
if(xiugaiflag==1)
{
mima[count4]=7;
count4++;
}
}
void key_manage9()
{
tab_key[n]=8;
n++;
if(xiugaiflag==1)
{
mima[count4]=8;
count4++;
}
}
void key_manage10()
{
tab_key[n]=9;
n++;
if(xiugaiflag==1)
{
mima[count4]=9;
count4++;
}
}
void key_manage11()
{
enterflag=1; //确认键按下
if(n==6) //只有输入8个密码后按确认才做比较
mima