|
發布時間: 2023-5-27 15:46
正文摘要:按鍵隨機對應一個燈,按下按鍵亮起的燈的位置必須在前一個亮起的燈下面,否則密碼輸入錯誤,所有燈滅,重新輸入。當所有燈按順序正確亮起后,成功解鎖!靈感源于生化危機2重制版里的便攜式保險箱,有玩過的好兄弟會 ... |
597329015 發表于 2023-5-27 21:20 首先感謝你的回答。 你的邏輯清晰,給我提供了一定的新思路。以你的效果燈必然是固定順序亮起的,按鍵排列是隨機的,就是已經設置好亂序鍵盤再來輸入密碼,像蘋果手機解鎖界面,但是鍵盤是亂序的,上面一排燈是用來提示密碼總共位數和已輸入位數,因此是必然一盞盞亮起表示依次被填滿,與我所設計的不同。 此外密碼輸入次數是不受限制的,嚴格來講這不是密碼鎖,只是一個訓練短時記憶的小游戲。 如果可以,我想再問一個問題:燈和按鍵已經按順序集成在了電路板上,不可再調序,如何按下按鍵亮起固定隨機對應的燈? |
wulin 發表于 2023-5-27 17:20 八個按鍵八個燈,按鍵就是正常數字鍵盤類排序,燈是從上到下排成一列,解鎖順序從上到下,不一定從第一盞燈開始,但是每下一盞得在前一盞亮起位置的下面。 |
| 那是 幾個按鍵 幾個燈 |
| 畫邏輯框圖 |
|
隨機對應:首先,我們需要將LED燈和按鍵一一對應,并將它們的位置隨機排列。在單片機中定義一個變量表示當前亮起的燈的位置,初始值為-1(即沒有任何燈亮起),每按下一個按鍵,就將當前亮起的燈的位置加1。如果該位置大于等于最后一個燈的位置,說明密碼正確,解鎖成功。否則,所有燈都會熄滅,并重新開始輸入密碼。 按順序正確亮起:為了確保按鍵與LED燈按順序正確亮起,我們可以在按下按鍵后使用邏輯運算比較當前燈的位置和上一個亮起的燈的位置,如果當前燈的位置大于上一個亮起的燈的位置,則將當前燈的位置設置為上一個燈的位置加1。 使用計時器:為了避免機械化攻擊或無限制地嘗試密碼,我們可以使用計時器在一定時間內限制密碼輸入的次數,如果超過了設置的次數,系統將鎖定一段時間,防止不正常的嘗試。 狀態顯示:我們可以使用LED燈來顯示當前系統的狀態,例如借助三個LED燈來表示解鎖成功、解鎖失敗和輸入密碼中等狀態,方便用戶進行操作。 電源管理:在系統設計中需要考慮供電問題,可以使用電池等不間斷電源以確保該系統的長期穩定運行。 以下是實例代碼: #include <reg51.h> sbit key1 = P1^0; //按鍵引腳定義 sbit key2 = P1^1; sbit key3 = P1^2; sbit led1 = P2^0; //LED引腳定義 sbit led2 = P2^1; sbit led3 = P2^2; int current_led = -1; //當前亮起的燈位置 int last_led = -1; //上一個亮起的燈位置 void init() { key1 = 1; //按鍵初始化為高電平 key2 = 1; key3 = 1; led1 = 0; //LED初始化為低電平熄滅狀態 led2 = 0; led3 = 0; } void delay(int t) { //延時函數 for(int i=0; i<t; i++) { for(int j=0; j<120; j++); } } void main() { init(); while(1) { if(!key1) { //按鍵1被按下 if(current_led == -1 || current_led == last_led + 1) { //密碼正確 current_led++; last_led = current_led; switch(current_led) { //根據當前亮起的LED位置控制LED燈亮滅 case 0: led1 = 1; break; case 1: led2 = 1; break; case 2: led3 = 1; break; } if(current_led == 2) { //所有LED燈都亮起,解鎖成功 delay(500); led1 = 0; led2 = 0; led3 = 0; current_led = -1; last_led = -1; } } else { //密碼錯誤 delay(500); led1 = 0; led2 = 0; led3 = 0; current_led = -1; last_led = -1; } } if(!key2) { //按鍵2被按下 if(current_led == -1 || current_led == last_led + 1) { //密碼正確 current_led++; last_led = current_led; switch(current_led) { case 0: led1 = 1; break; case 1: led2 = 1; break; case 2: led3 = 1; break; } if(current_led == 2) { delay(500); led1 = 0; led2 = 0; led3 = 0; current_led = -1; last_led = -1; } } else { //密碼錯誤 delay(500); led1 = 0; led2 = 0; led3 = 0; current_led = -1; last_led = -1; } } if(!key3) { //按鍵3被按下 if(current_led == -1 || current_led == last_led + 1) { //密碼正確 current_led++; last_led = current_led; switch(current_led) { case 0: led1 = 1; break; case 1: led2 = 1; break; case 2: led3 = 1; break; } if(current_led == 2) { delay(500); led1 = 0; led2 = 0; led3 = 0; current_led = -1; last_led = -1; } } else { //密碼錯誤 delay(500); led1 = 0; led2 = 0; led3 = 0; current_led = -1; last_led = -1; } } } } |
violet233 發表于 2023-5-27 15:48 《按鍵隨機對應一個燈,按下按鍵亮起的燈的位置必須在前一個亮起的燈下面》怎么理解?幾個按鍵幾個燈?按鍵與燈的排列布局如何? |
|
本帖最后由 violet233 于 2023-5-28 11:09 編輯 主要就是我不熟悉指針,變量的關系,無法實現想要的邏輯效果,望各位大佬指點! 八個按鍵八個燈,按鍵就是正常數字鍵盤類排序,燈可以是從上到下排成一列,解鎖順序是從上到下一盞盞依次亮起,不一定從第一盞燈開始,但是每下一盞得在前一盞亮起位置的下面一位。按鍵隨機對應燈,但是每次完整解鎖過程都是對應同一盞燈,按該按鍵就對應亮這盞燈,直至解鎖成功,進行下一次解鎖按鍵和燈的順序從新編排。 |