第四章 实验及实践课题(33) 4×4 键盘及 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 用导线连接到“音频放大模块”区域中的 SPK IN 端
子上。
(6). 把“音频放大模块”区域中的 SPK OUT 接到喇叭上。
4.
程序设计内容
(1). 4×4 行列式键盘识别技术:有关这方面内容前面已经讨论过,这里不再重复。
(2). 8 位数码显示,初始化时,显示“P ”,接着输入最大 6 位数的密码,当密码输
入完后,按下确认键,进行密码比较,然后给出相应的信息。在输入密码过程中,显示
器只显示“8.”。当数字输入超过 6 个时,给出报警信息。在密码输入过程中,若输入
错误,可以利用“DEL”键删除刚才输入的错误的数字。
(3). 4×4 行列式键盘的按键功能分布图如图 4.33.2 所示:
图 4.33.2
5.
C 语言源程序
#include <AT89X52.H>
unsigned char ps[]={1,2,3,4,5}; //设定的密码
unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,
0x00,0x40,0x73,0xff};
unsigned char dispbuf[8]={18,16,16,16,16,16,16,16};
unsigned char dispcount;
unsigned char flashcount;
unsigned char temp;
unsigned char key;
unsigned char keycount;
unsigned char pslen=5;
unsigned char getps[6];
bit keyoverflag;
bit errorflag;
bit rightflag;
unsigned int second3;
unsigned int aa,bb;
unsigned int cc;
bit okflag;
bit alarmflag;
bit hibitflag;
unsigned char oka,okb;
void main(void)
{
unsigned char i,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)
{
case 0x0e:
key=7;
break;
case 0x0d:
key=8;
break;
case 0x0b:
key=9;
break;
case 0x07:
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;
}
else if(keycount>6)
{
keycount=6;
keyoverflag=1; //key overflow 输入密码长度超过
}
}
else if(key==12) //delete key
{
if(keycount>0)
{
keycount--;
getps[keycount]=0; //最近 1 次数入的数值清 0
dispbuf[keycount+2]=16;
}
else
{
keyoverflag=1; //未输入密码,按到功能键,报错!嘀一声。
}
}
else if(key==15) //enter key
{
if(keycount!=pslen)
{
errorflag=1;
rightflag=0;
second3=0;
}
else
{
for(i=0;i<keycount;i++)
{
if(getps[i]!=ps[i])
{
i=keycount;
errorflag=1;
rightflag=0;
second3=0;
goto a;
}
}
errorflag=0;
rightflag=1;
a: i=keycount;
评论0