【学习笔记】单片机的40个经典实验之28:4×4 键盘及 8 位数码管显示构成的电子密码锁

  1. 实验任务

  用 4×4 组成 0-9 数字键及确认键。用 8 位数码管组成显示电路提示信息,当输入密码时,只显示“8.”,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则门开,此处用 LED 发光二极管亮一秒钟做为提示,同时发出“叮咚”声;若密码不正确,禁止按键输入 3 秒,同时发出“嘀、嘀”报警声;若在 3 秒之内仍有按键按下,则禁止按键输入 3 秒被重新禁止。

  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 所示:

  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;

  }

  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;

  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;

  }

  }

  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)

  {

  case 0x0e:

  key=4;

  break;

  case 0x0d:

  key=5;

  break;

  case 0x0b:

  key=6;

  break;

  case 0x07:

  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;

  }

  else if(keycount>6)

  {

  keycount=6;

  keyoverflag=1;//key overflow

  }

  }

  else if(key==12)//delete key

  {

  if(keycount>0)

  {

  keycount--;

  getps[keycount]=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 a4;

  }

  }

  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)

  {

  case 0x0e:

  key=1;

  break;

  case 0x0d:

  key=2;

  break;

  case 0x0b:

  key=3;

  break;

  case 0x07:

  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;

  }

  else if(keycount>6)

  {

  keycount=6;

  keyoverflag=1;//key overflow

  }

  }

  else if(key==12)//delete key

  {

  if(keycount>0)

  {

  keycount--;

  getps[keycount]=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 a3;

  }

  }

  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)

  {

  case 0x0e:

  key=0;

  break;

  case 0x0d:

  key=13;

  break;

  case 0x0b:

  key=14;

  break;

  case 0x07:

  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;

  }

  else if(keycount>6)

  {

  keycount=6;

  keyoverflag=1;//key overflow

  }

  }

  else if(key==12)//delete key

  {

  if(keycount>0)

  {

  keycount--;

  getps[keycount]=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 a2;

  }

  }

  errorflag=0;

  rightflag=1;

  a2: i=keycount;

  }

  }

  temp=temp & 0x0f;

  while(temp!=0x0f)

  {

  temp=P3;

  temp=temp & 0x0f;

  }

  keyoverflag=0;//?????????

  }

  }

  }

  }

  void t0(void) interrupt 1 using 0

  {

  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)//sound alarm signal

  {

  P1_7=~P1_7;

  }

  aa++;

  if(aa==800)//light alarm signal

  {

  aa=0;

  P1_0=~P1_0;

  }

  second3++;

  if(second3==6400)

  {

  second3=0;

  errorflag=0;

  rightflag=0;

  alarmflag=0;

  bb=0;

  aa=0;

  }

  }

  else if((errorflag==0) && (rightflag==1))

  {

  P1_0=0;

  cc++;

  if(cc<1000)

  {

  okflag=1;

  }

  else if(cc<2000)

  {

  okflag=0;

  }

  else

  {

  errorflag=0;

  rightflag=0;

  P1_7=1;

  cc=0;

  oka=0;

  okb=0;

  okflag=0;

  P1_0=1;

  }

  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;

  }

  }

阅读本文用了:

秒,转发只需1秒

转载是一种智慧分享是一种美德❀ 

(0)

相关推荐