1、uchar temp;uchar key;uchar keycount;uchar pslen=5;uchar getps6;bit keyoverflag;bit errorflag;bit rightflag;uint second3;uint aa,bb;uint cc;bit okflag;bit alarmflag;uchar oka,okb;sbit led=P36;sbit keyhong=P32;sbit keykong=P37;sbit VT=P33;void delay(uint z)/1ms uint x,y; for(x=z;x0;x-) for(y=110;yy-);
2、void keyscan() uchar i; P1=0xff; P1_4=0; temp=P1; temp=temp & 0x0f; if (temp!=0x0f) delay(5); switch(temp) case 0x0e: key=7; break; case 0x0d: key=8; case 0x0b: key=9; case 0x07: /第一列7,8,9,10 key=10; / P1_1=P1_1; if(key=0) & (key10) /如果键值为一位数字则使该位dispbufkeycount+2=19,能否显示还要做一些处理 if(keycount keyoverf
3、lag=1; /key overflow /当 keycount6 ,即超过密码长度时,令keycount=6并且 keyoverflag=1,报警标志位 else if(key=12)/delete key /若键值为12,则此键是删除键 if(keycount0) keycount-; /密码长度减一 getpskeycount=0; dispbufkeycount+2=16; /-相当于关断显示16 else /keycnt=0时即当前没有一位密码数据显示时却按下了delete key则发出警报 else if(key=15)/enter key / 除了键值小于10,键值=12的情况外
4、的另外一种情况,即enter key if(keycount!=pslen) /当密码长度与设定的值不同时,密码错误标志位置1,密码正确标志位置0,并且 second3=0,响警报 errorflag=1; rightflag=0; second3=0; for(i=0;ikeycount;i+) /若得到的密码与设定的不一致时,密码错误标志位置1,密码正确标志位置0,并且 second3=0,响警报 if(getpsi!=psi) i=keycount; goto a; errorflag=0; /否则密码正确,密码错误标志位置0,密码正确标志位置1,将 keycount给i,例如keyco
5、unt=5 rightflag=1; /判断按键是否松开了 while(temp! temp=P1; keyoverflag=0;/? /若按键松开了,则报警标志位置0,即停止报警 P1_5=0; temp=temp & key=4; key=5; key=6; /第二列对应4,5,6,11 key=11;10) /key overflow else if(key=12)/delete key keycount-; dispbufkeycount+2=16; else if(key=15)/enter key =pslen) i+) goto a4;a4: P1_6=0; key=1; key
6、=2; key=3; /第三列对应1,2,3,12 key=12; else if(key=12)/delete key else if(key=15)/enter key goto a3;a3: P1_7=0; key=0; key=13; key=14; /第四列对应0,13,14,15 key=15; goto a2;a2:void kaimen() led=0; P3_0=0; P3_1=1; delay(1000); P3_0=1;void guanmen() led=1; P3_1=0;void main() /VT=0;/ flag=0; cnt=0; cnt1=0; /keyh
7、ong=0; TMOD=0x010; TH1=(65536-500)/256; TL1=(65536-500)%256; ET1=1; EX0=1; IT0=1; EA=1; TR1=1; P0=0xff;/P3_0=0; /P3_1=0; while(1) if(VT=0) /解码器PT2272解码输出 if(VT=0) /马达正转车库门开,灯亮 只要解码成功就执行如下动作 kaimen(); if(keykong=0) cnt1+; switch(cnt1) case 1:/flag=1; EX0=0; break; case 2:/flag=0; cnt=0; guanmen(); wh
8、ile(!keykong); keyscan(); if(flag1=1) flag1=0; /* if(flag=1) /P2=0xff;/*void hongwai() /红外对管作用,车进门时不起作用,人出车库门时才起作用,车库内灯熄灭,马达反转门关 if(keyhong=0) cnt+; switch(cnt)led=1; delay(1000); P3_0=1; cnt=0; break; /while(keyhong); /delay(5); */void int0() interrupt 0 delay(1100);void t1() interrupt 3 flashcount
9、+; if(flashcount=8) /每4ms就进行段码和位码的扫瞄显示输出 flashcount=0; P2=dispcodedispbufdispcount; /dispcount从0开始,dispbuf0是,dispbuf 1熄,从dispbuf2开始为按键的值,只不过用8显示 / dispbufdispcount要么为16要么为19,当显示该位密码时为19,当删除该位密码数据时为16 P0=dispbitdispcount; dispcount+; if(dispcount=8) dispcount=0; if(errorflag=1) & (rightflag=0) /两种报警声
10、 bb+; if(bb=800) bb=0; alarmflag=alarmflag; if(alarmflag=1)/sound alarm signal P3_4=P3_4; second3+; if(second3=6400) alarmflag=0; else if(errorflag=0) & (rightflag=1) cc+; if(cc1000) okflag=1; else if(cc2000) okflag=0; P3_4=1; cc=0; oka=0; okb=0; if(okflag=1) oka+; if(oka=2) okb+; if(okb=3) if(keyoverflag=1)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1