久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5932|回復: 1
收起左側

用單片機數碼管和矩陣按鍵實現密碼鎖功能 附原理圖+源程序

[復制鏈接]
ID:673128 發表于 2020-2-18 17:32 | 顯示全部樓層 |閱讀模式
  用數碼管和矩陣按鍵實現密碼鎖功能,我的理解是實現輸入數據并判斷數據是否和密碼一致,并且更改密碼。矩陣按鍵是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

單片機源程序如下:
  1. #include "digdisplay.h"                        //矩陣按鍵輸入10(鍵表面為S11,程序中默認都是數值)為密碼確認,矩陣按鍵輸入11為移位操作按鈕,輸入12為移位后閃爍的確認鍵,按下之后便會不閃爍;
  2. #include "key.h"                                //矩陣按鍵輸入13將進行密碼的設定,輸入14為密碼的移位,輸入15為結束閃爍
  3. u8 digdate[4]={0,0,0,0};                //存放輸入數值
  4. u8 digcode[4]={1,2,3,4};                //存放密碼值
  5. u8 knum=0,flag0,flag1=1,knum1=0;         //knum代表數據的移動位置,flag0代表移位閃爍標志位,flag1代表更改密碼操作的標志位,knum1是進行密碼移位的操作數
  6. u8 time;                        //定時器中斷時間計時,
  7. void keyprogress()                                //檢測密碼的輸入并進行判斷
  8. {
  9.    u8 keynum;
  10.    keynum=KeyDown();                 //if的判斷語句里應該不要加含有return的語句,我把KeyDown()放到if()里面程序錯誤了。
  11.    if(keynum!=0xff)                         //檢測按鍵是否按下,如果矩陣按鍵程序返回值不是0xff,說明是在輸入密碼值
  12. {
  13.    if(keynum==13&&knum==0&&knum1==0)                         //13代表著是否密碼需要更改,默認不需要更改,不在閃爍的時候進行更改,程序一步步走
  14.    {
  15.       flag1=!flag1;                         //改變輸入數據和密碼的標志位變化
  16.    }
  17.    if(flag1)
  18.   {
  19.    if(keynum==11)                         //代表開始移位,定時器中斷開始
  20.    {
  21.      knum++;                         //代表4個數碼管的某一位改變
  22.          if(knum==5)                         //代表移位四次了,
  23.          {
  24.             knum=0;                                 //變為初始狀態,為確認做準備
  25.          }
  26.          if(knum!=0)                         //有按鍵按下
  27.          {
  28.             if(TR0!=1)                         //如果定時器沒開啟
  29.                 {
  30.                   TR0=1;                         //開啟定時器
  31.                 }
  32.          }
  33.          else                                         //按鍵按了五次回到knum=0時,
  34.          {
  35.                    if(TR0!=0)                         //如果定時器開啟
  36.                 {
  37.                    TR0=0;                         //關閉定時器
  38.                 }
  39.          }
  40.    }
  41.    if(knum==0)                                 //代表沒有進行移位時可以進行密碼輸入操作
  42.    {
  43.       if(keynum<=9)       
  44.          {
  45.       digdate[3]=digdate[2];
  46.       digdate[2]=digdate[1];
  47.       digdate[1]=digdate[0];
  48.           digdate[0]=keynum;
  49.          }
  50.    }
  51.    else if(knum==1)                                 //代表第零位數碼管需要改變數值
  52.    {
  53.       if(keynum<=9)                                 //防止按下移位按鈕的時候顯示b
  54.          {
  55.       digdate[0]=keynum;        //結合顯示函數寫
  56.          }
  57.          else if(keynum==12)
  58.          {
  59.            knum=0;
  60.            if(TR0!=0)
  61.            {
  62.              TR0=0;
  63.            }
  64.          }
  65.    }
  66.    else if(knum==2)
  67.    {
  68.       if(keynum<=9)
  69.          {       
  70.       digdate[1]=keynum;     //結合顯示函數寫
  71.          }
  72.          else if(keynum==12)
  73.          {
  74.            knum=0;
  75.            if(TR0!=0)
  76.            {
  77.               TR0=0;
  78.            }
  79.          }
  80.    }
  81.    else if(knum==3)
  82.    {
  83.      if(keynum<=9)       
  84.          {
  85.       digdate[2]=keynum;     //結合顯示函數寫
  86.          }
  87.          else if(keynum==12)
  88.          {
  89.            knum=0;
  90.            if(TR0!=0)
  91.            {
  92.               TR0=0;
  93.            }
  94.          }
  95.    }
  96.    else if(knum==4)
  97.    {
  98.      if(keynum<=9)       
  99.          {
  100.       digdate[3]=keynum;     //結合顯示函數寫
  101.          }
  102.          else if(keynum==12)
  103.          {
  104.            knum=0;
  105.            if(TR0!=0)
  106.            {
  107.               TR0=0;
  108.            }
  109.          }
  110.    }

  111.    if(keynum==10&&knum==0&&knum1==0)  //當矩陣按鍵值為10,且沒有移位的時候才能判斷
  112.    {
  113.     if(digdate[3]==digcode[3]&&digdate[2]==digcode[2]&&digdate[1]==digcode[1]&&digdate[0]==digcode[0])
  114.         {
  115.            digdate[3]=1;
  116.            digdate[2]=1;
  117.            digdate[1]=1;
  118.            digdate[0]=1;
  119.         }
  120.         else
  121.         {                                       
  122.            digdate[3]=2;
  123.            digdate[2]=2;
  124.            digdate[1]=2;
  125.            digdate[0]=2;
  126.         }
  127.    }
  128.   }
  129.   else                                  //如果密碼進行更改
  130.   {
  131.       if(keynum==14)   //密碼開始移位的按鍵
  132.           {
  133.              knum1++;
  134.                  if(knum1==5)
  135.                  {
  136.                    knum1=0;
  137.                  }
  138.                  if(knum1!=0)
  139.                  {
  140.                     if(TR0!=1)
  141.                         {
  142.                           TR0=1;
  143.                         }
  144.                  }
  145.                  else
  146.                  {
  147.                     if(TR0!=0)
  148.                         {
  149.                           TR0=0;
  150.                         }
  151.                  }
  152.           }
  153.           if(knum1==0)
  154.           {
  155.              if(keynum<=9)         
  156.                  {
  157.                     digcode[3]=digcode[2];
  158.                     digcode[2]=digcode[1];
  159.                     digcode[1]=digcode[0];
  160.                         digcode[0]=keynum;
  161.                  }
  162.           }
  163.           else if(knum1==1)
  164.           {
  165.              if(keynum<=9)
  166.                  {
  167.                     digcode[0]=keynum;
  168.                  }
  169.                  else if(keynum==15)
  170.                  {
  171.                     knum1=0;
  172.                         if(TR0!=0)
  173.                         {
  174.                           TR0=0;
  175.                         }
  176.                  }
  177.           }
  178.           else if(knum1==2)
  179.           {
  180.              if(keynum<=9)
  181.                  {
  182.                     digcode[1]=keynum;
  183.                  }
  184.                  else if(keynum==15)
  185.                  {
  186.                     knum1=0;
  187.                         if(TR0!=0)
  188.                         {
  189.                           TR0=0;
  190.                         }
  191.                  }
  192.           }
  193.           else if(knum1==3)
  194.           {
  195.              if(keynum<=9)
  196.                  {
  197.                     digcode[2]=keynum;
  198.                  }
  199.                  else if(keynum==15)
  200.                  {
  201.                     knum1=0;
  202.                         if(TR0!=0)
  203.                         {
  204.                            TR0=0;
  205.                         }
  206.                  }
  207.           }
  208.           else if(knum1==4)
  209.           {
  210.              if(keynum<=9)
  211.                  {
  212.                     digcode[3]=keynum;
  213.                  }
  214.                  else if(keynum==15)
  215.                  {
  216.                     knum1=0;
  217.                         if(TR0!=0)
  218.                         {
  219.                           TR0=0;
  220.                         }
  221.                  }
  222.           }
  223.   }
  224. }
  225. }

  226. void display()                          //顯示函數的實現
  227. {  
  228.   if(flag1)
  229. {
  230.   if(knum==0)
  231. {
  232.   digdisplay(3,digdate[3]);
  233.   digdisplay(2,digdate[2]);
  234.   digdisplay(1,digdate[1]);
  235.   digdisplay(0,digdate[0]);
  236. }
  237. else if(knum==1)
  238. {
  239.    if(flag0)
  240.    {
  241.      digdisplay(3,digdate[3]);
  242.      digdisplay(2,digdate[2]);
  243.      digdisplay(1,digdate[1]);
  244.      digdisplay(0,digdate[0]);
  245.    }
  246.    else
  247.    {
  248.      digdisplay(3,digdate[3]);
  249.      digdisplay(2,digdate[2]);
  250.      digdisplay(1,digdate[1]);
  251.      digdisplay(0,17);                  //顯示空白
  252.    }
  253. }
  254. else if(knum==2)
  255. {
  256.    if(flag0)
  257.    {
  258.      digdisplay(3,digdate[3]);
  259.      digdisplay(2,digdate[2]);
  260.      digdisplay(1,digdate[1]);
  261.      digdisplay(0,digdate[0]);     
  262.    }
  263.    else
  264.    {
  265.      digdisplay(3,digdate[3]);
  266.      digdisplay(2,digdate[2]);
  267.      digdisplay(1,17);
  268.      digdisplay(0,digdate[0]);   
  269.    }
  270. }
  271. else if(knum==3)
  272. {
  273.    if(flag0)
  274.    {
  275.      digdisplay(3,digdate[3]);
  276.      digdisplay(2,digdate[2]);
  277.      digdisplay(1,digdate[1]);
  278.      digdisplay(0,digdate[0]);      
  279.    }
  280.    else
  281.    {
  282.      digdisplay(3,digdate[3]);
  283.      digdisplay(2,17);
  284.      digdisplay(1,digdate[1]);
  285.      digdisplay(0,digdate[0]);   
  286.    }
  287. }
  288.    else if(knum==4)
  289.   {
  290.    if(flag0)
  291.    {
  292.      digdisplay(3,digdate[3]);
  293.      digdisplay(2,digdate[2]);
  294.      digdisplay(1,digdate[1]);
  295.      digdisplay(0,digdate[0]);
  296.    }
  297.    else
  298.    {
  299.      digdisplay(3,17);
  300.      digdisplay(2,digdate[2]);
  301.      digdisplay(1,digdate[1]);
  302.      digdisplay(0,digdate[0]);
  303.    }
  304.   }
  305. }
  306. else
  307. {
  308.     if(knum1==0)                   //開始顯示密碼
  309.         {
  310.           digdisplay(3,digcode[3]);
  311.       digdisplay(2,digcode[2]);
  312.       digdisplay(1,digcode[1]);
  313.       digdisplay(0,digcode[0]);
  314.         }
  315.         else if(knum1==1)
  316.         {
  317.            if(flag0)
  318.           {
  319.            digdisplay(3,digcode[3]);
  320.        digdisplay(2,digcode[2]);
  321.        digdisplay(1,digcode[1]);
  322.        digdisplay(0,digcode[0]);             
  323.           }
  324.           else
  325.           {
  326.            digdisplay(3,digcode[3]);
  327.        digdisplay(2,digcode[2]);
  328.        digdisplay(1,digcode[1]);
  329.        digdisplay(0,17);          
  330.           }
  331.         }
  332.         else if(knum1==2)
  333.         {
  334.           if(flag0)
  335.           {
  336.            digdisplay(3,digcode[3]);
  337.        digdisplay(2,digcode[2]);
  338.        digdisplay(1,digcode[1]);
  339.        digdisplay(0,digcode[0]);
  340.           }
  341.           else
  342.           {
  343.            digdisplay(3,digcode[3]);
  344.        digdisplay(2,digcode[2]);
  345.        digdisplay(1,17);
  346.        digdisplay(0,digcode[0]);            
  347.           }          
  348.         }
  349.         else if(knum1==3)
  350.         {
  351.           if(flag0)
  352.           {
  353.            digdisplay(3,digcode[3]);
  354.        digdisplay(2,digcode[2]);
  355.        digdisplay(1,digcode[1]);
  356.        digdisplay(0,digcode[0]);          
  357.           }
  358.           else
  359.           {
  360.            digdisplay(3,digcode[3]);
  361.        digdisplay(2,17);
  362.        digdisplay(1,digcode[1]);
  363.        digdisplay(0,digcode[0]);
  364.           }
  365.         }
  366.         else if(knum1==4)
  367.         {
  368.           if(flag0)
  369.           {
  370.            digdisplay(3,digcode[3]);
  371.        digdisplay(2,digcode[2]);
  372.        digdisplay(1,digcode[1]);
  373.        digdisplay(0,digcode[0]);          
  374.           }
  375.           else
  376.           {
  377.            digdisplay(3,17);
  378.        digdisplay(2,digcode[2]);
  379.        digdisplay(1,digcode[1]);
  380.        digdisplay(0,digcode[0]);          
  381.           }
  382.         }
  383. }
  384. }
  385.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
  386. void main()
  387. {
  388.    TMOD &= 0xF0;   //設置定時器模式        10毫秒定時中斷
  389.    TMOD |= 0x01;   //設置定時器模式
  390.    TL0 = 0xF0;           //設置定時初值
  391.    TH0 = 0xD8;           //設置定時初值
  392.    TF0 = 0;                   //清除TF0標志
  393.    ET0=1;      
  394.    EA=1;
  395.    while(1)
  396.    {
  397.         keyprogress();
  398.                 display();                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
  399.    }
  400. }
  401. void  Timer0() interrupt 1
  402. {
  403.    TL0 = 0xF0;                //設置定時初值
  404.    TH0 = 0xD8;                //設置定時初值
  405.    if(knum!=0||knum1!=0)   //數碼管顯示所需的條件,二合一。
  406.   {
  407.    time++;
  408.    if(time==50)                //進行0.5秒的計時
  409.    {
  410.       time=0;
  411.           flag0=!flag0;
  412.    }
  413.   }
  414. }
復制代碼

全部資料51hei下載地址:
用數碼管以及矩陣按鍵實現密碼鎖功能.rar (38.4 KB, 下載次數: 38)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:328014 發表于 2020-2-21 00:25 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲巨乳自拍在线视频 | 色偷偷人人澡人人爽人人模 | 欧美在线 | 亚洲国产精品久久久久婷婷老年 | 精品av天堂毛片久久久借种 | 中文字字幕在线中文乱码范文 | 国产麻豆乱码精品一区二区三区 | 久久精品亚洲精品国产欧美kt∨ | 涩涩视频网 | 一级毛片观看 | 国产精久久久 | 国产一区二区三区 | 一区二区三区四区视频 | 亚洲一区二区精品视频在线观看 | 国产欧美日韩一区 | 天天干天天操天天射 | 久久久视频在线 | 国产精品五月天 | 国产激情在线观看 | 日韩精品免费一区二区在线观看 | 亚洲视频第一页 | 成人一区二区三区 | 欧美三区视频 | 国产av毛片| 精品国产乱码久久久久久影片 | 正在播放国产精品 | 人人艹人人爽 | 免费一级毛片 | 五月激情综合网 | 欧美日韩中文国产一区发布 | 亚洲综合在线播放 | 在线观看黄色大片 | 欧美 日韩 中文 | 91视视频在线观看入口直接观看 | 亚洲一区 中文字幕 | 九九国产在线观看 | 免费在线视频一区二区 | 国产在线精品一区二区三区 | 精品久久久久久久久久久久 | 中文字幕不卡视频在线观看 | 亚洲毛片网站 |