⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 secsys14.asm

📁 microchip KEELOQ source code.
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	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 + -