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

2008-5-3 10:01 3132 8 8 分类: MCU/ 嵌入式

1.      实验任务<?XML:NAMESPACE PREFIX = O />


4×4组成09数字键及确认键。


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


2.      电路原理图


<?XML:NAMESPACE PREFIX = V />点击看大图


4.33.1


3.      系统板上硬件连线


(1).            把“单片机系统”区域中的P0.0P0.78芯排线连接到“动态数码显示”区域中的ABCDEFGH端子上。


(2).            把“单片机系统“区域中的P2.0P2.78芯排线连接到“动态数码显示”区域中的S1S2S3S4S5S6S7S8端子上。


(3).            把“单片机系统”区域中的P3.0P3.78芯排线连接到“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

<?XML:NAMESPACE PREFIX = W />cc433.12.gif

 


 


 


 


 


 


 


 


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!=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<keycount;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<keycount;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<keycount;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;


    }


}

文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /2 下一条