📄 secsys14.asm
字号:
XORWF TMP4,W
BTFSC STATUS,ZERO ; ... IF NOT EQUAL FORCE RESYNC
GOTO M_SUB ; ... ELSE SUBSTRACT FROM RECEIVED COUNTER VALUE
M_CNT3 GOTO M_RESYNC ; FORCE RESYNC ( EEPROM COUNTERS INVALID )
; ************ CHECK COUNTER WINDOWS ***********
M_SUB
MOVFW TMP2 ; 16 BIT COUNTER SUBSTRACTION
SUBWF CNTR_LW,W
MOVWF TMP2
BTFSS STATUS,CARRY ; SKIP IF NO BORROW
INCF TMP1,F ; ... ELSE INCR HI BYTE
MOVFW TMP1
SUBWF CNTR_HI,W
MOVWF TMP1
MOVFW TMP1 ; CHECK FOR REPEATED CODES [ COUNTER INC = 0 ]
IORWF TMP2,W
BTFSS STATUS,ZERO
GOTO M_CHECK0 ; ... IF NOT EQUAL CONTINUE
BSF FSR,5 ; SELECT BANK 1
CLRF CNT1_LW ; RESET REPEAT DEBOUNCE TIMER
BCF FSR,5 ; SELECT BANK 0
GOTO M_LOOP
M_CHECK0
BTFSS FLAGS,RESYNC ; TEST IF RESYNC ACTIVE
GOTO M_CHECK1 ; ... IF NOT CHECK FOR COUNTER VALID
BCF FLAGS,RESYNC ; RESET RESYNC FLAG
MOVFW TMP1 ; TEST IF IN 4 WINDOW ( UPPER BYTE )
BTFSS STATUS,ZERO ; ....ELSE ABORT
GOTO M_CNT_FAIL
MOVLW 0FCH ; TEST IF IN 4 WINDOW ( LOWER BYTE )
ANDWF TMP2,W
BTFSC STATUS,ZERO ; ... IF NOT EQUAL COUNTER INVALID
GOTO M_UPDATE ; ... ELSE COUNTER VALID, UPDATE EEPROM COUNTERS
M_CNT_FAIL
BTFSS FLAGS,PASS2
GOTO M_LOOP ; TEST IF ON SECOND PASS OF LEARN
GOTO MAIN
M_CHECK1
BTFSC TMP1,7 ; TEST IF IN DARK REGION ( > 7FFF )
GOTO M_LOOP ; ... IF SO IGNORE TRANSMISSION
MOVFW TMP1 ; TEST FOR RESYNC REQUIRED
BTFSS STATUS,ZERO
GOTO M_RESYNC ; DIFFERENCE > 256, FORCE RESYNC
MOVFW TMP2 ; 16 BIT COUNTER ZERO
BTFSC STATUS,ZERO ;
GOTO M_LOOP ; COUNTERS EQUAL, IGNORE TRANSMISSION
M_CHECK2
MOVLW 0F0H ; TEST IF IN 16 WINDOW
ANDWF TMP2,W
BTFSC STATUS,ZERO ; ... IF NOT VALID FORCE COUNTER RESYNC
GOTO M_UPDATE ; ... ELSE UPDATE EEPROM COUNTERS
M_RESYNC
BSF FLAGS,RESYNC ; INDICATE RESYNC REQUIRED
MOVFW CNTR_HI ; STORE CURRENT RECEIVED 16-BIT COUNTER
MOVWF TMP1
MOVFW CNTR_LW
MOVWF TMP2
MOVLW TMPCNT
MOVWF ADDRESS
CALL EE_WRITE1 ; WRITE TEMPORARY COUNTER
BSF STATUS,PA0 ; RE-SELECT PAGE #1
GOTO M_LOOP ; WAIT FOR NEXT TRANSMISSION
; ************ UPDATE EEPROM COUNTER ***********
M_UPDATE
CALL TX_LOOKUP ; GET CURRENT TX BASE ADDRESS
MOVFW CNTR_HI ; STORE FIRST 16-BIT RECEIVE COUNTER
MOVWF TMP1
MOVFW CNTR_LW
MOVWF TMP2
CALL EE_WRITE1 ; WRITE LSB WORD OF SERIAL NUMBER TO EEPROM
BSF STATUS,PA0 ; RE-SELECT PAGE #1
MOVFW CNTR_HI ; STORE SECOND 16-BIT RECEIVED COUNTER
MOVWF TMP1
MOVFW CNTR_LW
MOVWF TMP2
CALL EE_WRITE1 ; WRITE MSB WORD OF SERIAL NUMBER TO EEPROM
BSF STATUS,PA0 ; RE-SELECT PAGE #1
BTFSC FLAGS,NORMAL
GOTO M_BUT ; TEST FOR NORMAL PROGRAM FLOW
BTFSC FLAGS,PASS1
GOTO M_LOOP ; TEST FIRST PASS
; ********** MAYBE UPDATE LEARN POINTER AFTER VALID SELFLEARN *********
M_PTR
MOVLW LRN_PTR ; POINT TO LEARN POINTER
MOVWF ADDRESS
CALL EE_READ1 ; READ LEARN POINTER FROM EEPROM
BSF STATUS,PA0 ; SELECT PAGE #1
MOVFW TMP2 ; MASK LEARN POINTER
ANDLW 07H ; ... STORE RESULT IN W REGISTER
MOVWF TMP2 ; ... AND TMP2 REGISTER
XORWF TXNUM,W ; LEARNING EXISTING OR NEW TRANSMITTER
BTFSC STATUS,ZERO ; ... TXNUM EQUAL LEARN POINTER FOR NEW TRANSMITTER
INCF TMP2,F ; ... IF NEW TRANSMITTER INCREMENT LEARN POINTER
MOVLW 6H ; TEST FOR LAST POSITION
SUBWF TMP2,W ; TEST FOR LAST POSITION
BTFSC STATUS,CARRY ; TEST FOR LAST POSITION
CLRF TMP2 ; ... IF LAST POSITION POINT TO FIRST POSITION
CLRF TMP1 ; ALWAYS CLEAR UPPER BYTE OF LEARN POINTER
MOVLW LRN_PTR ; POINT TO LEARN POINTER
MOVWF ADDRESS
CALL EE_WRITE1 ; WRITE LEARN POINTER TO EEPROM
BSF STATUS,PA0 ; RE-SELECT PAGE #1
BCF STATUS,PA0 ; SELECT PAGE #0
GOTO LEARN_OK ; THEN INDICATE LEARN SUCCESSFUL
M_BUT
BCF STATUS,PA0 ; CLEAR PAGE BIT #0
BSF STATUS,PA1 ; SET PAGE BIT #1
GOTO M_TEST
;**************************************************************************
; PAGE 2:
;**************************************************************************
ORG 400H
;**************************************************************************
; CALLS TO PAGE 0
;**************************************************************************
EE_WRITE2
BCF STATUS,PA1 ; SELECT PAGE #0
GOTO EEWRITE ; CALL EEPROM WRITE ROUTINE
;**************************************************************************
;
; FUNCTION : WAIT ()
;
; DESCRIPTION : WAIT FOR CNT1 TIMES 1 MS
; CNT2 = OSC/[4*6*1000] [ 1MS ]
;
; PAGE : 2
;
;**************************************************************************
WAIT50
MOVLW 50D ; DELAY COUNTER FOR 50 MS
MOVWF CNT1
GOTO WAIT
WAIT250
MOVLW 250D ; DELAY COUNTER FOR 250 MS
MOVWF CNT1
WAIT
MOVLW 200D ; DELAY COUNTER FOR 1 MS
MOVWF CNT2
WAIT1
NOP ; [1] WASTE TIME
CLRWDT ; [1]
DECFSZ CNT2,F ; [1]
GOTO WAIT1 ; [2]
DECFSZ CNT1,F ; [1]
GOTO WAIT ; [2]
RETLW 0
;**************************************************************************
;
; FUNCTION : ARMED ()
;
; DESCRIPTION : ARMED STATE, CHECK TRIGGER INPUTS AND REMOTE
;
; PAGE : 2
;
;**************************************************************************
ARMED
BSF PORTB,SIREN ; CHIRP SIREN 50 MS
BSF PORTB,PLIGHT ; FLASH PARKING LIGHT 50 MS
CALL WAIT50
BCF PORTB,SIREN ; SIREN OFF
BCF PORTB,PLIGHT ; PARKING LIGHT OFF
BSF PORTB,LOCK ; LOCK DOORS 500 MS
CALL WAIT250
CALL WAIT250
BCF PORTB,LOCK ; LOCK DOORS 500 MS
ARMED3
BSF FSR,5 ; SELECT BANK 0
MOVLW 25 ; COMPENSATE FOR DOOR LOCK TIME
MOVWF CNT2_LW
BCF FSR,5 ; SELECT BANK 0
BSF FLAGS,LFLASH ; SET LED FLASH MODE
BCF FLAGS,PFLASH ; CLEAR PLIGHT FLASH MODE
BCF PORTB,SIREN ; SIREN OFF
BCF PORTB,IMMO ; DISABLE START
MOVLW BSTATUS ; POINT TO BACKUP STATUS
MOVWF ADDRESS
MOVLW ARMEDS
MOVWF TMP1
MOVLW X1
MOVWF TMP2
CALL EE_WRITE2 ; UPDATE STATUS
BSF STATUS,PA1 ; SELECT PAGE #2
MOVLW SSTATUS ; POINT STATUS
MOVWF ADDRESS
MOVLW ARMEDS
MOVWF TMP1
MOVLW X2
MOVWF TMP2
CALL EE_WRITE2 ; UPDATE STATUS
BSF STATUS,PA1 ; SELECT PAGE #2
MOVLW ARMEDS
MOVWF RAMS ; UPDATE RAM STATE
ARMED4
BTFSS FLAGS1,S_RSTR ; WAS THERE A UNSUCCESSFUL LEARN
GOTO ARMED5 ; NO, CONTINUE
BSF FLAGS,LFLASH ; SET LED FLASH MODE
BCF FLAGS1,S_RSTR ; RESET LEARN TIMEOUT FLAG
ARMED5
BTFSC PORTC,DOOR
GOTO ALARM ; CHECK IF DOOR OPEN
BTFSC PORTC,TRIG
GOTO ALARM ; CHECK IF SHOCK SENSOR TRIGGERED
BTFSC PORTC,IGN
GOTO ALARM ; CHECK IF IGNITION TAMPER
MOVF PC,W
MOVWF STACK
GOTO REMOTE ; CALL RF CHECK ROUTINE
BTFSC STATUS,CARRY
GOTO ARMED4 ; CHECK IF TRANSMISSION VALID
MOVLW 01H
XORWF FUNC,W
BTFSC STATUS,ZERO ; IF FUNCTION 1 CODE
GOTO DRIVE ; GOTO DRIVE MODE
GOTO ARMED4 ; ELSE STAY IN ARMED MODE
;**************************************************************************
;
; FUNCTION : DRIVE ()
;
; DESCRIPTION : DRIVE STATE, UNLOCK DOORS, CHIRP SIREN 2 TIMES,
; ENABLE START
;
; PAGE : 2
;
;**************************************************************************
DRIVE
BSF PORTB,SIREN ; CHIRP SIREN 50 MS
BSF PORTB,PLIGHT ; FLASH PARKING LIGHT 50 MS
CALL WAIT50
BCF PORTB,SIREN ; SIREN OFF
BCF PORTB,PLIGHT ; PARKING LIGHT OFF
BSF PORTB,UNLOCK ; UNLOCK DOORS 500 MS
CALL WAIT250
CALL WAIT250
BCF PORTB,UNLOCK ; UNLOCK DOORS 500 MS
BSF PORTB,SIREN ; CHIRP SIREN 50 MS
BSF PORTB,PLIGHT ; FLASH PARKING LIGHT 50 MS
CALL WAIT50
BCF PORTB,SIREN ; SIREN OFF
BCF PORTB,PLIGHT ; PARKING LIGHT OFF
BSF FSR,5 ; SELECT BANK 0
MOVLW 25D ; COMPENSATE FOR DOOR UNLOCK TIME
MOVWF CNT2_LW
BCF FSR,5 ; SELECT BANK 0
DRIVE4
BCF FLAGS,LFLASH ; CLEAR LED FLASH MODE
BCF FLAGS,PFLASH ; CLEAR PLIGHT FLASH MODE
BSF PORTB,IMMO ; ENABLE START
BCF PORTB,LED ; LED OFF
MOVLW BSTATUS ; POINT TO BACKUP STATUS
MOVWF ADDRESS
MOVLW DRIVES
MOVWF TMP1
MOVLW X1
MOVWF TMP2
CALL EE_WRITE2 ; UPDATE STATUS
BSF STATUS,PA1 ; SELECT PAGE #2
MOVLW SSTATUS ; POINT STATUS
MOVWF ADDRESS
MOVLW DRIVES
MOVWF TMP1
MOVLW X2
MOVWF TMP2
CALL EE_WRITE2 ; UPDATE STATUS
BSF STATUS,PA1 ; SELECT PAGE #2
MOVLW DRIVES
MOVWF RAMS ; UPDATE RAM STATE
DRIVE5
CLRF CNT_HI ; RESET RTCC CLOCK
CLRF CNT_LW
DRIVE6
BTFSS FLAGS1,S_RSTR ; WAS THERE A UNSUCCESSFUL LEARN
GOTO DRIVE61 ; NO, CONTINUE
BCF PORTB,LED ; SET LED FLASH MODE
BCF FLAGS1,S_RSTR ; RESET LEARN TIMEOUT FLAG
DRIVE61
BTFSC PORTC,IGN
GOTO DRIVE7 ; CHECK IF IGNITION ON
BTFSC CNT_HI,2
GOTO IMMOB ; TEST FOR IMMOBILIZE TIMEOUT 30S
MOVF PC,W
MOVWF STACK
GOTO REMOTE ; CALL RECEIVE ROUTINE
BTFSC STATUS,CARRY
GOTO DRIVE6 ; CHECK IF TRANSMISSION VALID
MOVLW 01H
XORWF FUNC,W
BTFSC STATUS,ZERO ; FUNCTION = 1?
GOTO ARMED ; ... YES, GOTO ARMED MODE
GOTO DRIVE6 ; ... NO, STAY IN DRIVE MODE
DRIVE7
BTFSS FLAGS1,S_RSTR ; WAS THERE A UNSUCCESSFUL LEARN
GOTO DRIVE71 ; NO, CONTINUE
BCF PORTB,LED ; SET LED FLASH MODE
BCF FLAGS1,S_RSTR ; RESET LEARN TIMEOUT FLAG
DRIVE71
BTFSS PORTC,IGN
GOTO DRIVE5 ; CHECK IF IGNITION OFF
MOVF PC,W
MOVWF STACK
GOTO REMOTE ; CHECK FOR VALID TRANSMISSIONS
BTFSC STATUS,CARRY
GOTO DRIVE7 ; CHECK IF TRANSMISSION VALID
MOVLW 01H
XORWF FUNC,W
BTFSS STATUS,ZERO ; FUNCTION 1 CODE?
GOTO DRIVE7 ; ... NO, STAY IN DRIVE
DRIVE8 ; ... YES REDO OUTPUTS
BSF PORTB,IMMO ; AND WAIT FOR IGN = OFF
BCF PORTB,LED
GOTO DRIVE7
;**************************************************************************
;
; FUNCTION : IMMOB ()
;
; DESCRIPTION : IMMOB STATE - DISABLE START
;
; PAGE : 2
;
;**************************************************************************
IMMOB
BSF PORTB,LED ; LED ON
BCF PORTB,PLIGHT ; PLIGHT OFF
BCF PORTB,IMMO ; DISABLE START
IMMOB1
MOVLW BSTATUS ; POINT TO BACKUP STATUS
MOVWF ADDRESS
MOVLW IMMOBS
MOVWF TMP1
MOVLW X1
MOVWF TMP2
CALL EE_WRITE2 ; UPDATE STATUS
BSF STATUS,PA1 ; SELECT PAGE #2
MOVLW SSTATUS ; POINT STATUS
MOVWF ADDRESS
MOVLW IMMOBS
MOVWF TMP1
MOVLW X2
MOVWF TMP2
CALL EE_WRITE2 ; UPDATE STATUS
BSF STATUS,PA1 ; SELECT PAGE #2
MOVLW IMMOBS
MOVWF RAMS ; UPDATE RAM STATE
IMMOB2
BTFSS FLAGS1,S_RSTR ; WAS THERE A UNSUCCESSFUL LEARN
GOTO IMMOB3 ; NO, CONTINUE
BSF PORTB,LED ; SET LED ON
BCF FLAGS1,S_RSTR ; RESET LEARN TIMEOUT FLAG
IMMOB3
MOVF PC,W
MOVWF STACK
GOTO REMOTE ; RF CHECK ROUTINE
BTFSC STATUS,CARRY
GOTO IMMOB2 ; CHECK IF TRANSMISSION VALID
MOVLW 01H
XORWF FUNC,W
BTFSS STATUS,ZERO ; FUNCTION 1 CODE?
GOTO IMMOB2 ; ... NO, STAY IN IMMOB MODE
BTFSC PORTC,IGN ; IGN ON?
GOTO DRIVE4 ; ... YES, GOTO DRIVE MODE
GOTO ARMED ; ... N
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -