;***** 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 ; E
RETLW 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'
上一篇:密码锁规格