找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

只用按鍵和燈做一個便攜式保險箱

查看數(shù): 1737 | 評論數(shù): 9 | 收藏 0
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2023-5-27 15:46

正文摘要:

按鍵隨機(jī)對應(yīng)一個燈,按下按鍵亮起的燈的位置必須在前一個亮起的燈下面,否則密碼輸入錯誤,所有燈滅,重新輸入。當(dāng)所有燈按順序正確亮起后,成功解鎖!靈感源于生化危機(jī)2重制版里的便攜式保險箱,有玩過的好兄弟會 ...

回復(fù)

ID:1080265 發(fā)表于 2023-5-28 12:12
597329015 發(fā)表于 2023-5-27 21:20
隨機(jī)對應(yīng):首先,我們需要將LED燈和按鍵一一對應(yīng),并將它們的位置隨機(jī)排列。在單片機(jī)中定義一個變量表示當(dāng) ...

首先感謝你的回答。
你的邏輯清晰,給我提供了一定的新思路。以你的效果燈必然是固定順序亮起的,按鍵排列是隨機(jī)的,就是已經(jīng)設(shè)置好亂序鍵盤再來輸入密碼,像蘋果手機(jī)解鎖界面,但是鍵盤是亂序的,上面一排燈是用來提示密碼總共位數(shù)和已輸入位數(shù),因此是必然一盞盞亮起表示依次被填滿,與我所設(shè)計(jì)的不同。
此外密碼輸入次數(shù)是不受限制的,嚴(yán)格來講這不是密碼鎖,只是一個訓(xùn)練短時記憶的小游戲。
如果可以,我想再問一個問題:燈和按鍵已經(jīng)按順序集成在了電路板上,不可再調(diào)序,如何按下按鍵亮起固定隨機(jī)對應(yīng)的燈?
ID:1080265 發(fā)表于 2023-5-28 10:46
wulin 發(fā)表于 2023-5-27 17:20
《按鍵隨機(jī)對應(yīng)一個燈,按下按鍵亮起的燈的位置必須在前一個亮起的燈下面》怎么理解?幾個按鍵幾個燈?按 ...

八個按鍵八個燈,按鍵就是正常數(shù)字鍵盤類排序,燈是從上到下排成一列,解鎖順序從上到下,不一定從第一盞燈開始,但是每下一盞得在前一盞亮起位置的下面。
ID:86450 發(fā)表于 2023-5-28 00:00
那是 幾個按鍵 幾個燈
ID:73992 發(fā)表于 2023-5-27 23:59
畫邏輯框圖
ID:1080331 發(fā)表于 2023-5-27 21:20
隨機(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 收起 理由
admin + 40 回帖助人的獎勵!

查看全部評分

ID:213173 發(fā)表于 2023-5-27 17:20
violet233 發(fā)表于 2023-5-27 15:48
主要就是我不熟悉指針,變量的關(guān)系,無法實(shí)現(xiàn)想要的邏輯效果,望各位大佬指點(diǎn)!

《按鍵隨機(jī)對應(yīng)一個燈,按下按鍵亮起的燈的位置必須在前一個亮起的燈下面》怎么理解?幾個按鍵幾個燈?按鍵與燈的排列布局如何?
ID:1080265 發(fā)表于 2023-5-27 15:48
本帖最后由 violet233 于 2023-5-28 11:09 編輯

主要就是我不熟悉指針,變量的關(guān)系,無法實(shí)現(xiàn)想要的邏輯效果,望各位大佬指點(diǎn)!
八個按鍵八個燈,按鍵就是正常數(shù)字鍵盤類排序,燈可以是從上到下排成一列,解鎖順序是從上到下一盞盞依次亮起,不一定從第一盞燈開始,但是每下一盞得在前一盞亮起位置的下面一位。按鍵隨機(jī)對應(yīng)燈,但是每次完整解鎖過程都是對應(yīng)同一盞燈,按該按鍵就對應(yīng)亮這盞燈,直至解鎖成功,進(jìn)行下一次解鎖按鍵和燈的順序從新編排。

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表