44键盘及8位数码管显示构成的电子密码锁.docx
- 文档编号:30310547
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:23
- 大小:24.84KB
44键盘及8位数码管显示构成的电子密码锁.docx
《44键盘及8位数码管显示构成的电子密码锁.docx》由会员分享,可在线阅读,更多相关《44键盘及8位数码管显示构成的电子密码锁.docx(23页珍藏版)》请在冰豆网上搜索。
44键盘及8位数码管显示构成的电子密码锁
1.
用4×4组成0-9数字键及确认键。
用8位数码管组成显示电路提示信息,当输入密码时,只显示“8.”,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则门开,此处用LED发光二极管亮一秒钟做为提示,同时发出“叮咚”声;若密码不正确,禁止按键输入3秒,同时发出“嘀、嘀”报警声;若在3秒之内仍有按键按下,则禁止按键输入3秒被重新禁止。
(此句在下面程序中需要再按下ENTER键方有效)
2. 电路原理图
图4.33.1
3. 系统板上硬件连线
(1). 把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到“动态数码显示”区域中的ABCDEFGH端子上。
(2). 把“单片机系统“区域中的P2.0-P2.7用8芯排线连接到“动态数码显示”区域中的S1S2S3S4S5S6S7S8端子上。
(3). 把“单片机系统”区域中的P3.0-P3.7用8芯排线连接到“4×4行列式键盘”区域中的R1R2R3R4C1C2C3C4端子上。
(4). 把“单片机系统”区域中的P1.0用导线连接到“八路发光二极管模块”区域中的L2端子上。
(5). 把“单片机系统”区域中的P1.7用导线连接到“音频放大模块”区域中的SPKIN端子上。
(6). 把“音频放大模块”区域中的SPKOUT接到喇叭上。
4. 程序设计内容
(1). 4×4行列式键盘识别技术:
有关这方面内容前面已经讨论过,这里不再重复。
(2). 8位数码显示,初始化时,显示“P ”,接着输入最大6位数的密码,当密码输入完后,按下确认键,进行密码比较,然后给出相应的信息。
在输入密码过程中,显示器只显示“8.”。
当数字输入超过6个时,给出报警信息。
在密码输入过程中,若输入错误,可以利用“DEL”键删除刚才输入的错误的数字。
(3). 4×4行列式键盘的按键功能分布图如图4.33.2所示:
图4.33.2
5. C语言源程序
#include
unsignedcharps[]={1,2,3,4,5};//设定的密码
unsignedcharcodedispbit[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,
0x00,0x40,0x73,0xff};
unsignedchardispbuf[8]={18,16,16,16,16,16,16,16};
unsignedchardispcount;
unsignedcharflashcount;
unsignedchartemp;
unsignedcharkey;
unsignedcharkeycount;
unsignedcharpslen=5;
unsignedchargetps[6];
bitkeyoverflag;
biterrorflag;
bitrightflag;
unsignedintsecond3;
unsignedintaa,bb;
unsignedintcc;
bitokflag;
bitalarmflag;
bithibitflag;
unsignedcharoka,okb;
voidmain(void)
{
unsignedchari,j;
TMOD=0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
TR0=1;
ET0=1;
EA=1;
while
(1)
{
P3=0xff;
P3_4=0;
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{
for(i=10;i>0;i--)
for(j=248;j>0;j--);
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
case0x0e:
key=7;
break;
case0x0d:
key=8;
break;
case0x0b:
key=9;
break;
case0x07:
key=10;
break;
}
temp=P3;
P1_1=~P1_1;//后面也有,貌似无用
if((key>=0)&&(key<10))
{
if(keycount<6)
{
getps[keycount]=key;
dispbuf[keycount+2]=19;//前两位已经用于显示“P”
}
keycount++;
if(keycount==6)
{
keycount=6;
}
elseif(keycount>6)
{
keycount=6;
keyoverflag=1;//keyoverflow输入密码长度超过
}
}
elseif(key==12)//deletekey
{
if(keycount>0)
{
keycount--;
getps[keycount]=0;//最近1次数入的数值清0
dispbuf[keycount+2]=16;
}
else
{
keyoverflag=1;//未输入密码,按到功能键,报错!
嘀一声。
}
}
elseif(key==15)//enterkey
{
if(keycount!
=pslen)
{
errorflag=1;
rightflag=0;
second3=0;
}
else
{
for(i=0;i { if(getps[i]! =ps[i]) { i=keycount; errorflag=1; rightflag=0; second3=0; gotoa; } } errorflag=0; rightflag=1; a: i=keycount; } } temp=temp&0x0f; while(temp! =0x0f) { temp=P3; temp=temp&0x0f; } keyoverflag=0; } } P3=0xff; P3_5=0; temp=P3; temp=temp&0x0f; if(temp! =0x0f) { for(i=10;i>0;i--) for(j=248;j>0;j--); temp=P3; temp=temp&0x0f; if(temp! =0x0f) { temp=P3; temp=temp&0x0f; switch(temp) { case0x0e: key=4; break; case0x0d: key=5; break; case0x0b: key=6; break; case0x07: key=11; break; } temp=P3; P1_1=~P1_1; if((key>=0)&&(key<10)) { if(keycount<6) { getps[keycount]=key; dispbuf[keycount+2]=19; } keycount++; if(keycount==6) { keycount=6; } elseif(keycount>6) { keycount=6; keyoverflag=1;//keyoverflow } } elseif(key==12)//deletekey { if(keycount>0) { keycount--; getps[keycount]=0; dispbuf[keycount+2]=16; } else { keyoverflag=1; } } elseif(key==15)//enterkey { if(keycount! =pslen) { errorflag=1; rightflag=0; second3=0; } else { for(i=0;i { if(getps[i]! =ps[i]) { i=keycount; errorflag=1; rightflag=0; second3=0; gotoa4; } } errorflag=0; rightflag=1; a4: i=keycount; } } temp=temp&0x0f; while(temp! =0x0f) { temp=P3; temp=temp&0x0f; } keyoverflag=0; } } P3=0xff; P3_6=0; temp=P3; temp=temp&0x0f; if(temp! =0x0f) { for(i=10;i>0;i--) for(j=248;j>0;j--); temp=P3; temp=temp&0x0f; if(temp! =0x0f) { temp=P3; temp=temp&0x0f; switch(temp) { case0x0e: key=1; break; case0x0d: key=2; break; case0x0b: key=3; break; case0x07: key=12; break; } temp=P3; P1_1=~P1_1; if((key>=0)&&(key<10)) { if(keycount<6) { getps[keycount]=key; dispbuf[keycount+2]=19; } keycount++; if(keycount==6) { keycount=6; } elseif(keycount>6) { keycount=6; keyoverflag=1;//keyoverflow } } elseif(key==12)//deletekey { if(keycount>0) { keycount--; getps[keycount]=0; dispbuf[keycount+2]=16; } else { keyoverflag=1; } } elseif(key==15)//enterkey { if(keycount! =pslen) { errorflag=1; rightflag=0; second3=0; } else { for(i=0;i { if(getps[i]! =ps[i]) { i=keycount; errorflag=1; rightflag=0; second3=0; gotoa3; } } errorflag=0; rightflag=1; a3: i=keycount; } } temp=temp&0x0f; while(temp! =0x0f) { temp=P3; temp=temp&0x0f; } keyoverflag=0; } } P3=0xff; P3_7=0; temp=P3; temp=temp&0x0f; if(temp! =0x0f) { for(i=10;i>0;i--) for(j=248;j>0;j--); temp=P3; temp=temp&0x0f; if(temp! =0x0f) { temp=P3; temp=temp&0x0f; switch(temp) { case0x0e: key=0; break; case0x0d: key=13; break; case0x0b: key=14; break; case0x07: key=15; break; } temp=P3; P1_1=~P1_1; if((key>=0)&&(key<10)) { if(keycount<6) { getps[keycount]=key; dispbuf[keycount+2]=19; } keycount++; if(keycount==6) { keycount=6; } elseif(keycount>6) { keycount=6; keyoverflag=1;//keyoverflow } } elseif(key==12)//deletekey { if(keycount>0) { keycount--; getps[keycount]=0; dispbuf[keycount+2]=16; } else { keyoverflag=1; } } elseif(key==15)//enterkey { if(keycount! =pslen) { errorflag=1; rightflag=0; second3=0; } else { for(i=0;i { if(getps[i]! =ps[i]) { i=keycount; errorflag=1; rightflag=0; second3=0; gotoa2; } } errorflag=0; rightflag=1; a2: i=keycount; } } temp=temp&0x0f; while(temp! =0x0f) { temp=P3; temp=temp&0x0f; } keyoverflag=0; } } } } voidt0(void)interrupt1using0 { TH0=(65536-500)/256; TL0=(65536-500)%256; flashcount++; if(flashcount==8) { flashcount=0; P0=dispcode[dispbuf[dispcount]]; P2=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 { P1_7=~P1_7; } aa++; if(aa==800)//lightalarmsignal { aa=0; P1_0=~P1_0;//LED发光二极管闪 } second3++; if(second3==6400)//闪4次后(8次变换),自动复位到按ENTER前的状态 { second3=0; errorflag=0; rightflag=0; alarmflag=0; bb=0; aa=0; } } elseif((errorflag==0)&&(rightflag==1))//发出“叮咚”声 { P1_0=0;//LED发光二极管亮 cc++; if(cc<1000) { okflag=1; } elseif(cc<2000) { okflag=0; } else//自动复位到按ENTER前的状态 { errorflag=0; rightflag=0; P1_7=1; cc=0; oka=0; okb=0; okflag=0; P1_0=1;//LED发光二极管灭 } if(okflag==1) { oka++; if(oka==2) { oka=0; P1_7=~P1_7; } } else { okb++; if(okb==3) { okb=0; P1_7=~P1_7; } } } if(keyoverflag==1)//嘀一声。 { P1_7=~P1_7; } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 44 键盘 数码管 显示 构成 电子 密码锁