公告:

3*4矩阵键盘简单lcd1602密码锁控制

作者:智凡单片机 / 时间:1个月前 (06/17) / 分类:51单片机 / 阅读:7647 / 评论:0

不好意思啊兄弟只能先把你写到这里了  跟真实的密码锁功能上相差甚远

不过应该满足了你的要求

还有之前你要求的3*3键盘只有9个数字  但是0~9是十个数字所以键盘我改成了4*3的

 

 

上电后显示000

3*4矩阵键盘简单lcd1602密码锁控制 51单片机 第1张
确认按下小灯亮
3*4矩阵键盘简单lcd1602密码锁控制 51单片机 第2张

 

//2013/6/16  待完善
//3*4矩阵键盘简单密码锁控制 

//使用上电默认显示000
// uchar D[ ]={1,1,1};      //设定密码
//74HC573做驱动

#include <reg51.h>
#define   uchar  unsigned  char
#define   uint  unsigned  int
#define  date  P1
sbit  wei=P3^0;
sbit  duan=P3^1;
sbit  h1=P1^0;  
sbit  h2=P1^1;
sbit  h3=P1^2;
sbit  h4=P1^3;    //行信号
uchar  keynum;
uchar num;
uchar D[ ]={1,1,1};      //设定密码
uchar  code  table[]={0xc0,0xf9,0xa4,
       0x0b0,0x99,0x92,
       0x82,0xf8,0x80,0x90, //0~9段码
       0XFF,0XFF}; //确认键/取消键 关闭显示
void  delay()
{
   uchar  i,j;
   for(j=10;j>0;j--)
     for(i=33;i>0;i--);
}
void  delayms(uint x)
{
   uchar  i;
     for(i=x;i>0;i--)
  delay();
}

void  initshuma()
{
     wei=1;
  P0=0x07;
  wei=0;
     duan=1;
     P0=table[0];
  duan=0;
}

 

void  keyscan_time0() interrupt 1       //几十个ms扫描一次键盘
{
  
  TR0=0;
  date=0X0F;
  if((date&0x0F)!=0x0F)
  delayms(10);
  if((date&0x0F)!=0x0F)
  {
  
    date=0x3f; //1
    if(h1==0)
    {
    while(h1==0);
     keynum=0;
     num++;
    }
 
    if(h2==0)
    {
    while(h2==0);
    keynum=3;
    num++;
    }
    if(h3==0)
    {
    while(h3==0);
    keynum=6;
    num++;
    }
    if(h4==0)
    {
    while(h4==0);
    keynum=9;
    num++;
    }
 
    date=0x5f; //2
    if(h1==0)
    {
    while(h1==0);
    keynum=1;
    num++;
    }
    if(h2==0)
    {
    while(h2==0);
    keynum=4;
    num++;
    }
    if(h3==0)
    {
    while(h3==0);
    keynum=7;
    num++;
    }
    if(h4==0)
    {
    while(h4==0);
    keynum=10;
    num++;
    }
 
    date=0x6F; //3
    if(h1==0)
    {
     while(h1==0);
    
      keynum=2;
      num++;
    
    }
    if(h2==0)
     {
     while(h2==0);
     keynum=5;
     num++;
     }
    if(h3==0)
    {
    while(h3==0);
    keynum=8;
    num++;
    }

    if(h4==0)
    {
    while(h4==0);
    keynum=11;
    num++;
    }
    if(num>5)
    num=1;
 
     switch(num)
  {
   case 1: wei=1;
     P0=0x01;
     wei=0;
     break;
     
   case 2: wei=1;
     P0=0x02;
     wei=0;
     break;
  
   case 3: wei=1;
     P0=0x04;
     wei=0;
     break;
   default: break; 
   }
   duan=1;
   P0=table[keynum];
   duan=0;
 

 }
 TR0=1;
 TH0=(65536-100)/256;
 TL0=(65536-100)%6;


}
void  main()
{
  
     EA=1;                
  ET0=1;                       
  TMOD=0x01;           
  TH0=(65536-100)/256; 
  TL0=(65536-100)%6; 
  TR0=1;
  keynum=0xff;              //初始化键值
  initshuma();
  while(1)
                
   
 
    while(!((num==1)&(keynum==D[0])));     
     while(!((num==2)&(keynum==D[1])));       
         while(!((num==3)&(keynum==D[2])));  //与设定密码比较是否相同      
             while(!(keynum==10));    //确认键
       P2=0XFE;
       while(!(keynum==11));    //取消键
       P2=0XFF;
        
   }    
}

没有评论,留下你的印记,证明你来过。


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。