| hbe02 |
Apr 17th, 2006 7:00 PM |
this all is tested with the port watch and stimulus controller...
:
list p=16f84 ; Identifies device
radix hex ; Set default radix
include "p16f84.inc" ; Includes symbol definitions
PASS0 EQU d'12'
PASS1 EQU d'13'
PASS2 EQU d'14'
TEST_PASS0 EQU d'16'
TEST_PASS1 EQU d'17'
TEST_PASS2 EQU d'18'
TYPE_PASS EQU d'20' ;TYPED IN PASSWORD
STATE EQU d'21' ;4 STATES ON STATE(0) AND STATE(1)
PBCPY EQU d'22'
NEW_PASS0 EQU d'23'
NEW_PASS1 EQU d'24'
NEW_PASS2 EQU d'25'
NEW_STATE EQU d'27'
ORG 0x0
GOTO PRE_MAIN
ORG 0X4
MOVF PORTB,0
MOVWF PBCPY ;COPY PORTB TO PBCPY NOT TO LOSE DATA
BTFSC INTCON,RBIF
GOTO INPUT
TIMEOUT
CLRF STATE
GOTO ENDINTERRUPT0
INPUT
BTFSC PBCPY,7
GOTO COLUMN0
BTFSC PBCPY,6
GOTO COLUMN1
BTFSC PBCPY,5
GOTO COLUMN2
BTFSC PBCPY,4
GOTO COLUMN3
GOTO ENDINTERRUPT0
;ROW0 CORRESPOND TO PBCPY(0)
; C0 C1 C2 C3
;ROW0 1 2 3 A
;ROW1 4 5 6 B
;ROW2 7 8 9 C
;ROW3 * 0 # D
COLUMN0
BTFSC PBCPY,0
GOTO COLUMN0_ROW0
BTFSC PBCPY,1
GOTO COLUMN0_ROW1
BTFSC PBCPY,2
GOTO COLUMN0_ROW2
BTFSC PBCPY,3
GOTO COLUMN0_ROW3
GOTO ENDINTERRUPT0
COLUMN1
BTFSC PBCPY,0
GOTO COLUMN1_ROW0
BTFSC PBCPY,1
GOTO COLUMN1_ROW1
BTFSC PBCPY,2
GOTO COLUMN1_ROW2
BTFSC PBCPY,3
GOTO COLUMN1_ROW3
GOTO ENDINTERRUPT0
COLUMN2
BTFSC PBCPY,0
GOTO COLUMN2_ROW0
BTFSC PBCPY,1
GOTO COLUMN2_ROW1
BTFSC PBCPY,2
GOTO COLUMN2_ROW2
BTFSC PBCPY,3
GOTO COLUMN2_ROW3
GOTO ENDINTERRUPT0
COLUMN3
BTFSC PBCPY,0
GOTO COLUMN3_ROW0
BTFSC PBCPY,1
GOTO COLUMN3_ROW1
BTFSC PBCPY,2
GOTO COLUMN3_ROW2
BTFSC PBCPY,3
GOTO COLUMN3_ROW3
GOTO ENDINTERRUPT0
;ROW0 CORRESPOND TO PBCPY(0)
; C0 C1 C2 C3
;ROW0 1 2 3 A
;ROW1 4 5 6 B
;ROW2 7 8 9 C
;ROW3 * 0 # D
;FIND WHICH STATE, COPY CHARACTER TO TEST_PASS AND GO TO CORRESPONDING STATE LABEL TO COMPARE
COLUMN0_ROW0
MOVLW d'1'
MOVWF TYPE_PASS
MOVWF PORTA ;TOCKI SHOULD NOT BE AFFECTED AND REMAINS ZERO
GOTO STATE_TEST
GOTO ENDINTERRUPT0
COLUMN0_ROW1
MOVLW d'4'
MOVWF TYPE_PASS
MOVWF PORTA
GOTO STATE_TEST
GOTO ENDINTERRUPT0
COLUMN0_ROW2
MOVLW d'7'
MOVWF TYPE_PASS
MOVWF PORTA
GOTO STATE_TEST
GOTO ENDINTERRUPT0
COLUMN0_ROW3
MOVLW 0xe ; e = *
GOTO CHANGEPASS?
GOTO ENDINTERRUPT0
;------------------------------------
COLUMN1_ROW0
MOVLW d'2'
MOVWF TYPE_PASS
MOVWF PORTA
GOTO STATE_TEST
GOTO ENDINTERRUPT0
COLUMN1_ROW1
MOVLW d'5'
MOVWF TYPE_PASS
MOVWF PORTA
GOTO STATE_TEST
GOTO ENDINTERRUPT0
COLUMN1_ROW2
MOVLW d'8'
MOVWF TYPE_PASS
MOVWF PORTA
GOTO STATE_TEST
GOTO ENDINTERRUPT0
COLUMN1_ROW3
MOVLW d'0'
MOVWF TYPE_PASS
MOVWF PORTA
GOTO STATE_TEST
GOTO ENDINTERRUPT0
;------------------------------------
COLUMN2_ROW0
MOVLW d'3'
MOVWF TYPE_PASS
MOVWF PORTA
GOTO STATE_TEST
GOTO ENDINTERRUPT0
COLUMN2_ROW1
MOVLW d'6'
MOVWF TYPE_PASS
MOVWF PORTA
GOTO STATE_TEST
GOTO ENDINTERRUPT0
COLUMN2_ROW2
MOVLW d'9'
MOVWF TYPE_PASS
MOVWF PORTA
GOTO STATE_TEST
GOTO ENDINTERRUPT0
COLUMN2_ROW3
MOVLW 0xf ; f=#
GOTO ACTION?
GOTO ENDINTERRUPT0
;------------------------------------
COLUMN3_ROW0
MOVLW 0xa
MOVWF TYPE_PASS
MOVWF PORTA
GOTO STATE_TEST
GOTO ENDINTERRUPT0
COLUMN3_ROW1
MOVLW 0xb
MOVWF TYPE_PASS
MOVWF PORTA
GOTO STATE_TEST
GOTO ENDINTERRUPT0
COLUMN3_ROW2
MOVLW 0xc
MOVWF TYPE_PASS
MOVWF PORTA
GOTO STATE_TEST
GOTO ENDINTERRUPT0
COLUMN3_ROW3
MOVLW 0xd
MOVWF TYPE_PASS
MOVWF PORTA
GOTO STATE_TEST
GOTO ENDINTERRUPT0
;------------------------------------
STATE_TEST
BTFSS STATE,0
GOTO TEMP1 ;STATE IS ??0
GOTO TEMP2 ;STATE IS ??1
TEMP1
BTFSS STATE,1
GOTO TEMP3 ;STATE IS ?00
GOTO TEMP4 ;STATE IS ?10
TEMP2
BTFSS STATE,1
GOTO TEMP5 ;STATE IS ?01
GOTO TEMP6 ;STATE IS ?11
TEMP3
BTFSS STATE,2
GOTO TEST0 ;STATE IS 000
GOTO NEW_TEST0 ;STATE IS 100
TEMP4
BTFSS STATE,2
GOTO TEST2 ;STATE IS 010
GOTO NEW_TEST2 ;STATE IS 110
TEMP5
BTFSS STATE,2
GOTO TEST1 ;STATE IS 001
GOTO NEW_TEST1 ;STATE IS 101
TEMP6
BTFSS STATE,2
GOTO TEST3 ;STATE IS 011
GOTO NEW_TEST3 ;STATE IS 111
;---------------------------------------------------
TEST0
MOVWF TEST_PASS0
MOVF PASS0,0
XORWF TYPE_PASS,1 ;PASSTEST = ZERO IF MATCH
INCF TYPE_PASS,1 ;PASSTEST = ONE IF MATCH
DECFSZ TYPE_PASS,1
GOTO NOMATCH0
INCF STATE,1 ;MATCH!!
GOTO OUT0
NOMATCH0
CLRF STATE
GOTO OUT0
OUT0
CLRF TMR0
GOTO ENDINTERRUPT0
;---------------------------------------------------
TEST1
MOVWF TEST_PASS1
MOVF PASS1,0
XORWF TYPE_PASS,1 ;PASSTEST = ZERO IF MATCH
INCF TYPE_PASS,1 ;PASSTEST = ONE IF MATCH
DECFSZ TYPE_PASS,1
GOTO NOMATCH1
INCF STATE,1 ;MATCH!!
GOTO OUT1
NOMATCH1
CLRF STATE
GOTO OUT1
OUT1
CLRF TMR0
GOTO ENDINTERRUPT0
;---------------------------------------------------
TEST2
MOVWF TEST_PASS2
MOVF PASS2,0
XORWF TYPE_PASS,1 ;PASSTEST = ZERO IF MATCH
INCF TYPE_PASS,1 ;PASSTEST = ONE IF MATCH
DECFSZ TYPE_PASS,1
GOTO NOMATCH2
INCF STATE,1 ;MATCH!!
GOTO OUT2
NOMATCH2
CLRF STATE
GOTO OUT2
OUT2
CLRF TMR0
GOTO ENDINTERRUPT0
;---------------------------------------------------
TEST3
CLRF STATE
CLRF TMR0
GOTO ENDINTERRUPT0
;---------------------------------------------------------
;---------------------------------------------------
NEW_TEST0
BTFSS STATE,3
GOTO COPY0
MOVWF TEST_PASS0
MOVF NEW_PASS0,0
XORWF TYPE_PASS,1 ;PASSTEST = ZERO IF MATCH
INCF TYPE_PASS,1 ;PASSTEST = ONE IF MATCH
DECFSZ TYPE_PASS,1
GOTO NEW_NOMATCH0
INCF STATE,1 ;MATCH!!
GOTO NEW_OUT0
NEW_NOMATCH0
CLRF STATE
GOTO NEW_OUT0
COPY0
INCF STATE,1
MOVWF NEW_PASS0
NEW_OUT0
CLRF TMR0
GOTO ENDINTERRUPT0
;---------------------------------------------------
NEW_TEST1
BTFSS STATE,3
GOTO COPY1
MOVWF TEST_PASS1
MOVF NEW_PASS1,0
XORWF TYPE_PASS,1 ;PASSTEST = ZERO IF MATCH
INCF TYPE_PASS,1 ;PASSTEST = ONE IF MATCH
DECFSZ TYPE_PASS,1
GOTO NEW_NOMATCH1
INCF STATE,1 ;MATCH!!
GOTO NEW_OUT1
NEW_NOMATCH1
CLRF STATE
GOTO NEW_OUT1
COPY1
INCF STATE,1
MOVWF NEW_PASS1
NEW_OUT1
CLRF TMR0
GOTO ENDINTERRUPT0
;---------------------------------------------------
NEW_TEST2
BTFSS STATE,3
GOTO COPY2
MOVWF TEST_PASS2
MOVF NEW_PASS2,0
XORWF TYPE_PASS,1 ;PASSTEST = ZERO IF MATCH
INCF TYPE_PASS,1 ;PASSTEST = ONE IF MATCH
DECFSZ TYPE_PASS,1
GOTO NEW_NOMATCH2
INCF STATE,1 ;MATCH!!
GOTO NEW_OUT2
NEW_NOMATCH2
CLRF STATE
GOTO NEW_OUT2
COPY2
INCF STATE,1
MOVWF NEW_PASS2
NEW_OUT2
CLRF TMR0
GOTO ENDINTERRUPT0
;---------------------------------------------------
NEW_TEST3
CLRF STATE
CLRF TMR0
GOTO ENDINTERRUPT0
;---------------------------------------------------------
;---------------------------------------------------------
ACTION?
BTFSC STATE,0
GOTO MORETEST ;STATE IS ???1
GOTO EXIT
MORETEST
BTFSC STATE,1
GOTO MORETEST1 ;STATE IS ??11
GOTO EXIT
MORETEST1
BTFSC STATE,2
GOTO MORETEST2 ;STATE IS ?111
GOTO OPENTEST
MORETEST2
BTFSC STATE,3
GOTO CONFIRM_CHANGE;STATE IS 1111
GOTO EXIT
CONFIRM_CHANGE
MOVF NEW_PASS0,0
MOVWF PASS0
MOVF NEW_PASS0,1
MOVWF PASS1
MOVF NEW_PASS0,2
MOVWF PASS2
GOTO EXIT
OPENTEST
BTFSC STATE,3
GOTO EXIT ;STATE IS 1111
GOTO OPENDOOR
OPENDOOR
BSF PORTA,4
NOP
NOP
BCF PORTA,4
EXIT
CLRF STATE
GOTO ENDINTERRUPT0
;---------------------------------------------------------
;---------------------------------------------------------
CHANGEPASS?
BTFSC STATE,0
GOTO MORETST ;STATE IS ?1
GOTO EXT
MORETST
BTFSC STATE,1
GOTO TOCHANGE ;STATE IS 11
GOTO EXT
TOCHANGE
BTFSS STATE,2
GOTO FIRST
BSF STATE,3 ;SECOND TRIAL
GOTO EXT
FIRST
BSF STATE,2
EXT
BCF STATE,0
BCF STATE,1
GOTO ENDINTERRUPT0
;---------------------------------------------------------
;---------------------------------------------------------
ENDINTERRUPT0
BCF INTCON,T0IF
BCF INTCON,RBIF ;END INTERUPT SEQUENCE
CLRF PORTB
RETFIE
PRE_MAIN
CLRF PORTA
CLRF PORTB
CLRF TEST_PASS0
CLRF TEST_PASS1
CLRF TEST_PASS2
CLRF TYPE_PASS
CLRF STATE
CLRF PASS0
CLRF PASS1
CLRF PASS2
CLRF NEW_PASS0
CLRF NEW_PASS1
CLRF NEW_PASS2
CLRF NEW_STATE
CLRF TMR0
CLRF PBCPY
BSF STATUS,RP0 ;GOTO BANK 1
MOVLW B'00000000'
MOVWF TRISA
MOVLW B'11110000'
MOVWF TRISB
MOVLW B'01010000'
MOVWF OPTION_REG
BCF STATUS,RP0 ;GOTO BANK 0
MOVLW B'00101000'
MOVWF INTCON
BSF INTCON,7 ;SET GLOBAL INTERUPT
GOTO MAIN
MAIN
BCF PORTB,3
BSF PORTB,0
BCF PORTB,0
BSF PORTB,1
BCF PORTB,1
BSF PORTB,2
BCF PORTB,2
BSF PORTB,3
GOTO MAIN
;IN COMMENTS FOR TESTING
; BSF PORTB,3
;
; NOP;BSF PORTB,6
; BSF PORTB,3
;NOP
; NOP;BSF PORTB,5
; BSF PORTB,3
;NOP
; NOP;BCF PORTB,5
; BSF PORTB,3
;NOP
; NOP;BSF PORTB,7
;
; BCF PORTB,3
; BSF PORTB,2
;NOP
; NOP;BCF PORTB,7
; BSF PORTB,2
;NOP
; NOP;BSF PORTB,5
; BSF PORTB,2
;NOP
; NOP;BCF PORTB,5
; BSF PORTB,3
; BCF PORTB,2
;NOP
; NOP;BSF PORTB,7
;NOP
; BSF PORTB,2
; BCF PORTB,3
;
; NOP;BCF PORTB,7
; BSF PORTB,2
;NOP
; NOP;BSF PORTB,5
; BSF PORTB,2
;NOP
; NOP;BCF PORTB,5
;
; BCF PORTB,2
; BSF PORTB,3
;
; NOP;BSF PORTB,7
;NOP
END
;INTERRUPTS HAPPEN ON COLUMN STATE CHANGE. PORTA(4) IS THE OUTPUT TO DOOR
;TO CHANGE PASS, TYPE 000*111*111#
|