找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1096|回复: 0
收起左侧

做单片机密码锁遇到一点问题,请教论坛各位朋友

[复制链接]
ID:645543 发表于 2020-2-14 17:41 | 显示全部楼层 |阅读模式
手里现在只有一个单片机的试验仪,所以按上面的接线写程序。但是按了6遍0再按D确认,led灯也没反应。查不出来是那里出问题了。
矩阵是按行从左到右3210列从上到下7654的顺序,扫描程序我另外试了,对应关系都对,就是没有消抖处理。感觉是主程序输入密码那里有点问题。
#include"reg51.h"
typedef unsigned char u8;
typedef unsigned int u16;

sbit led=P2^0;
sbit led2=P2^1;
bit pass=0;

u8  Input[6];
u8  Correct[6]={0,0,0,0,0,0};


/*************5ms延时********************/
void Delay5Ms(void)
{
        unsigned int TempCyc = 5552;
        while(TempCyc--);
}


/************将按键值编码为数值**************/
unsigned char coding(unsigned char m)         
{
        unsigned char k;
        switch(m)
        {
                case (0x77): k=1;break;
                case (0x7b): k=2;break;
                case (0x7d): k=3;break;
                case (0x7e): k='A';break;
                case (0xb7): k=4;break;
                case (0xbb): k=5;break;
                case (0xbd): k=6;break;
                case (0xbe): k='B';break;
                case (0xd7): k=7;break;
                case (0xdb): k=8;break;
                case (0xdd): k=9;break;
                case (0xde): k='C';break;
                case (0xe7): k='*';break;
                case (0xeb): k=0;break;
                case (0xed): k='#';break;
                case (0xee): k='D';break;
        }
        return(k);
}
//=====================按键检测并返回按键值===============================
unsigned char keynum(void)
{
  u8 temp;
  u8 com1,com2;
  P1=0xf0;
if(P1!=0xf0)
{          Delay5Ms();
      Delay5Ms();
    if(P1!=0xf0)
        {
      {
            com1=P1;
        P1=0x0f;
             com2=P1;
      }
        P1=0xf0;
        while(P1!=0xf0);
        temp=com1|com2;
        return(temp);
        }
        else return 0;
}
else return 0;
}



/******************密码判断程序*********************/
void judge()                          
{        if((Input[0]==Correct[0])&&(Input[1]==Correct[1])&&(Input[2]==Correct[2])&&(Input[3]==Correct[3])&&(Input[4]==Correct[4])&&(Input[5]==Correct[5]))
       {
              pass=1;
                  led=0;                //开锁指示灯亮
                     
           }
    else pass=0;
}

void main()
{         u8  key,num;
         u8  N=0;
     while(1)

         {   led2=0;
             key=keynum();
             num=coding(key);
                 switch(num)
                 { case('A'):     ;break;
                   case('B'):     ;break;
                   case('C'):     ;break;
                   case('D'):judge();break;
                   case('*'):     ;break;
                   case('#'):     ;break;
                   default:
                   {  if(N<6)
                      {Input[N]=num;N++;}
                          else
                          {N=6;break;}

                   }

                 }

         }
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表