单片机
返回首页

33. 4×4键盘及8位数码管显示构成的电子密码锁

2016-09-21 来源:eefocus

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

8

9


4

5

6


1

2

3

Del
0

 
 
Enter
  
  
  
  
  
  
  
  
图4.33.2
  
5.      C语言源程序 
#include  
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                               { 
                                if(getps!=ps
                                  { 
                                    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                               { 
                                if(getps!=ps
                                  { 
                                    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                               { 
                                if(getps!=ps
                                  { 
                                    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                               { 
                                if(getps!=ps
                                  { 
                                    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; 
    } 
}
进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

最新器件
精选电路图
  • 如何利用ESP8266制作一个简单的四轴飞行器

  • 非常简单的150W功放电路图

  • 一个简单的警笛电路图

  • 基于IC555的可变PWM振荡器电路

  • 一个简单的立体声平衡指示器电路

  • 电谐波图形均衡器示意图

    相关电子头条文章