#include<reg52.h> #include<intrins.h> #define uintunsigned int #define ucharunsigned char ucharnum,count,wordbuf[4],pwbuf[4],pw[4],i,flag,tt,a,k; uchartemp,mima,j,key,key1,key2,key3,key4,key5,key6,key7,key8,key9,key10,key11,key12,key13,key14,key15,key16; uchar codetable[]={0x79,0x77,0x77,0x3f,0x77,0x3f,0x73,0x79,0x37,0x40,0x76}; uchar codetable1[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67}; bit pwflag; bit enterflag; bit removeflag; bit zhuhuflag; bit fangkeflag; sbit sda=P2^7; sbit scl=P2^6; void dylen(uintz); void init(); voidwrite_add(uchar address,uchar date); ucharread_add(uchar address); voidxianshierror(); voidxianshiopen(); voidxianshigang(); voidxianshimima(); voidxianshishuzi(); void jzkey(); void zhuhu(); void fangke(); void mmbj(); void hujiao(); main() { P1=0X00; P1=0x04; //初始密碼 pw[0]=1; pw[1]=2; pw[2]=3; pw[3]=4;
enterflag=0; removeflag=0; //定時中斷 tt=0; TMOD=0X01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; init();//24c02初始化 for(k=0;k<4;k++) //寫入AT24C02 { write_add(23+k,pw[k]); dylen(1000); pw[k]=read_add(23+k); }
while(1) { jzkey(); zhuhu(); fangke(); mmbj(); hujiao(); if(removeflag==1) { count=0; flag=3; P1=0X04; key14=0; xianshigang(); } } } void hujiao() //呼叫子程序 { if(key14==1) {
a=pwbuf[count]+pwbuf[count-1]+pwbuf[count-2]-1; switch(a) { case 2: P1=0x12; break; case 3: P1=0x22; break; case 4: P1=0x32; break; case 5: P1=0x42; break; case 6: P1=0x52; break; case 7: P1=0x62; break; case 8: P1=0x72; break; } } } void mmbj() //密碼比較子程序 { if(enterflag==1) { count=0; enterflag=0; for(i=0;i<4;i++) { if(pw==pwbuf) flag=1; else { flag=2; P1=0x01;//同speaker=1報警聲; i=4; } } } if(flag==1) { xianshiopen(); P1=0x08; } if(flag==2) { xianshierror(); } } void fangke() //訪客子程序 { if(key15==1) { fangkeflag=1; xianshigang(); } if(fangkeflag==1) { xianshishuzi(); zhuhuflag=0; } } void zhuhu() //住戶子程序 { if(key16==1) { zhuhuflag=1; xianshigang(); } if(zhuhuflag==1) { xianshimima(); fangkeflag=0; } } voidxianshierror() //顯示錯誤提示 { P2=0xfe,P0=table[9],dylen(5),P2=0xff; P2=0xfd,P0=table[0],dylen(5),P2=0xff; P2=0xfb,P0=table[1],dylen(5),P2=0xff; P2=0xf7,P0=table[2],dylen(5),P2=0xff; P2=0xef,P0=table[3],dylen(5),P2=0xff; P2=0xdf,P0=table[4],dylen(5),P2=0xff; } voidxianshiopen() { P2=0xfe,P0=table[9],dylen(5),P2=0xff; P2=0xfd,P0=table[9],dylen(5),P2=0xff; P2=0xfb,P0=table[5],dylen(5),P2=0xff; P2=0xf7,P0=table[6],dylen(5),P2=0xff; P2=0xef,P0=table[7],dylen(5),P2=0xff; P2=0xdf,P0=table[8],dylen(5),P2=0xff; } voidxianshigang() { P2=0xfe,P0=table[9],dylen(5),P2=0xff; P2=0xfd,P0=table[9],dylen(5),P2=0xff; P2=0xfb,P0=table[9],dylen(5),P2=0xff; P2=0xf7,P0=table[9],dylen(5),P2=0xff; P2=0xef,P0=table[9],dylen(5),P2=0xff; P2=0xdf,P0=table[9],dylen(5),P2=0xff; } voidxianshimima() //顯示密碼保護 { if(count==1) { P2=0xfe,P0=table[9],dylen(5),P2=0xff; P2=0xfd,P0=table[9],dylen(5),P2=0xff; P2=0xfb,P0=table[9],dylen(5),P2=0xff; P2=0xf7,P0=table[9],dylen(5),P2=0xff; P2=0xef,P0=table[9],dylen(5),P2=0xff; P2=0xdf,P0=table[10],dylen(5),P2=0xff; } if(count==2) { P2=0xfe,P0=table[9],dylen(5),P2=0xff; P2=0xfd,P0=table[9],dylen(5),P2=0xff; P2=0xfb,P0=table[9],dylen(5),P2=0xff; P2=0xf7,P0=table[9],dylen(5),P2=0xff; P2=0xdf,P0=table[10],dylen(5),P2=0xff; P2=0xef,P0=table[10],dylen(5),P2=0xff; } if(count==3) { P2=0xfe,P0=table[9],dylen(5),P2=0xff; P2=0xfd,P0=table[9],dylen(5),P2=0xff; P2=0xfb,P0=table[9],dylen(5),P2=0xff; P2=0xdf,P0=table[10],dylen(5),P2=0xff; P2=0xef,P0=table[10],dylen(5),P2=0xff; P2=0xf7,P0=table[10],dylen(5),P2=0xff; } if(count==4) { P2=0xfe,P0=table[9],dylen(5),P2=0xff; P2=0xfd,P0=table[9],dylen(5),P2=0xff; P2=0xdf,P0=table[10],dylen(5),P2=0xff; P2=0xef,P0=table[10],dylen(5),P2=0xff; P2=0xf7,P0=table[10],dylen(5),P2=0xff; P2=0xfb,P0=table[10],dylen(5),P2=0xff; } } voidxianshishuzi() //顯示數字門號 { if(count==1) { P2=0xfe,P0=table[9],dylen(5),P2=0xff; P2=0xfd,P0=table[9],dylen(5),P2=0xff; P2=0xfb,P0=table[9],dylen(5),P2=0xff; P2=0xf7,P0=table[9],dylen(5),P2=0xff; P2=0xef,P0=table[9],dylen(5),P2=0xff; P2=0xdf,P0=table1[pwbuf[count]],dylen(5),P2=0xff; } if(count==2) { P2=0xfe,P0=table[9],dylen(5),P2=0xff; P2=0xfd,P0=table[9],dylen(5),P2=0xff; P2=0xfb,P0=table[9],dylen(5),P2=0xff; P2=0xf7,P0=table[9],dylen(5),P2=0xff; P2=0xdf,P0=table1[pwbuf[count-1]],dylen(5),P2=0xff; P2=0xef,P0=table1[pwbuf[count]],dylen(5),P2=0xff; } if(count==3) { P2=0xfe,P0=table[9],dylen(5),P2=0xff; P2=0xfd,P0=table[9],dylen(5),P2=0xff; P2=0xfb,P0=table[9],dylen(5),P2=0xff; P2=0xdf,P0=table1[pwbuf[count-1]],dylen(5),P2=0xff; P2=0xef,P0=table1[pwbuf[count-2]],dylen(5),P2=0xff; P2=0xf7,P0=table1[pwbuf[count-3]],dylen(5),P2=0xff; } } void dylen(uintz) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void jzkey() //矩陣鍵盤 { P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { dylen(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case0xee: pwbuf[count]=0,count++,key16=2,key15=2,removeflag=0; break; case 0xde: pwbuf[count]=1,count++,key16=2,key15=2,removeflag=0; break; case 0xbe: pwbuf[count]=2,count++,key16=2,key15=2,removeflag=0; break; case 0x7e: pwbuf[count]=3,count++,key16=2,key15=2,removeflag=0; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { dylen(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case0xed: pwbuf[count]=4,count++,key16=2,key15=2,removeflag=0; break; case 0xdd: pwbuf[count]=5,count++,key16=2,key15=2,removeflag=0; break; case 0xbd: pwbuf[count]=6,count++,key16=2,key15=2,removeflag=0; break; case 0x7d: pwbuf[count]=7,count++,key16=2,key15=2,removeflag=0; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { dylen(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case0xeb: pwbuf[count]=8,count++,key16=2,key15=2,removeflag=0; break; case 0xdb: pwbuf[count]=9,count++,key16=2,key15=2,removeflag=0; break; case 0xbb: enterflag=1,key16=2,key15=2; break; case 0x7b: removeflag=1,key16=2,key15=2; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xf7; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { dylen(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case0xe7: key13=12,key16=2,key15=2; break; case 0xd7: key14=1,key16=2,key15=2; break; case 0xb7: key15=1,key16=2; break; case 0x77: key16=1,key15=2; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } } void zd()interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; tt++; } //-------------------------------------------//AT24C02 uchar a; void delay() { ;; } void start() //開始信號 { sda=1; delay(); scl=1; delay(); sda=0; delay(); } void stop() //停止 { sda=0; delay(); scl=1; delay(); sda=1; delay(); } voidrespons() //應答 { uchar i; scl=1; delay(); while((sda==1)&&(i<250))i++; scl=0; delay(); } void init() { sda=1; delay(); scl=1; delay(); } voidwrite_byte(uchar date) { uchar i,temp; temp=date; for(i=0;i<8;i++) { temp=temp<<1; scl=0; delay(); sda=CY; delay(); scl=1; delay(); // scl=0; // delay(); } scl=0; delay(); sda=1; delay(); } uchar read_byte() { uchar i,k; scl=0; delay(); sda=1; delay(); for(i=0;i<8;i++) { scl=1; delay(); k=(k<<1)|sda; scl=0; delay(); } return k; } void delay1(ucharx) { uchar a,b; for(a=x;a>0;a--) for(b=100;b>0;b--); } void write_add(ucharaddress,uchar date) { start(); write_byte(0xa0); respons(); write_byte(address); respons(); write_byte(date); respons(); stop(); } ucharread_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; } |