熱門: 51單片機(jī) | 24小時必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時間: 2023-5-27 15:46
正文摘要:按鍵隨機(jī)對應(yīng)一個燈,按下按鍵亮起的燈的位置必須在前一個亮起的燈下面,否則密碼輸入錯誤,所有燈滅,重新輸入。當(dāng)所有燈按順序正確亮起后,成功解鎖!靈感源于生化危機(jī)2重制版里的便攜式保險箱,有玩過的好兄弟會 ... |
597329015 發(fā)表于 2023-5-27 21:20 首先感謝你的回答。 你的邏輯清晰,給我提供了一定的新思路。以你的效果燈必然是固定順序亮起的,按鍵排列是隨機(jī)的,就是已經(jīng)設(shè)置好亂序鍵盤再來輸入密碼,像蘋果手機(jī)解鎖界面,但是鍵盤是亂序的,上面一排燈是用來提示密碼總共位數(shù)和已輸入位數(shù),因此是必然一盞盞亮起表示依次被填滿,與我所設(shè)計(jì)的不同。 此外密碼輸入次數(shù)是不受限制的,嚴(yán)格來講這不是密碼鎖,只是一個訓(xùn)練短時記憶的小游戲。 如果可以,我想再問一個問題:燈和按鍵已經(jīng)按順序集成在了電路板上,不可再調(diào)序,如何按下按鍵亮起固定隨機(jī)對應(yīng)的燈? |
wulin 發(fā)表于 2023-5-27 17:20 八個按鍵八個燈,按鍵就是正常數(shù)字鍵盤類排序,燈是從上到下排成一列,解鎖順序從上到下,不一定從第一盞燈開始,但是每下一盞得在前一盞亮起位置的下面。 |
那是 幾個按鍵 幾個燈 |
畫邏輯框圖 |
隨機(jī)對應(yīng):首先,我們需要將LED燈和按鍵一一對應(yīng),并將它們的位置隨機(jī)排列。在單片機(jī)中定義一個變量表示當(dāng)前亮起的燈的位置,初始值為-1(即沒有任何燈亮起),每按下一個按鍵,就將當(dāng)前亮起的燈的位置加1。如果該位置大于等于最后一個燈的位置,說明密碼正確,解鎖成功。否則,所有燈都會熄滅,并重新開始輸入密碼。 按順序正確亮起:為了確保按鍵與LED燈按順序正確亮起,我們可以在按下按鍵后使用邏輯運(yùn)算比較當(dāng)前燈的位置和上一個亮起的燈的位置,如果當(dāng)前燈的位置大于上一個亮起的燈的位置,則將當(dāng)前燈的位置設(shè)置為上一個燈的位置加1。 使用計(jì)時器:為了避免機(jī)械化攻擊或無限制地嘗試密碼,我們可以使用計(jì)時器在一定時間內(nèi)限制密碼輸入的次數(shù),如果超過了設(shè)置的次數(shù),系統(tǒng)將鎖定一段時間,防止不正常的嘗試。 狀態(tài)顯示:我們可以使用LED燈來顯示當(dāng)前系統(tǒng)的狀態(tài),例如借助三個LED燈來表示解鎖成功、解鎖失敗和輸入密碼中等狀態(tài),方便用戶進(jìn)行操作。 電源管理:在系統(tǒng)設(shè)計(jì)中需要考慮供電問題,可以使用電池等不間斷電源以確保該系統(tǒng)的長期穩(wěn)定運(yùn)行。 以下是實(shí)例代碼: #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; //當(dāng)前亮起的燈位置 int last_led = -1; //上一個亮起的燈位置 void init() { key1 = 1; //按鍵初始化為高電平 key2 = 1; key3 = 1; led1 = 0; //LED初始化為低電平熄滅狀態(tài) led2 = 0; led3 = 0; } void delay(int t) { //延時函數(shù) 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) { //根據(jù)當(dāng)前亮起的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; } } } } |
參與人數(shù) 1 | 黑幣 +40 | 收起 理由 |
---|---|---|
![]() | + 40 | 回帖助人的獎勵! |
violet233 發(fā)表于 2023-5-27 15:48 《按鍵隨機(jī)對應(yīng)一個燈,按下按鍵亮起的燈的位置必須在前一個亮起的燈下面》怎么理解?幾個按鍵幾個燈?按鍵與燈的排列布局如何? |
本帖最后由 violet233 于 2023-5-28 11:09 編輯 主要就是我不熟悉指針,變量的關(guān)系,無法實(shí)現(xiàn)想要的邏輯效果,望各位大佬指點(diǎn)! 八個按鍵八個燈,按鍵就是正常數(shù)字鍵盤類排序,燈可以是從上到下排成一列,解鎖順序是從上到下一盞盞依次亮起,不一定從第一盞燈開始,但是每下一盞得在前一盞亮起位置的下面一位。按鍵隨機(jī)對應(yīng)燈,但是每次完整解鎖過程都是對應(yīng)同一盞燈,按該按鍵就對應(yīng)亮這盞燈,直至解鎖成功,進(jìn)行下一次解鎖按鍵和燈的順序從新編排。 |
Powered by 單片機(jī)教程網(wǎng)