电路所完成的功能是等待密码的输入,通过数码管滚动显示输入的文本。输入密码的方
法是:电路中有一个拨码开关(看实物图)用前3位来输入密码,第4位先拨到上,再拨到下
(相当于按了一下“回车”键)以确认。重复以上动作可输入一个6位的密码。 单片机将把
输入的密码与单片机内部的密码相比较,如果一致,比较后显示“ACCEPTED”则意味着密码
正确,锁被打开,然后电路返回初始状态。如果比较的结果是不一致,显示“DENIED”表示
密码不正确。

;***** VARIABLE DEFINITIONS
temp EQU 0x0C ; temp variable
pincode EQU 0x0D ; the PIN
delaytemp1 EQU 0x0E
delaytemp2 EQU 0x0F
delaytemp3 EQU 0x010
count EQU 0x011
entry EQU 0x012
;**********************************************************************
ORG 0x000 ; processor reset vector
goto main ; go to beginning of program
ORG 0x004 ; interrupt vector location
retfie ; return from interrupt
;
table1 ADDWF PCL, F ; Jump
RETLW 0x086 ; E
RETLW 0x0AB ; n
RETLW 0x087 ; t
RETLW 0x086 ; ERETLW 0x0AF ; r RETLW 0x0FF ; space RETLW 0x08C ; P RETLW 0x0F9 ; I RETLW 0x0AB ; n RETLW 0x07F ; dp RETLW 0x00 ; null char ; table2 ADDWF PCL, F RETLW 0x088 ; A RETLW 0x0C6 ; C RETLW 0x0C6 ; C RETLW 0x086 ; E RETLW 0x08C ; P RETLW 0x087 ; t RETLW 0x086 ; E RETLW 0x0A1 ; d RETLW 0x00 ; \0 ; table3 ADDWF PCL, F RETLW 0x0A1 ; d RETLW 0x086 ; E RETLW 0x0AB ; n RETLW 0x0F9 ; I RETLW 0x086 ; E RETLW 0x0A1 ; d RETLW 0x00 ; \0 ; main bsf STATUS, RP0 ; Set page bit clrf TRISB ; All outputs bcf STATUS, RP0 ; Clear page bit ; 7-seg on PORTB, dp on ; bit 7 seg a on bit 0 MOVLW b'00111111' MOVWF pincode ; Main loop, while PIN is wrong say ENTER PIN CLRF count ; char count MOVLW b'10000000' MOVWF entry ; first entry flag set main_loop MOVF count, W CALL table1 ANDLW 0x0FF ;test if at end of message BTFSC STATUS, Z GOTO disp_done MOVWF PORTB ; Display char CALL del500ms ; delay INCF count, F BTFSC PORTA, 0 ; Enter key, switch 5 GOTO main_loop ; MOVF PORTA, W MOVWF temp MOVLW 0x03A ; Debounce switch CALL del_xW ; delay of ~ 30 ms BTFSC entry, 7 ; first or second press ;of enter ? GOTO first MOVLW b'00001110' ANDWF temp, F ; mask RLF temp, F ; shift left 1 bit RLF temp, W ; shift left 1 bit IORWF entry, F MOVF entry, W CLRF count SUBWF pincode, W BTFSS STATUS, Z GOTO denied ; accepted MOVF count, W CALL table2 ANDLW 0x0FF ;test if at end of message BTFSC STATUS, Z GOTO code_done MOVWF PORTB ; Display char CALL del500ms ; delay INCF count, F GOTO accepted ; Do all chars ; denied MOVF count, W CALL table3 ANDLW 0x0FF ;test if at end of message BTFSC STATUS, Z GOTO code_done MOVWF PORTB ; Display char CALL del500ms ; delay INCF count, F GOTO denied ; Do all chars ; code_done CALL del500ms CLRF count MOVLW b'10000000' MOVWF entry ; first entry flag set GOTO main_loop ; first MOVLW b'00001110' ANDWF temp, F ; mask RRF temp, W ; shift right 1 bit MOVWF entry ; clears first flag bit GOTO main_loop ; Keep displaying message ; disp_done CLRF count GOTO main_loop ; del_xW movwf delaytemp2 ; delay 256 cycles * W clrf delaytemp1 ; min delay ~ 512us ;max ~ 131072us = 0.131 s del_loop decfsz delaytemp1, f ;delay time = goto del_loop ;msd * ((3 * 256) + 3) * tcy decfsz delaytemp2, f ; goto del_loop ;Actual delay time is 925 us return ; del500ms MOVLW 0x03 MOVWF delaytemp3 ; 4 loops del_loop2 MOVLW 0x0C3 ; 195 loops ~ 100ms * 5 = ~500ms CALL del_xW ; Delay routine DECFSZ delaytemp3, F GOTO del_loop2 RETURN ; Return from routine END ; directive 'end of program'