历史上的今天
返回首页

历史上的今天

今天是:2025年02月21日(星期五)

正在发生

2020年02月21日 | 用单片机数码管和矩阵按键实现密码锁功能

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?imageView2/2/w/550 

单片机源程序如下:

#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;

                        }

推荐阅读

史海拾趣

DRS Technologies公司的发展小趣事

在全球电子行业快速发展的背景下,DRS面临着来自各方面的挑战。为了应对这些挑战,DRS不断加强研发投入,提高产品质量和服务水平。同时,公司也积极拓展国际市场,寻求更多的合作机会。通过这些努力,DRS在全球电子行业中保持了领先地位,并为未来的发展奠定了坚实的基础。

请注意,由于篇幅限制,以上故事均为概述性质,具体细节和背景信息可能有所省略。

宇阳科技(EYANG)公司的发展小趣事

在MLCC领域取得显著成就的同时,宇阳科技也在积极拓展其他业务领域。公司利用在MLCC领域积累的技术和经验,成功研发了多款新型电子元器件,并为移动通信、计算机及外设、数字视听产品等领域提供元器件方案设计、选型和配套综合服务。此外,宇阳科技还积极进军移动手机市场,通过参股、合作等方式,成功涉足移动手机软件及硬件设计、制造和销售等领域。

EEMB Co Ltd公司的发展小趣事

EEMB集团一直非常重视企业文化和团队建设。公司注重培养员工的创新意识和团队精神,为员工提供了良好的工作环境和发展机会。同时,公司也积极履行社会责任,关注环保和公益事业,为社会做出了积极贡献。这些举措不仅增强了公司的凝聚力和向心力,也为公司的可持续发展奠定了坚实基础。

请注意,以上故事是基于公开信息和一般情况下的假设而编写的,可能与EEMB Co Ltd公司的实际发展情况存在差异。

Hi-Light Electronic Co Ltd公司的发展小趣事

随着技术的不断进步和市场需求的日益增长,EEMB集团开始加大研发投入,力求在锂电池技术上实现更大的突破。经过不懈努力,公司成功研发出多款具有高性能、高安全性和长寿命特点的锂电池产品,并获得了多项国家专利。这些技术成果不仅提升了公司的市场竞争力,也为公司赢得了更多客户的青睐。同时,公司也积极开拓国际市场,产品逐渐出口到美国、日本、俄罗斯等国家。

Desco Tools公司的发展小趣事

Desco Tools公司最初成立于上世纪70年代,专注于防静电工具的研发和生产。当时,随着电子行业的迅速发展,对静电防护的需求日益增加。Desco Tools公司凭借其敏锐的市场洞察力和技术实力,成功开发出了一系列防静电工具,如防静电手套、手腕带等,这些产品迅速在市场上获得了认可,为公司的发展奠定了坚实的基础。

FCT electronic公司的发展小趣事

近年来,电子行业面临着成本上升、全球不稳定以及经济动荡等多重挑战。FCT electronic公司凭借其在挠性电路板领域的深厚积累,积极应对这些挑战。公司加强了对供应链的管理,提高了生产效率,降低了成本。同时,FCT electronic公司还加大了对研发的投入,推动产品向高端化、智能化方向转型升级。这些努力使FCT electronic公司在行业中保持了领先地位。

问答坊 | AI 解惑

上海数字、模拟: ic前端 后端设计,测试,等等职位

Jane Wu HeadhunterConsultant Tel:021-5080 3084 Cell:13482444994 Email:jane.wu@zhangjianghr.com.cn MSN:janewu2009@163.com www.zjpark.com   www.shrc.com.cn    www.zhangjianghr.com.cn 职位表 ...…

查看全部问答>

哥们收集的几个MP3的方案原理图

哥们收集的几个MP3的方案原理图,有ALIM5661X(俗称阿里方案)/炬力ATJ2055/ATJ2091/ATJ2135/凌阳SPDA1000/瑞星微2608A,有需要的朋友来看看吧,欢迎补充.....…

查看全部问答>

SD Host Controller 的问题

在CPU i.MX27 WinCE5.0环境下,有二个SDIO SD Host Controller 1 {B7C507E8-8B78-4CFC-870A-2BC4F4050519} SD Host Controller 2 {FD150420-C2DF-44B8-9FA2-AA9FD8CDA40E} SD Host Controller 1 可正常使用, 想使用SD Host Controller 2, ...…

查看全部问答>

用hl340转usb使用的移植u-boot出现乱码

用hl340转usb使用的移植u-boot出现乱码,但是直接接串口没有乱码,是不是hl340不支持uboot?麻烦高手明示…

查看全部问答>

如何通过FPGA配置(读写)带SPI接口的外设芯片?

该外设为AD9516时钟芯片,通过FPGA配置出不同的时钟输出。现在我只实现了基于FPGA的SPI接口,但是,如何像单片机一样来对SPI设备发起读写操作?请高人指点啊!谢谢!…

查看全部问答>

请推荐一款集成以太网控制器+PHY的片子

最近想做的东西,需要集成以太网控制器和PHY的低成本芯片,TI LM3S有不少,但我对这个系列不熟,想请大家推荐一款性价比高的,价格低,国内货源比较稳定的片子。最好具有DMA功能我原先看了LM3S6911这款,但可惜没有DMA功能,优点遗憾…

查看全部问答>

USB的VID/PID问题

                                 我打算在新设计的设备上,利用STM32的USB来代替传统的串口通信(因为很多笔记本都不提供串口,甚至很多新的台式机 ...…

查看全部问答>

汽车传感器行业找销售咯

华南区销售工程师华南区:大区办公室设在厦门本部,管辖福建、广东、广西、海南、江西主要工作: 1、   负责所辖区域产品的销售推广、提供售后服务及维护,完成本区域销售任务; 2、   建立健全所辖区域市场渠道信息系统,市 ...…

查看全部问答>

【低功耗】FPGA/CPLD设计经验分享资料(转)

文中对FPGA设计中的一些基本概念(比如建立时间、保持时间、竞争冒险、触发器、锁存器)和一些设计方法(比如同步设计、延时电路的设计、时钟设计等)中的问题进行了分享。 [ 本帖最后由 dream_byxiaoyu 于 2011-11-12 14:25 编辑 ]…

查看全部问答>

谁能帮我分析下这个电路?感激不尽

以前上课不听课,懊悔啊! 请各位大侠帮我分析下这个电路是怎么调速的?可控硅和双触发二极管要选什么型号。。希望能详细点,谢谢您…

查看全部问答>