- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code table[4]={0xef,0xdf,0xbf,0x7f}; //位选码
- uchar code table1[4]={0x3d,0x28,0x3c,0x61};//显示"锁"字
- uchar code table2[4]={0x28,0x70,0x30,0x68};//显示"开"字
- uchar code table3[4]={0x74,0x60,0xeb,0x3d};//显示"失败"字
- uchar inbuf[4]={0x3d,0x28,0x3c,0x61}; //输入缓冲区
- uchar pm[4]={1,2,3,4};//密码
- uchar inbuf[4],pmbuf[4];
- uchar temp,enterflag,num2,count;
- sbit sda=P3^5;
- sbit scl=P3^4;
- sbit D1=P3^7; //蜂鸣器
- sbit D2=P3^3; //复位键
- sbit D3=P3^6; //继电器
- void delayus() //延时几微秒
- { ;; }
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=120;y>0;y--);
- }
- void start() //开始信号
- {
- sda=1;
- delayus();
- scl=1;
- delayus();
- sda=0;
- delayus();
- }
- void stop() //停止信号
- {
- sda=0;
- delayus();
- scl=1;
- delayus();
- sda=1;
- delayus();
- }
- void respons() //应答信号
- {
- uchar i;
- scl=1;
- delayus();
- while((sda==1)&&(i<250))i++;
- scl=0;
- delayus();
- }
- void init() //初始化
- {
- sda=1;
- delayus();
- scl=1;
- delayus();
- }
- void write_byte(uchar date) //主机向24c02写数据
- {
- uchar i,temp;
- temp=date;
- for(i=0;i<8;i++)
- {
- temp=temp<<1;
- scl=0;
- delayus();
- sda=CY;
- delayus();
- scl=1;
- delayus();
- delayus();
- }
- scl=0;
- delayus();
- sda=1;
- delayus();
- }
- uchar read_byte() //主机从24c02读数据
- {
- uchar i,k;
- scl=0;
- delayus();
- sda=1;
- delayus();
- for(i=0;i<8;i++)
- {
- scl=1;
- delayus();
- k=(k<<1)|sda;
- scl=0;
- delayus();
- }
- 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;
- }
- //****设置密码****//
- void pmset()
- {
- uchar i;
- for(i=0;i<4;i++)
- {
- init();
- write_add(i,pmbuf[i]);
- }
- delay(100);
- for(i=0;i<4;i++)
- {
- init();
- pm[i]=read_add(i);
- }
- }
- //****读取密码****//
- void readpm()
- {
- uchar i;
- for(i=0;i<4;i++)
- {
- init();
- pm[i]=read_add(i);
- }
- }
- //****密码比较****//
- uchar pmcmp()
- {
- char flag;
- char t,num1;
- t=0;
- num1=0;
- for(t=0;t<4;t++)
- if(pm[t]==pmbuf[t])
- num1++;
- if(num1==4)
- flag=1;
- else{ flag=0;t=4;}
- return(flag);
- }
- //****键盘扫描****//
- uchar keyscan()
- {
- uchar num=0;
- temp=P2;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- delay(10);
- temp=P2;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- temp=P2;
- switch(temp)
- {
- case 0xee:num=1;
- break;
- case 0xde:num=2;
- break;
- case 0xbe:num=3;
- break;
- case 0x7e:num=4;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P2;
- temp=temp&0xf0;
- }
- }
- }
- P2=0xfd;
- temp=P2;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- delay(10);
- temp=P2;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- delay(10);
- temp=P2;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- temp=P2;
- switch(temp)
- {
- case 0xed:num=5;
- break;
- case 0xdd:num=6;
- break;
- case 0xbd:num=7;
- break;
- case 0x7d:num=8;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P2;
- temp=temp&0xf0;
- }
- }
- }
- P2=0xfb;
- temp=P2;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- delay(10);
- temp=P2;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- temp=P2;
- switch(temp)
- {
- case 0xeb:num=9;
- break;
- case 0xdb:num=10;
- break;
- case 0xbb:num=11;
- break;
- case 0x7b:num=12;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P2;
- temp=temp&0xf0;
- }
- }
- }
- }
- return num;
- }
- //****主程序****//
- void main()
- { uchar key,count,pmflag;
- uchar i,j;
- count=0;
- num2=0;
- enterflag=0;
- pmflag=0;
- readpm();
- while(1)
- {
- for(i=0;i<4;i++)
- {
- P2=table[i];
- P0=inbuf[i];
- for(j=500;j>0;j--);
- }
- P2=0xff;
- key=keyscan();
- switch(key)
- {
- case 1:
- if(count<4)
- { inbuf[count]=0xf7;
- pmbuf[count]=0;
- count++;
- }
- break;
- case 2:
- if(count<4)
- { inbuf[count]=0xf7;
- pmbuf[count]=1;
- count++;
- }
- break;
- case 3:
- if(count<4)
- { inbuf[count]=0xf7;
- pmbuf[count]=2;
- count++;
- }
- count++;
- }
- break;
- /*
- case 3:
- if(count<4)
- { inbuf[count]=0xf7;
- pmbuf[count]=2;
- count++;
- }
- break;
- */
- case 4:
- if(count<4)
- { inbuf[count]=0xf7;
- pmbuf[count]=3;
- count++;
- }
- break;
- case 5:
- if(count<4)
- { inbuf[count]=0xf7;
- pmbuf[count]=4;
- count++;
- }
- break;
- case 6:
- if(count<4)
- { inbuf[count]=0xf7;
- pmbuf[count]=5;
- count++;
- }
- break;
- case 7:
- if(count<4)
- { inbuf[count]=0xf7;
- pmbuf[count]=6;
- count++;
- }
- break;
- case 8:
- if(count<4)
- { inbuf[count]=0xf7;
- pmbuf[count]=7;
- count++;
- }
- break;
- case 9:
- if(count<4)
- { inbuf[count]=0xf7;
- pmbuf[count]=8;
- count++;
- }
- break;
- case 10:
- if(count<4)
- { inbuf[count]=0xf7;
- pmbuf[count]=9;
- count++;
- }
- break;
- case 11: //设置键
- { if(count= =4)
- {count=0;
- pmset();
- }
- for(i=0;i<4;i++) //擦除缓冲区
- inbuf[i]=table1[i];
- break;
- }
- case 12: //确认键
- { enterflag=1;
- if(count= =4)
- pmflag=pmcmp();
- else pmflag=0;
- break;
- }
- default: break;
- }
- if(enterflag= =1)
- { enterflag=0;
- count=0;
- for(i=0;i<4;i++)
- pmbuf[i]=0xf7;
- if(pmflag= =1)
- {
- P1=0xf0;
- D3=0;
- while(1)
- { for(i=0;i<4;i++)
- {
- P2=table[i];
- P0=table2[i];
- for(j=500;j>0;j--);
- }
- if(D2= =0) //复位
- { D3=1;
- P1=0xff;
- for(i=0;i<4;i++)
- inbuf[i]=table1[i];
- break;
- }
- }
- }
- if(pmflag= =0)
- {
- num2++;
- P1=0x0f;
- for(i=0;i<4;i++)
- inbuf[i]=table1[i];
- if(num2= =3)
- {
- while(1)
- { P1=0;
- for(i=0;i<4;i++)
- {
- for(j=500;j>0;j--);
- P2=table[i];
- P0=table3[i];
- for(j=500;j>0;j--);
- for(j=50;j>0;j--)
- D1=~D1;
- }
- if(D2= =0) //复位
- {num2=0;
- P1=0xff;
- for(i=0;i<4;i++)
- inbuf[i]=table1[i];
- break;
- }
- }
- }
- }
- }
- }
- //}
复制代码 |