51单片机实现密码锁

2019-07-18 12:40发布

这基于51单片机实现密码锁的仿真,但是不知道为什么点击按键时屏幕总是闪烁,数码管也没反应。原先用74HC07驱动数码管也是如此。其他电路部分经过测试应该都是能正常工作的。请大神们帮忙看看。
51密码锁.zip 下载积分: 积分 -1 分
152.03 KB, 下载次数: 61, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
20条回答
武力戡乱
1楼-- · 2019-07-20 03:02
其实也没多少,在6*6改进一下就可以了,显示稳定,按键稳定。
你细品一下,你那个程序,真要明天有时间研究了。确实有点意思!
Key_Display.rar (61.61 KB, 下载次数: 7)
这个是8.0的,给你截个图吧。
1.png

2.png

武力戡乱
2楼-- · 2019-07-20 05:59
 精彩回答 2  元偷偷看……
武力戡乱
3楼-- · 2019-07-20 09:00
先生下山啦 发表于 2014-8-17 21:04
我想 我知道原因了,应该是消抖的问题,这是按照我规定的显示位置依次显示的,显示五个后PassPosi的值累 ...

你这个程序我没看懂,但是需要加个按键等待释放。
//作     者:武力戡乱
//项     目:按键驱动
//日     期:2014/7/18
//功     能:实现6*6按键功能,通过串口输出
//备     注:电子发烧友论坛-Proteus论坛,网友求助帮忙制作

#include "KEY.h"

//函数:Key_Hit()
//描述:按键判断
//参数:return  1:有按键  0:无按键
static unsigned char Key_Hit(void)
{
  if(KEY_Lie_Read == 0xFF)
    return(0);
  else
    return(1);
}
//函数:Key_Code()
//描述:计算键值
//参数:return   键值
static unsigned char Key_Code(void)
{
  unsigned char row;
  unsigned char lieread = 0;
  unsigned char rownum = 0xFE;
  unsigned char key = 0xFF;

  for(row=0; row<6; row++)
  {                       
    KEY_Row_Write = rownum;
    lieread = KEY_Lie_Read;
    if (lieread != 0xFF)
    {
      switch(lieread)
      {
        case 0xFE:
          key=0 + 6*row;
          break;
        case 0xFD:
          key=1 + 6*row;
          break;
        case 0xFB:
          key=2 + 6*row;
          break;
        case 0xF7:
          key=3 + 6*row;
          break;
        case 0xEF:
          key=4 + 6*row;
          break;         
        case 0xDF:
          key=5 + 6*row;
          break;
      }
    }
    rownum <<= 1;
    rownum ++;
  }
  KEY_Row_Write = 0;
  return(key);
}
//函数:Key_Scan()
//描述:键盘扫描
//参数:return   0xff:无键值  0-15:键值     
unsigned char Key_Scan(void)
{
  unsigned char key_code_temp;
  if(Key_Hit()==1)
  {
    Delay_Int(10,10);
    if(Key_Hit()==1)
    {       
      key_code_temp=Key_Code();
      while(Key_Hit()==1);
      return(key_code_temp);
    }
    else
      return(0xff);
  }
  else
    return(0xff);
}
//函数:Key_Init()
//描述:键盘初始化
//参数:无
void Key_Init(void)
{
  KEY_SetRow_Write;
  KEY_SetLie_Read;
  KEY_Row_Write = 0;
}

这个是我帮网友做的,论坛里面有430的6*6矩阵键盘。
我一会在帮你看看。你先看看这个。然后在找一下,论坛里面的6*6矩阵键盘仿真。
先生下山啦
4楼-- · 2019-07-20 12:21
武力戡乱 发表于 2014-8-16 18:20
里面没有仿真文件吧,我用你原来的仿真并且改动了电路。
开始上电就有没有显示。按键仍然没有反应。于 ...

我想 我知道原因了,应该是消抖的问题,这是按照我规定的显示位置依次显示的,显示五个后PassPosi的值累加到4,也就是在最后一个数码管.又因为没有按enterkey键,PassPosi的值没有归零。所以再按其他键就没有上述情况了。看来消抖没有做好。
先生下山啦
5楼-- · 2019-07-20 17:57
武力戡乱 发表于 2014-8-16 18:20
里面没有仿真文件吧,我用你原来的仿真并且改动了电路。
开始上电就有没有显示。按键仍然没有反应。于 ...

我用联调调试对电路和程序又做了修改,现在好很多了。但为什么每次仿真时,第一次按按键会在多个数码管上依次显示,(理论上应该只在最后一个数码管显示)再按按键就正常了。如果是因为按键抖动的话没理由只有第一次是这样啊。而且我觉得这也是影响密码输入准确与否的一个原因。我再想办法调试看看,找找原因和办法。

51密码锁.zip 下载积分: 积分 -1 分

261.3 KB, 下载次数: 7, 下载积分: 积分 -1 分

武力戡乱
6楼-- · 2019-07-20 19:54
先生下山啦 发表于 2014-8-16 00:19
我又弄了好长时间代码,改来改去还是基本上是没有改动,因为我觉得代码应该是可以实现功能的。可能是我陷 ...

51密码锁改.rar (201.12 KB, 下载次数: 11) 1.png
2.png
里面没有仿真文件吧,我用你原来的仿真并且改动了电路。
开始上电就有没有显示。按键仍然没有反应。于是我就帮你写个显示程序,是滚屏显示2014-8。做的很粗糙,没细腻的去想,只是想告诉你怎么做显示吧。你可以改也可以自己在从新写,只要你懂原理了。注意,你原来的电路错了

一周热门 更多>