车库门设计系统C源程序清单Word文件下载.docx
《车库门设计系统C源程序清单Word文件下载.docx》由会员分享,可在线阅读,更多相关《车库门设计系统C源程序清单Word文件下载.docx(22页珍藏版)》请在冰豆网上搜索。
uchartemp;
ucharkey;
ucharkeycount;
ucharpslen=5;
uchargetps[6];
bitkeyoverflag;
biterrorflag;
bitrightflag;
uintsecond3;
uintaa,bb;
uintcc;
bitokflag;
bitalarmflag;
ucharoka,okb;
sbitled=P3^6;
sbitkeyhong=P3^2;
sbitkeykong=P3^7;
sbitVT=P3^3;
voiddelay(uintz)//1ms
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
voidkeyscan()
{
uchari;
P1=0xff;
P1_4=0;
temp=P1;
temp=temp&
0x0f;
if(temp!
=0x0f)
{
delay(5);
switch(temp)
case0x0e:
key=7;
break;
case0x0d:
key=8;
case0x0b:
key=9;
case0x07:
//第一列7,8,9,10
key=10;
}
//P1_1=~P1_1;
if((key>
=0)&
&
(key<
10))//如果键值为一位数字则使该位dispbuf[keycount+2]=19,能否显示还要做一些处理
if(keycount<
6)
getps[keycount]=key;
//keycount共为六,即密码为六位数,将第一个key给getps[0];
然后keycount++,用于后面密码的比较
dispbuf[keycount+2]=19;
//------------------从第二位开始显示,并且是
为了他显示8.做准备
keycount++;
if(keycount==6)
keycount=6;
//当keycount=6时不再允许输数
elseif(keycount>
keyoverflag=1;
//keyoverflow
//当keycount>
6,即超过密码长度时,令keycount=6并且keyoverflag=1,报警标志位
elseif(key==12)//deletekey//若键值为12,则此键是删除键
if(keycount>
0)
keycount--;
//密码长度减一
getps[keycount]=0;
dispbuf[keycount+2]=16;
//----------------相当于关断显示16
else
{//keycnt=0时即当前没有一位密码数据显示时却按下了deletekey则发出警报
elseif(key==15)//enterkey//除了键值小于10,键值=12的情况外的另外一种情况,即enterkey
if(keycount!
=pslen)//当密码长度与设定的值不同时,密码错误标志位置1,密码正确标志位置0,并且second3=0,响警报
errorflag=1;
rightflag=0;
second3=0;
for(i=0;
i<
keycount;
i++)//若得到的密码与设定的不一致时,密码错误标志位置1,密码正确标志位置0,并且second3=0,响警报
if(getps[i]!
=ps[i])
i=keycount;
gotoa;
errorflag=0;
//否则密码正确,密码错误标志位置0,密码正确标志位置1,将keycount给i,例如keycount=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))
//keyoverflow
elseif(key==12)
//deletekey
keycount--;
dispbuf[keycount+2]=16;
elseif(key==15)
//enterkey
=pslen)
i++)
gotoa4;
a4:
P1_6=0;
key=1;
key=2;
key=3;
//第三列对应1,2,3,12
key=12;
elseif(key==12)//deletekey
elseif(key==15)//enterkey
gotoa3;
a3:
P1_7=0;
key=0;
key=13;
key=14;
//第四列对应0,13,14,15
key=15;
gotoa2;
a2:
voidkaimen()
led=0;
P3_0=0;
P3_1=1;
delay(1000);
P3_0=1;
voidguanmen()
led=1;
P3_1=0;
voidmain()
//VT=0;
//flag=0;
cnt=0;
cnt1=0;
//keyhong=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)
case1:
//flag=1;
EX0=0;
break;
case2:
//flag=0;
cnt=0;
guanmen();
while(!
keykong);
keyscan();
if(flag1==1)
flag1=0;
/*if(flag==1)
//P2=0xff;
/*voidhongwai()
//红外对管作用,车进门时不起作用,人出车库门时才起作用,车库内灯熄灭,马达反转门关
if(keyhong==0)
cnt++;
switch(cnt)
led=1;
delay(1000);
P3_0=1;
cnt=0;
break;
//while(keyhong);
//delay(5);
}*/
voidint0()interrupt0
delay(1100);
voidt1()interrupt3
{
flashcount++;
if(flashcount==8)
//每4ms就进行段码和位码的扫瞄显示输出
flashcount=0;
P2=dispcode[dispbuf[dispcount]];
//dispcount从0开始,dispbuf[0]是"
dispbuf[1]熄,从dispbuf[2]开始为按键的值,只不过用8显示
//dispbuf[dispcount]要么为16要么为19,当显示该位密码时为19,当删除该位密码数据时为16
P0=dispbit[dispcount];
dispcount++;
if(dispcount==8)
dispcount=0;
if((errorflag==1)&
(rightflag==0))//两种报警声
bb++;
if(bb==800)
bb=0;
alarmflag=~alarmflag;
if(alarmflag==1)
//soundalarmsignal
P3_4=~P3_4;
second3++;
if(second3==6400)
alarmflag=0;
elseif((errorflag==0)&
(rightflag==1))
cc++;
if(cc<
1000)
okflag=1;
elseif(cc<
2000)
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)