這并不是一個真正的電子密碼鎖,僅供學(xué)習(xí)單片機(jī)用。 電路所完成的功能是等待密碼的輸入,通過數(shù)碼管滾動顯示輸入的文本。輸入密碼的方 法是:電路中有一個撥碼開關(guān)(看實(shí)物圖)用前3位來輸入密碼,第4位先撥到上,再撥到下 (相當(dāng)于按了一下“回車”鍵)以確認(rèn)。重復(fù)以上動作可輸入一個6位的密碼。 單片機(jī)將把 輸入的密碼與單片機(jī)內(nèi)部的密碼相比較,如果一致,比較后顯示“ACCEPTED”則意味著密碼 正確,鎖被打開,然后電路返回初始狀態(tài)。如果比較的結(jié)果是不一致,顯示“DENIED”表示 密碼不正確。

;***** VARIABLE DEFINITIONStempEQU 0x0C ; temp variablepincodeEQU 0x0D ; the PINdelaytemp1EQU0x0Edelaytemp2EQU0x0Fdelaytemp3EQU0x010countEQU0x011entryEQU0x012;********************************************************************** ORG 0x000 ; processor reset vector goto main ; go to beginning of program ORG 0x004 ; interrupt vector location retfie ; return from interrupt;table1ADDWFPCL, F; JumpRETLW0x086; ERETLW0x0AB; nRETLW0x087; tRETLW0x086; E RETLW0x0AF; rRETLW0x0FF; spaceRETLW0x08C; PRETLW0x0F9; IRETLW0x0AB; nRETLW0x07F; dpRETLW0x00; null char;table2ADDWFPCL, FRETLW0x088; ARETLW0x0C6; CRETLW0x0C6; CRETLW0x086; ERETLW0x08C; PRETLW0x087; tRETLW0x086; ERETLW0x0A1; dRETLW0x00; \0;table3ADDWFPCL, FRETLW0x0A1; dRETLW0x086; ERETLW0x0AB; nRETLW0x0F9; IRETLW0x086; ERETLW0x0A1; dRETLW0x00; \0;main bsfSTATUS, RP0; Set page bitclrfTRISB; All outputsbcfSTATUS, RP0; Clear page bit; 7-seg on PORTB, dp on ; bit 7 seg a on bit 0MOVLWb'00111111'MOVWFpincode; Main loop, while PIN is wrong say ENTER PINCLRFcount; char countMOVLWb'10000000'MOVWFentry; first entry flag setmain_loopMOVFcount, WCALLtable1ANDLW0x0FF;test if at end of messageBTFSCSTATUS, ZGOTOdisp_doneMOVWFPORTB; Display charCALLdel500ms; delayINCFcount, FBTFSCPORTA, 0; Enter key, switch 5GOTOmain_loop;MOVFPORTA, WMOVWFtempMOVLW0x03A; Debounce switchCALLdel_xW; delay of ~ 30 msBTFSCentry, 7; first or second press ;of enter ?GOTOfirstMOVLWb'00001110'ANDWFtemp, F; maskRLFtemp, F; shift left 1 bitRLFtemp, W; shift left 1 bitIORWFentry, FMOVFentry, WCLRFcountSUBWFpincode, WBTFSSSTATUS, ZGOTOdenied;acceptedMOVFcount, WCALLtable2ANDLW0x0FF;test if at end of messageBTFSCSTATUS, ZGOTOcode_doneMOVWFPORTB; Display charCALLdel500ms; delayINCFcount, FGOTOaccepted; Do all chars;deniedMOVFcount, WCALLtable3ANDLW0x0FF;test if at end of messageBTFSCSTATUS, ZGOTOcode_doneMOVWFPORTB; Display charCALLdel500ms; delayINCFcount, FGOTOdenied; Do all chars;code_doneCALLdel500msCLRFcountMOVLWb'10000000'MOVWFentry; first entry flag setGOTOmain_loop;firstMOVLWb'00001110'ANDWFtemp, F; maskRRFtemp, W; shift right 1 bitMOVWFentry; clears first flag bitGOTOmain_loop; Keep displaying message;disp_doneCLRFcountGOTOmain_loop;del_xWmovwfdelaytemp2; delay 256 cycles * Wclrfdelaytemp1; min delay ~ 512us ;max ~ 131072us = 0.131 sdel_loopdecfszdelaytemp1, f;delay time = gotodel_loop;msd * ((3 * 256) + 3) * tcydecfszdelaytemp2, f;gotodel_loop;Actual delay time is 925 usreturn;del500msMOVLW0x03MOVWFdelaytemp3; 4 loopsdel_loop2MOVLW0x0C3; 195 loops ~ 100ms * 5 = ~500msCALLdel_xW; Delay routineDECFSZdelaytemp3, FGOTOdel_loop2RETURN; Return from routine END; directive 'end of program'
|