用单片机数码管和矩阵按键实现密码锁功能

发布者:MysticJourney最新更新时间:2020-02-21 来源: 51hei关键字:单片机  数码管  矩阵按键  密码锁 手机看文章 扫描二维码
随时随地手机看文章

用数码管和矩阵按键实现密码锁功能,我的理解是实现输入数据并判断数据是否和密码一致,并且更改密码。矩阵按键是4×4的,图在下面。先说功能,初始密码值4321。第一部分:当数码管未进行闪烁的时候,按下S11是进行数据和密码的比较,当正确时数码管显示1111,错误显示2222。按下S12进行数据移位(口误了,应该是数据选择而不是数据移位,但意思大家一定要理解,因为下面的我都口误了),这时数码管闪烁,你按下S1到S10可以进行设定,当按四次S12的时候或者按下S13可以不闪烁了,这时按下S11才能进行数据比较(意思是只有不闪烁才能进行数据比较)。这是数据和密码的比较。第二部分:当数码管不进行闪烁的时候才能进行密码的更改,按下S14显示密码值。按下S15时进行密码值的选择,也就是闪烁,按下S1到S10可以进行数码值的改变,按四次S15或者按一次S16可以将数码管闪烁消除,再按一次S14可以退出密码设置,问题在于你如果按了S11到S13会改变数据数值吗?同理在数据和密码比较的时候你要是按了S14到S16会对密码造成影响吗?这是标志位的设定问题大家思考一下。自己写一遍是最好的,会发现很多问题考虑。

我们还按照从小到大,从浅入深的方法解决这个问题。


步骤一、考虑一下你的数据如何从矩阵按键输送给数码管,这里面大家可以想一下如何解决这个问题,我用了函数封装以及调用。(这里有一个很有意思的东西,大家好好考虑一下,超有意思)


步骤二、考虑如何实现输入数据,数据的输入方式是从右向左依次输入,举个例子就是输入4321,显示就是4321,,这是规则。 


步骤三、实现数据输入后,再进行输入数据和密码的比较,当正确的时候显示1111,错误显示2222。


这是这个程序的骨架,以后的程序都是在上面的添加。

步骤四、当按下S12的时候(也就是输入数据11,我程序中用的都是数据),进行移位操作,数码管会进行闪烁。这是可以更改数据,当你按四次S12或者按下S13的时候数码管不会闪烁了,这时再按一下S11,就是数据和密码的比较,这也是规则。当你在数码管闪烁的时候按S11是不会进行比较的(规则)。这时程序已经开始丰满了。


步骤五、进行改变密码操作,这个操作和改变数据操作很相似,但由于太相似了,所以会有所冲突,这时就需要条件才能保证程序的正常运行。具体操作手法就是用数据和密码的移位的标志位来限制数据和密码的比较(按下S11)和更改密码的按键(S14),这样避免了在你按错键又看不到现象的情况下,程序自己在两者之间不断运行。

总结:没必要太过纠结于别人程序怎么写,先看现象理解那个程序的功能,想好思路,自己写一遍(由浅入深一步步来,不要一步成,写程序大忌)。出了问题自己找解决办法,没法解决参考别人的也可以。记住一定要保证基层骨架的完美,才可进行复杂功能的添加。大家只需要找到自己需要的一部分就行了。

程序我觉得最重要的部分:矩阵函数的封装,移位时数码管的闪烁,如何将大于9的数不显示在数码管上,进行密码改变时的标志位设定,数据和密码的比较与密码改变的互锁关系,定时器开关的设定(TR0=1或0)

电路原理图如下:

图片1.png 

单片机源程序如下:

#include "digdisplay.h"                        //矩阵按键输入10(键表面为S11,程序中默认都是数值)为密码确认,矩阵按键输入11为移位操作按钮,输入12为移位后闪烁的确认键,按下之后便会不闪烁;

#include "key.h"                                //矩阵按键输入13将进行密码的设定,输入14为密码的移位,输入15为结束闪烁

u8 digdate[4]={0,0,0,0};                //存放输入数值

u8 digcode[4]={1,2,3,4};                //存放密码值

u8 knum=0,flag0,flag1=1,knum1=0;         //knum代表数据的移动位置,flag0代表移位闪烁标志位,flag1代表更改密码操作的标志位,knum1是进行密码移位的操作数

u8 time;                        //定时器中断时间计时,

void keyprogress()                                //检测密码的输入并进行判断

{

   u8 keynum;

   keynum=KeyDown();                 //if的判断语句里应该不要加含有return的语句,我把KeyDown()放到if()里面程序错误了。

   if(keynum!=0xff)                         //检测按键是否按下,如果矩阵按键程序返回值不是0xff,说明是在输入密码值

{

   if(keynum==13&&knum==0&&knum1==0)        //13代表着是否密码需要更改,默认不需要更改,不在闪烁的时候进行更改,程序一步步走

   {

      flag1=!flag1;                         //改变输入数据和密码的标志位变化

   }

   if(flag1)

  {

   if(keynum==11)                         //代表开始移位,定时器中断开始

   {

     knum++;                         //代表4个数码管的某一位改变

         if(knum==5)                         //代表移位四次了,

         {

            knum=0;                          //变为初始状态,为确认做准备

         }

         if(knum!=0)                         //有按键按下

         {

            if(TR0!=1)                       //如果定时器没开启

                {

                  TR0=1;                     //开启定时器

                }

         }

         else                                //按键按了五次回到knum=0时,

         {

                   if(TR0!=0)                //如果定时器开启

                {

                   TR0=0;                    //关闭定时器

                }

         }

   }

   if(knum==0)                       //代表没有进行移位时可以进行密码输入操作

   {

      if(keynum<=9)        

         {

      digdate[3]=digdate[2]; 

      digdate[2]=digdate[1]; 

      digdate[1]=digdate[0]; 

          digdate[0]=keynum;

         }

   }

   else if(knum==1)                      //代表第零位数码管需要改变数值

   {

      if(keynum<=9)                      //防止按下移位按钮的时候显示b

         {

      digdate[0]=keynum;        //结合显示函数写

         }

         else if(keynum==12)

         {

           knum=0;

           if(TR0!=0)

           {

             TR0=0;

           }

         }

   }

   else if(knum==2)

   {

      if(keynum<=9)

         {        

      digdate[1]=keynum;     //结合显示函数写

         }

         else if(keynum==12)

         {

           knum=0;

           if(TR0!=0)

           {

              TR0=0;

           }

         }

   }

   else if(knum==3)

   {

     if(keynum<=9)        

         {

      digdate[2]=keynum;     //结合显示函数写

         }

         else if(keynum==12)

         {

           knum=0;

           if(TR0!=0)

           {

              TR0=0;

           }

         }

   }

   else if(knum==4)

   {

     if(keynum<=9)        

         {

      digdate[3]=keynum;     //结合显示函数写

         }

         else if(keynum==12)

         {

           knum=0;

           if(TR0!=0)

           {

              TR0=0;

           }

         }

   }


   if(keynum==10&&knum==0&&knum1==0)  //当矩阵按键值为10,且没有移位的时候才能判断

   {

    if(digdate[3]==digcode[3]&&digdate[2]==digcode[2]&&digdate[1]==digcode[1]&&digdate[0]==digcode[0])

        {

           digdate[3]=1;

           digdate[2]=1;

           digdate[1]=1;

           digdate[0]=1;

        }

        else

        {                                       

           digdate[3]=2;

           digdate[2]=2;

           digdate[1]=2;

           digdate[0]=2;

        }

   }

  }

  else                                  //如果密码进行更改

  {

      if(keynum==14)   //密码开始移位的按键

          {

             knum1++;

                 if(knum1==5)

                 {

                   knum1=0;

                 }

                 if(knum1!=0)

                 {

                    if(TR0!=1)

                        {

                          TR0=1;

                        }

[1] [2] [3]
关键字:单片机  数码管  矩阵按键  密码锁 引用地址:用单片机数码管和矩阵按键实现密码锁功能

上一篇:16位adc AD7705单片机例程(串口打印采集数据)
下一篇:单片机串口控制步进电机的源程序

推荐阅读最新更新时间:2024-11-17 09:23

基于单片机的嵌入式系统网络设计方案
  引言   在网络技术应用日益广泛的今天,网络传输是最经济有效的数据传输方式。如何利用廉价的51单片机来控制网卡芯片进行数据传输,加载TCP/IP协议连接到互联网,实现网络通信成了众多设计者的目标。但由于指令及资源的限制,实施过程会有许多困难。我们在设计方案中舍弃了耗费资源的高级协议,采用发送小数据包的方式以避免分段,来简化TCP协议和UDP协议,实现互联接入。   硬件设计与实现   系统的硬件结构框图如图1所示。本系统的微控制器是Winbond公司的78E58,网络接口芯片是与NE2000系列兼容的Realtek公司的RTL8019AS.RTL8019AS内置了10BASE-T收发器,外接一个隔离LPF滤波器,经RJ-4
[单片机]
基于<font color='red'>单片机</font>的嵌入式系统网络设计方案
单片机+LCD1602显示℃ 这种自定义符号
#include all.h u8 xdata LCD1602_Write_Buffer1 ; u8 xdata LCD1602_Write_Buffer2 ; u8 code LCD1602_5x8 ={0x08,0x00,0x07,0x08,0x08,0x08,0x08,0x07}; u8 xdata LCD1602_Write_Cursor_Add; void LCD1602_Delay(u8 len) { u8 idata i; while(len--) { i=15; while(i--); } } void LCD1602_Write_Add(u8 Ad
[单片机]
具备程序移植功能的四位数码管显示
#include reg51.h #define uint unsigned int #define uchar unsigned char uchar code num ={0XC0,0XF9,0XA4,0XB0,0X99, 0X92,0X82,0XF8,0X80,0X90}; sbit p20=P2^0; sbit p21=P2^1; sbit p22=P2^2; sbit p23=P2^3; void delay(uint z) { while(z--); } void disp(uchar a,b,c,d) { P2=0x00; p20=1; P0=num ; d
[单片机]
PIC单片机之ICSP
今次要说的是ICSP。ICSP,全称In-Circuit Serial Programming,在线串行编程。这行英文和ICSP这四个字母,一般使用时都带有TM标记的,也就是说,这是MICROCHIP的商标。也是MC独有的吧。呵呵。 从名字可以看出来,ICSP是一种编程方法,也就是说是一种烧写手段。这种手段可以在线烧写 即不需要将芯片取下就可以在板子上烧写。而这种烧写方法使用串行的数据。在线烧写其实也不是什么新闻了,大家熟悉的TI的DSP,一向可以使用JTAG口进行烧写,那就是标准的在线烧写。 MC的ICSP,使用起来极为方便,应用ICSP进行烧写,只需要使用芯片上的5个脚就可以,其中包括VDD VSS,这两个电源一定要供上。然后
[单片机]
单片机的应用发展到嵌入式操作系统的应用思考
1 嵌入式系统 嵌入式系统(Embedded System)是指有特定功能或用途的计算机硬、软件的集合体,分为嵌入式软件系统和嵌入式硬件系统。在智能控制设备、便携式智能仪器等应用场合,出于对产品体积、成本等诸因素的考虑,往往要求将智能控制部分安装于设备内部,且占用的空间尽可能小,在这种情况下,处理器没有一般意义的硬盘,只有有限容量的内存及常用的Flash电子盘,这样的系统称为嵌入式系统。嵌入式系统的操作系统和功能软件集成于计算机硬件系统之中,也就是软件与硬件的一体化。嵌入式系统目的性或针对性很强,具有软件代码小、高度自动化、响应速度快等特点,这也是与通用计算机系统的最主要区别。嵌入式技术与实时性有着必然的联系。 2 从
[单片机]
背靠央企的二进制半导体主攻汽车动力安全域MCU
本期话题: 二进制命名的由来 与中信科和东风合作研发车规芯片 深入探索汽车动力安全域MCU 二进制命名的由来 幻实(主播):欢迎大家收听芯片揭秘,我是主播幻实。今天我邀请到了武汉二进制半导体的副总经理蔡敏,现在蔡总就坐在我旁边了,请您跟大家打个招呼! 蔡敏(嘉宾):大家好,我是二进制半导体有限公司的蔡敏。 专访合影(图左为二进制半导体副总经理蔡敏,图右为幻实) 幻实(主播):其实二进制这个词我听起来特别技术范儿,0101的感觉,当时你们起这个名字是不是也标志做的产品和名字强相关?二进制是一家怎样的公司? 蔡敏(嘉宾):我们整个的业务领域以数字芯片为主,数字芯片就是我
[汽车电子]
背靠央企的二进制半导体主攻汽车动力安全域<font color='red'>MCU</font>
51单片机的1602驱动程序
//////////////////////////////////////////////////////头文件///////////////////////////////////////////////////// /******************************************************************************* * 标题: 1602显示驱动程序 * * 文件: 1602lcd.h 1602lcd.c * * 日期: 2010-3
[单片机]
基于单片机的等精度数字测频
在电子技术领域内,频率是一个最基本的参数,频率与其它许多电参量的测量方案,都有十分密切的关系。因此,频率的测量就显得更为重要,而且,目前在电子测量中,频率的测量精确度最高。 1. 电子计数测频原理框图 首先,被测信号通过放大整形,形成幅度一致,形状一致是计数脉冲。然后,N将它加到闸门的一个输入端,闸门由门控信号来控制其关闭时间。计得的脉冲送至译码,再送显示器显示出来。而由晶振产生的1MHz的振荡信号经放大整形,形成方波,经多个10分频10s,1s,0.1s,0.01s,1ms,那么有fx=N/T符合测频定义。根据f=N/T。不难看出,采用计数器测频的测量误差,一方面决定于闸门时间T准不准确,即由晶振提供的标准频率的准确度△T/
[测试测量]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved