51单片机实现密码锁

2019-07-18 12:40发布

这基于51单片机实现密码锁的仿真,但是不知道为什么点击按键时屏幕总是闪烁,数码管也没反应。原先用74HC07驱动数码管也是如此。其他电路部分经过测试应该都是能正常工作的。请大神们帮忙看看。
51密码锁.zip 下载积分: 积分 -1 分
152.03 KB, 下载次数: 61, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
20条回答
先生下山啦
1楼-- · 2019-07-19 13:26
武力戡乱 发表于 2014-8-18 13:16
switch(Key)
                        {
                                case 0:

如果你说的一直按着喇叭一直响是指刚按下响一声,然后松开又响一声,如果指的是这个的话,我觉得这是因为电平变化引起的,刚按下电平由高到低喇叭响一下,松开的时候又由低到高喇叭响一声。不一定是因为程序运行的问题。
武力戡乱
2楼-- · 2019-07-19 16:07
先生下山啦 发表于 2014-8-18 15:24
其他的我稍后再看,我先纠正一点:准确的说每次是执行到break为止。多个case可共用一组执行语句。所以0-9 ...

这个程序确实是实现了多个公用一组
但是你看看这个http://see.xidian.edu.cn/cpp/html/39.html
switch语句的意思是什么。
看来这个确实一问题。今天晚上我一定花点时间看看。然后咱两在探讨。毕竟每个都设计思路不同吗。


先生下山啦
3楼-- · 2019-07-19 16:11
 精彩回答 2  元偷偷看……
武力戡乱
4楼-- · 2019-07-19 18:08
先生下山啦 发表于 2014-8-18 11:25
我不明白为什么要加while(1);为什么不是一次性识别按键呢?难道不应该是按一次0-9的任意一个按键,然后执 ...

                        switch(Key)
                        {
                                case 0:
                                case 1:
                                case 2:
                                case 3:
                                case 4:
                                case 5:
                                case 6:
                                case 7:
                                case 8:
                                case 9:
                                //        DispBuf[PassPosi] =  LINECHAR;//显示’-‘
                                        Disp_Led_Sin(Key,PassPosi);
这个switch是什么意思,选择吧!
当按键为9的时候,执行case 9:一直到到下一个case之前,是不?
那么假设你按键1的时候,是不不应该显示呢?
其实你没懂我的按键等待释放。你已经上传了程序
unsigned char Key_Scan(void)
{
        unsigned char key_code_temp;
        if(Key_Hit()==1)
        {
                Delay_Init(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);
}
其中while(Key_Hit()==1);就是判断按键是否释放。
如果按键没有释放,他就不会执行下一次扫描,这个是一个层。我把每个任务分成了层。
而你的程序有个明显的现象,就是按键一直按着的时候一直在响,这说明程序在整个系统中运行。我到没细看,为什么现象对。
先不说这个,我们打个赌,在不大改动思路的情况下,你看看你后续的功能能否实现,或者轻松就实现(我指的是多个数码管显示不同的值)。首先你要面对是数码管扫描(记得做在定时器中)和键盘扫描的问题。

先生下山啦
5楼-- · 2019-07-19 21:51
武力戡乱 发表于 2014-8-17 21:50
呵呵,你真牛。咋说呢

                        switch(Key)

我不明白为什么要加while(1);为什么不是一次性识别按键呢?难道不应该是按一次0-9的任意一个按键,然后执行完下面的程序由break退出吗?
  1. //        DispBuf[PassPosi] =  LINECHAR;//显示’-‘
  2.                                         Disp_Led_Sin(Key,PassPosi);
  3.                                 //        z++;
  4.                                 //        if(z>5){z=0;}
  5.                                         PassInBuf[PassPosi] = Key;//保存用户输入的密码
  6.                                         if (PassPosi<5)
  7.                                                 PassPosi++;//调整密码输入位置
  8.                                         Sys_Speaker(SHORT_TIME);//发按键提示音
  9.                                         break;
复制代码


武力戡乱
6楼-- · 2019-07-19 22:44
注意查收啊!

一周热门 更多>