下面設計具體有16個按鍵輸入,S12~S15此處無用、用4為集成數碼管顯示4為密碼。矩陣鍵盤電路由P2口低四位控制4行,P2口高四位控制4列,數碼管短線段與P0口相連,4調位選控制線與P1口低四位相連,模擬鎖狀態的發光二極管由P3.0控制。
密碼鎖功能如下:
(1)系統上電,數碼管顯示 - - - -,此時可輸入4位密碼,然后以OK KEY鍵結束輸入,如果密碼輸入正確數碼管顯示 P,按下任意鍵結束;如果密碼輸入錯誤數碼管顯示 E 1秒,重新輸入。
(2)PASS KEY作為密碼設置按鍵,再次按下或已重置輸入4位密碼 則顯示 P 表示設置密碼成功返回輸入狀態。
仿真:
3.png (108.83 KB, 下載次數: 84)
下載附件
2019-5-28 18:23 上傳
部分程序:
- #include <reg51.h>
- void delay(unsigned int i) //延時函數
- {
- unsigned int k;
- for(k = 0; k < i; k++);
- }
- unsigned char code key_code[] ={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; //鍵盤掃描碼
- unsigned char led[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //數碼管顯示碼
- unsigned char pw[4]={0,0,0,0}; //存放原始密碼
- unsigned char pwnew[4]={10,10,10,10}; //存放輸入的密碼
- sbit P30=P3^0;
- void set_pw(); //密碼設置函數
- void dispset(); //密碼設置顯示函數
- void dispnew(); //當先輸入密碼顯示函數
- void dispright(); //輸入密碼正確顯示函數
- void disperror(); //輸入密碼錯誤顯示函數
- char keyscan(); //行列反轉法實現的矩陣鍵盤掃描函數
- void main()
- {
- char i,count;
- bit pw_flag; //密碼標志位,1表示正確0表示錯誤
- while(1)
- {
- i=keyscan();
- dispnew();
- if(i!=-1) //判斷是否有按鍵按下
- {
- if(i==11) //按下11號按鍵,進入密碼設置界面
- {
- P2=0xf0;
- while(P2!=0xf0);
- set_pw();
- }
-
- if((i>=0) && (i<=9))
- {
- pwnew[count]=i; //給pwnew數組賦上當前按下按鍵對應的值
-
- count++;
- P2=0xf0;
- while(P2!=0xf0); //判斷按鍵釋放
- }
-
- else if(i==10) //輸入密碼完成后按下確認鍵
- { pw_flag=1; //附上原始狀態
- if(count!=4) //先判斷輸入字符個數是否正確
- pw_flag=0; //不正確,則修改密碼標志位為0
- else
- {for(i=0;i<4;i++) //比較輸入字符與原始密碼是否相同
- {if(pw[i]!=pwnew[i])
- {pw_flag=0; break;}
- }
- }
-
- if(pw_flag==1) //密碼輸入正確
- {
- dispright(); //顯示密碼輸入正確顯示 P
- P30 = 0; //開鎖指示燈亮
- delay(20000);
- while(1)
- {
- i=keyscan();
- if(i!=-1) //有按鍵按下則退出等待狀態
- break;
- }
- P2=0xf0;
- while(P2!=0xf0); //判斷按鍵釋放
- }
- else
- {
- disperror(); //密碼輸入錯誤顯示 E
- P30 = 1;
- }
- count=0;
- delay(50000);
- for(i=0;i<4;i++) //清楚當前輸入值
- {
- pwnew[i]=10;
- }
-
-
- }
- }
- }
- }
復制代碼
Keil代碼與Proteus仿真下載:
四位密碼鎖.7z
(91.99 KB, 下載次數: 224)
2021-7-18 04:39 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|