標題: 行列反轉發(fā)實現(xiàn)具有4位密碼設置的實用密碼鎖單片機程序,數(shù)碼管顯示 [打印本頁]

作者: hualihushao    時間: 2019-5-28 18:28
標題: 行列反轉發(fā)實現(xiàn)具有4位密碼設置的實用密碼鎖單片機程序,數(shù)碼管顯示
      下面設計具體有16個按鍵輸入,S12~S15此處無用、用4為集成數(shù)碼管顯示4為密碼。矩陣鍵盤電路由P2口低四位控制4行,P2口高四位控制4列,數(shù)碼管短線段與P0口相連,4調位選控制線與P1口低四位相連,模擬鎖狀態(tài)的發(fā)光二極管由P3.0控制。

密碼鎖功能如下:
(1)系統(tǒng)上電,數(shù)碼管顯示 - - - -,此時可輸入4位密碼,然后以OK KEY鍵結束輸入,如果密碼輸入正確數(shù)碼管顯示 P,按下任意鍵結束;如果密碼輸入錯誤數(shù)碼管顯示 E 1秒,重新輸入。
(2)PASS KEY作為密碼設置按鍵,再次按下或已重置輸入4位密碼 則顯示 P 表示設置密碼成功返回輸入狀態(tài)。

仿真:



部分程序:
  1. #include <reg51.h>

  2. void delay(unsigned int i)                //延時函數(shù)
  3. {
  4.         unsigned int k;
  5.         for(k = 0; k < i; k++);
  6. }

  7. unsigned char code key_code[] ={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};  //鍵盤掃描碼
  8. unsigned char led[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};                //數(shù)碼管顯示碼
  9. unsigned char pw[4]={0,0,0,0};                                        //存放原始密碼
  10. unsigned char pwnew[4]={10,10,10,10};                //存放輸入的密碼
  11. sbit P30=P3^0;

  12. void set_pw();                //密碼設置函數(shù)
  13. void dispset();                //密碼設置顯示函數(shù)
  14. void dispnew();                //當先輸入密碼顯示函數(shù)
  15. void dispright();        //輸入密碼正確顯示函數(shù)
  16. void disperror();        //輸入密碼錯誤顯示函數(shù)
  17. char keyscan();                //行列反轉法實現(xiàn)的矩陣鍵盤掃描函數(shù)



  18. void main()
  19. {
  20.         char i,count;
  21.         bit pw_flag;                //密碼標志位,1表示正確0表示錯誤
  22.         while(1)
  23.         {
  24.                 i=keyscan();
  25.                 dispnew();
  26.                 if(i!=-1)                        //判斷是否有按鍵按下
  27.                 {
  28.                         if(i==11)                //按下11號按鍵,進入密碼設置界面
  29.                         {
  30.                                 P2=0xf0;
  31.                                 while(P2!=0xf0);
  32.                                 set_pw();
  33.                         }
  34.                         
  35.                         if((i>=0) && (i<=9))
  36.                         {
  37.                                 pwnew[count]=i;                //給pwnew數(shù)組賦上當前按下按鍵對應的值
  38.                                 
  39.                                 count++;
  40.                                 P2=0xf0;
  41.                                 while(P2!=0xf0);                //判斷按鍵釋放
  42.                         }
  43.                         
  44.                         else if(i==10)                                //輸入密碼完成后按下確認鍵
  45.                                 {        pw_flag=1;                                //附上原始狀態(tài)
  46.                                 if(count!=4)                                //先判斷輸入字符個數(shù)是否正確
  47.                                         pw_flag=0;                                //不正確,則修改密碼標志位為0
  48.                                 else
  49.                                 {for(i=0;i<4;i++)                //比較輸入字符與原始密碼是否相同
  50.                                         {if(pw[i]!=pwnew[i])
  51.                                                 {pw_flag=0; break;}
  52.                                         }
  53.                                 }
  54.                                 
  55.                                 if(pw_flag==1)                        //密碼輸入正確
  56.                                 {
  57.                                         dispright();                        //顯示密碼輸入正確顯示 P
  58.                                         P30 = 0;                                                //開鎖指示燈亮
  59.                                         delay(20000);
  60.                                         while(1)
  61.                                         {
  62.                                                 i=keyscan();
  63.                                                 if(i!=-1)                                //有按鍵按下則退出等待狀態(tài)
  64.                                                         break;        
  65.                                         }
  66.                                         P2=0xf0;
  67.                                         while(P2!=0xf0);                //判斷按鍵釋放
  68.                                 }
  69.                                 else
  70.                                 {
  71.                                         disperror();                        //密碼輸入錯誤顯示 E
  72.                                         P30 = 1;
  73.                                 }
  74.                                 count=0;
  75.                                 delay(50000);
  76.                                 for(i=0;i<4;i++)                //清楚當前輸入值
  77.                                 {
  78.                                         pwnew[i]=10;
  79.                                 }
  80.                                 
  81.                                 
  82.                         }        
  83.                 }
  84.         }
  85. }
復制代碼

Keil代碼與Proteus仿真下載:
四位密碼鎖.7z (91.99 KB, 下載次數(shù): 224)

作者: 嗒嗒嗒2    時間: 2019-6-5 12:00
謝謝樓主,仿真成功了,中文注釋也很詳細  密碼是0000哦

51hei.png (31.42 KB, 下載次數(shù): 117)

51hei.png

51hei.png (37.54 KB, 下載次數(shù): 110)

51hei.png

作者: 我們在學校    時間: 2020-11-15 12:22
樓主,解壓密碼是多少?
作者: 南風未起1234    時間: 2020-11-22 13:02
下下來之后,注釋全是亂碼,可以重新發(fā)一下嗎
作者: zxcv涼    時間: 2020-11-26 09:44
樓主,仿真打不開啊
作者: SDIUHAD    時間: 2021-6-21 23:53
嗒嗒嗒2 發(fā)表于 2019-6-5 12:00
謝謝樓主,仿真成功了,中文注釋也很詳細  密碼是0000哦

能發(fā)一下后續(xù)代碼嗎
作者: 2657575938    時間: 2021-7-18 02:14
心態(tài)崩了 ,下載下來沒有hex,后面仿真也是搞不成

作者: 51hei團團    時間: 2021-7-18 04:37
2657575938 發(fā)表于 2021-7-18 02:14
心態(tài)崩了 ,下載下來沒有hex,后面仿真也是搞不成

學單片機切勿心急,要慢慢弄懂每一個細節(jié),hex文件在 "程序\Objects" 目錄里面,仿真用Proteus8.8,你看我這不是成功了嗎?

51hei.png (2.81 KB, 下載次數(shù): 117)

51hei.png

51hei.gif (81.14 KB, 下載次數(shù): 91)

51hei.gif

作者: 聽哦距離了了    時間: 2021-12-17 12:36
51hei團團 發(fā)表于 2021-7-18 04:37
學單片機切勿心急,要慢慢弄懂每一個細節(jié),hex文件在 "程序\Objects" 目錄里面,仿真用Proteus8.8,你看我這 ...

有后續(xù)的代碼嗎

作者: wofa    時間: 2021-12-17 15:45
謝謝樓主,仿真成功了,中文注釋也很詳細  密碼是0000哦

作者: mny123    時間: 2022-6-2 00:39
你好 我的單片機是用P3口的,行列都是,我試著改了但是不對,請問我對應的話應該改哪里,麻煩了

作者: dj3365191    時間: 2022-6-4 15:09
樓主你好,我在你開鎖指示燈 delay(20000);后面加了P30 = 1; ,但是仿真的時候LED只是亮了一下然后迅速熄滅,延時改成100000也是一樣,請教各位怎樣讓LED開鎖后延時5秒后熄滅,謝謝!
作者: 2807326858    時間: 2022-7-5 23:14
為什么程序是亂碼
作者: 2807326858    時間: 2022-7-5 23:15
wofa 發(fā)表于 2021-12-17 15:45
謝謝樓主,仿真成功了,中文注釋也很詳細  密碼是0000哦

請問有注釋嗎,我打開的不是程序,
作者: heicad    時間: 2022-7-6 05:54
2807326858 發(fā)表于 2022-7-5 23:14
為什么程序是亂碼

打開方式有問題吧,是第一次用Keil嗎?你從網(wǎng)頁上把復制過去 重新建立工程,就可以了,不需要下載.你看我的打開效果

51hei.png (73.12 KB, 下載次數(shù): 67)

51hei.png





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1