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

📄 secsys14.asm

📁 microchip KEELOQ source code.
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	MOVWF	DAT4

	INCF	ADDRESS,F			
	CALL	EE_READ1		; READ UPPER 16 BITS OF SERIAL NUMBER FROM EEPROM
	BSF	STATUS,PA0		; SELECT PAGE #1
	MOVLW	60H			; PATCH IF TRANSMITTER IS A HCS360 / HCS300
	BTFSC	FLAGS,NTQ106		
	MOVLW	65H			; PATCH IF TRANSMITTER IS A NTQ106 / NTQ105
	IORWF	TMP1,W
	MOVWF	DAT1
	MOVFW	TMP2			
	MOVWF	DAT2

	INCF	ADDRESS,F		; POINT TO UPPER 32 BITS OF KEY
	INCF	ADDRESS,F
	INCF	ADDRESS,F
	GOTO	KEYGEN			; GENERATE SECOND 32 KEY BITS

CALC_END
	BSF	FSR,5
	MOVFW	ETMP1			; RECOVER 32 BIT HOPCODE FROM EXTENDED BUFFER
	MOVWF	HOP1
	MOVFW	ETMP2
	MOVWF	HOP2
	MOVFW	ETMP3
	MOVWF	HOP3
	MOVFW	ETMP4
	MOVWF	HOP4
	BCF	FSR,5

	CLRF	CNT_HI			; RESET EVENT CLOCK
	CLRF	CNT_LW
	GOTO	M_HOP

;**************************************************************************
;
; FUNCTION     	: ERASE ()
;
; DESCRIPTION  	: ERASE ALL TRANSMITTERS
;
; PAGE		: 1
;
;**************************************************************************
ERASE         
	BSF	FLAGS1,S_RSTR		; FLAGS MUST BE RESTORED
	BSF	PORTB,LED		; SET LED ON
	
	MOVLW	1H			; POINT TO LEARN POINTER ADDRESS
	MOVWF	ADDRESS
	CALL	EE_CLEAR1		; 
	BSF	STATUS,PA0		; SELECT PAGE 1

	CLRF	TXNUM			; POINT TO FIRST TRANSMITTER POSISTION IN EEPROM
ERASE2
	CALL	TX_LOOKUP		; GET TX BASE ADRESS
	BSF	ADDRESS,1		; ADD 2 TO BASE ADDRESS

	CALL    EE_CLEAR1	        ; CLEAR LOWER 16 BITS OF SERIAL NUMBER
	BSF	STATUS,PA0		; SELECT PAGE 1
	CALL    EE_CLEAR1 	        ; CLEAR UPPER 16 BITS OF SERIAL NUMBER
	BSF	STATUS,PA0		; SELECT PAGE 1

	INCF	TXNUM,F			; POINT TO NEXT EEPROM INDEX
	MOVLW	6H			; TEST FOR LAST POSITION
	SUBWF	TXNUM,W
	BTFSS	STATUS,CARRY  		; IF NOT UPDATE NEXT ENTRY
	GOTO	ERASE2
  	BCF	PORTB,LED		; LED OFF TO INDICATE ERASE ALL COMPLETE

M_ERASE3
	CLRWDT				; RESET WATCHDOG TIMER
	BTFSC	PORTC,LEARN		; WAIT FOR BUTTON LIFT
	GOTO	M_ERASE3	 
	GOTO	M_LOOP			; RETURN TO MAIN PROGRAM FLOW

;**************************************************************************
;
; FUNCTION     	: READ_KEY ()	      			
;
; DESCRIPTION  	: READ 64 BIT KEY FROM EEPROM [CSR0:CSR7] 
;
; PAGE		: 1
;
;**************************************************************************
READ_KEY
	MOVLW	3H			; POINT TO MSB OF KEY
	ADDWF	ADDRESS,1	

	MOVLW	KEY7			; POINT TO LSB OF 64 BIT SHIFT REGISTER
	MOVWF	FSR	
	MOVLW	3H			; READ 3 x 16BIT VALUES FROM EEPROM
	MOVWF	CNT2

READ_KEY2
	CALL	EE_READ1		; READ LOWER 16 BITS
	BSF	STATUS,PA0		; SELECT PAGE #1
	MOVFW	TMP1			; GET UPPER 8 BITS
	MOVWF	IND			; STORE FIRST 8 BITS IN 64 BIT SHIFT REGISTER
	DECF	FSR,F			; POINT TO NEXT BYTE IN SHIFT REGISTER
	MOVFW	TMP2			; GET LOWER 8 BITS
	MOVWF	IND			; STORE SECOND 8 BITS IN 64 BIT SHIFT REGISTER
	DECF	FSR,F			; POINT TO NEXT BYTE IN SHIFT REGISTER
	DECF	ADDRESS			; POINT TO NEXT EEPROM ADDRESS
	DECFSZ	CNT2,F			; ALL THREE 16-BIT WORDS READ
	GOTO	READ_KEY2		; ... IF NOT GET NEXT 

	CALL	EE_READ1		; READ LOWER 16 BITS
	BSF	STATUS,PA0		; SELECT PAGE #1
	GOTO	M_DEC			; RETURN TO MAIN PROGRAM LOOP

;**************************************************************************
;
; FUNCTION     	: MAIN ()	      			
;
; DESCRIPTION  	: MAIN PROGRAM ROUTINE
;
; PAGE		: 1
;
;**************************************************************************

RESET_P1
	CLRF	FSR			; POINT TO RAM PAGE 0		

	CLRF	PORTA			; RESET PORTA
	CLRF	PORTB			; RESET PORTB
	CLRF	PORTC			; RESET PORTC

	MOVLW	TRISA			; UPDATE TRI-STATE REGISTER FOR PORTA
	TRIS	PORTA
	MOVLW	TRISB			; UPDATE TRI-STATE REGISTER FOR PORTB
	TRIS 	PORTB
	MOVLW	TRISC			; UPDATE TRI-STATE REGISTER FOR PORTC
	TRIS 	PORTC

	CLRF	FLAGS			; RESET FLAGS
	CLRF	FLAGS1			; RESET FLAGS

	BSF	FLAGS1,ENTRY		; SET ENTRY FLAG

MAIN
	BSF	FLAGS,NORMAL		; INDICATE NORMAL PROGRAM FLOW
	BCF	FLAGS,PASS1
	BCF	FLAGS,PASS2

	MOVLW	LRN_PTR			; POINT LEARN POINTER
	MOVWF	ADDRESS		     
	CALL	EE_READ1		; READ LEARN POINTER WORD
	BSF	STATUS,PA0		; SELECT PAGE #1

        BTFSS   TMP1,0
        GOTO    MAIN2			; UPPER BIT OF SELFLEARN NIBBLE MUST BE ZERO

	SWAPF	TMP2,W			; RECOVER PREVIOUS TX NUMBER
	ANDLW	07H			; MASK ONLY LOWER 3 BITS

	CLRF	TMP1			; RESET SELFLEARN POINTER 
	MOVWF	TXNUM			; ... TO CURRENT TXNUM
	MOVWF	TMP2

	MOVLW	LRN_PTR			; WRITE LEARN POINTER
	MOVWF	ADDRESS
	CALL	EE_WRITE1		; UPDATE EEPROM
	BCF	STATUS,PA0
	GOTO	WIPE_TX1 		; WIPE TRANSMITTER ( SELFLEARN UNSUCCESFUL )

MAIN2

	BCF	FLAGS1,ENTRY		; CLEAR ENTRY FLAG	
	

MAIN3	
	MOVLW	SSTATUS			; POINT STATUS
	MOVWF	ADDRESS
	CALL	EE_READ1		; READ STATUS
	BSF	STATUS,PA0		; SELECT PAGE #1

	MOVLW	X2			; CHECK FOR VALID STATUS WRITE
	XORWF	TMP2,W
	BTFSC	STATUS,ZERO
	GOTO	MAIN4			; VALID STATUS  

	; HERE IF STATUS NOT VALID

	MOVLW	BSTATUS			; POINT TO BACKUP COPY
	MOVWF	ADDRESS
	CALL	EE_READ1
	BSF	STATUS,PA0		; READ BACKUP STATUS COPY

	MOVLW	X1
	XORWF	TMP2,W			; CHECK FOR VALID WRITE
	BTFSC	STATUS,ZERO
	GOTO	MAIN4			; VALID BACKUP STATUS

	; HERE IF BACKUP ALSO CORRUPTED

	BCF	STATUS,PA0		; GOTO ARMED STATE
	BSF	STATUS,PA1
	GOTO	ARMED			; 

MAIN4
	MOVLW	DRIVES
	XORWF	TMP1,W
       	BTFSS  	STATUS,ZERO
       	GOTO  	MAIN5
	BCF	STATUS,PA0
	BSF	STATUS,PA1
	GOTO	DRIVE

MAIN5
	MOVLW	ALARMS
	XORWF	TMP1,W
	BTFSS  	STATUS,ZERO
       	GOTO  	MAIN6
	BCF	STATUS,PA0
	BSF	STATUS,PA1
	GOTO	ALARM

MAIN6
	MOVLW	IMMOBS
	XORWF	TMP1,W
	BTFSS  	STATUS,ZERO
       	GOTO  	MAIN7
	BCF	STATUS,PA0
	BSF	STATUS,PA1
	GOTO	IMMOB

MAIN7
	BCF	STATUS,PA0
	BSF	STATUS,PA1
	GOTO	ARMED
	
M_CHECK	
	BCF	STATUS,PA0		; CLEAR PAGE BIT #0
	CALL	TST_LEARN		; TEST & HANDLE LEARN BUTTON
	CALL	RECEIVE			; RECEIVE TRANSMISSION 
	BSF	STATUS,PA0		; SET PAGE BIT #0

       	BTFSS 	STATUS,CARRY
       	GOTO  	M_ZERO
M_LOOP
	BCF	STATUS,PA0
	BSF	STATUS,PA1	
	MOVLW	2
	ADDWF  	STACK,W
	BSF	STATUS,CARRY
       	MOVWF	PC

M_ZERO	
  	MOVLW	0FH			; MAXIMUM SERIAL NUMBER IS 28 BITS
	ANDWF	SER_0,1

	MOVFW	SER_0			; CHECK SERIAL NUMBER NOT EQUAL TO ZERO
	IORWF	SER_1,W
	IORWF	SER_2,W
	IORWF	SER_3,W
	BTFSC	STATUS,ZERO
	GOTO	M_LOOP			; ... IF ZERO WAIT FOR NEXT TRANSMISSION

        BTFSS   FLAGS,PASS2		; IF ON SECOND LEARNING PASS TXNUM IS LEARNING POSITION
	CLRF	TXNUM			; ... ELSE POINT TO FIRST TRANSMITTER

; ******* COMPARE LOWER WORD OF SERIAL NUMBER ********
M_SERIAL
	CALL	TX_LOOKUP		; GET TX BASE ADDRESS
	BSF	ADDRESS,1		; ADD 2 TO BASE ADDRESS
	CALL	EE_READ1		; READ LOWER 16-BITS OF SERIAL NUMBER FROM EEPROM
	BSF	STATUS,PA0		; SELECT PAGE #1
  
	MOVFW	TMP1			; COMPARE RX AND EEPROM VALUES
	XORWF	SER_2,W
	BTFSS	STATUS,ZERO  		; ... IF NOT EQUAL DO ERROR
	GOTO	M_SER_ERR
	MOVFW	TMP2			; COMPARE RX AND EEPROM VALUES
	XORWF	SER_3,W
	BTFSS	STATUS,ZERO 		; ... IF NOT EQUAL DO ERROR
	GOTO	M_SER_ERR
	
; ******* COMPARE UPPER WORD OF SERIAL NUMBER ********
M_SERIAL2
	INCF	ADDRESS,F		; POINT TO NEXT ENTRY 
	CALL	EE_READ1		; READ UPPER 16-BITS OF SERIAL NUMBER FROM EEPROM
	BSF	STATUS,PA0		; SELECT PAGE #1

	MOVFW	TMP1			; COMPARE RX AND EEPROM VALUES
	XORWF	SER_0,W
	BTFSS	STATUS,ZERO 		; ... IF NOT EQUAL DO ERROR
	GOTO	M_SER_ERR

	MOVFW	TMP2			; COMPARE RX AND EEPROM VALUES
	XORWF	SER_1,W
	BTFSS	STATUS,ZERO 		; ... IF NOT EQUAL DO ERROR
	GOTO	M_SER_ERR
	
; ************* TEST IF LEARN ACTIVE ****************
M_PASS	
        BTFSC   FLAGS,PASS1
        GOTO    CALC_KEY		; TEST IF ON FIRST PASS OF LEARN
	GOTO	M_HOP			; TEST FOR NORMAL PROGRAM FLOW

; ******** SERIAL NUMBER COMPARE ERROR FOUND ***********
M_SER_ERR

; **** SEARCH NEXT POSITION FOR SERIAL NUMBER *****
M_NEXT	INCF	TXNUM,F			; POINT TO NEXT TRANSMITTER POSITION
	MOVLW	6H			; TEST FOR LAST POSITION
	SUBWF	TXNUM,W
	BTFSS	STATUS,CARRY	   	; ... IF NOT GET NEXT ENTRY
	GOTO	M_SERIAL

; **** SERIAL NUMBER NOT FOUND ( ONLY IN NORMAL / PASS1 ) **********

        BTFSC   FLAGS,PASS1
        GOTO    M_NF			; TEST IF ON FIRST PASS OF SELFLEARN
        BTFSS   FLAGS,PASS2
        GOTO    M_LOOP			; CHECK IF IN SECOND STATE OF LEARN
	GOTO	MAIN

; *** IF SERIAL NOT IN MAP READ SELFLEARN POINTER ***
M_NF	MOVLW	LRN_PTR			; POINT TO LEARN POINTER
	MOVWF	ADDRESS
	CALL	EE_READ1		; READ LEARN POINTER FROM EEPROM
	BSF	STATUS,PA0		; SELECT PAGE #1

	MOVLW	07H			; MASK TXNUM FROM POINTER
	ANDWF	TMP2,W
	MOVWF	TXNUM

	BTFSS	TXNUM,2			; TXNUM < 4 IS VALID
	GOTO	CALC_KEY		; ... YES, GENERATE DECRYPTION KEY

	BTFSC	TXNUM,1			; TXNUM > 5 IS INVALID
	CLRF	TXNUM			; ... LEARN POSITION SET TO ZERO
  	GOTO	CALC_KEY		; LEARN CURRENT RECEIVED TRANSMITTER

; ********** DECRYPT HOPCODE *********************
M_HOP	
	CALL	TX_LOOKUP		; LOOK UP TRANSMITTER BASE ADDRESS
	BSF	ADDRESS,2		; ADD 4 TO BASE ADDRESS

	GOTO	READ_KEY		; READ 64 BIT DECODER KEY ( CALL "READ_KEY")
M_DEC	
	BCF	STATUS,PA0		; SELECT PAGE #0
	CALL	DECRYPT			; DECRYPT HOPCODE 
	BSF	STATUS,PA0		; RE-SELECT PAGE #1

        BTFSS   FLAGS,PASS1
        GOTO    M_DIS			; TEST IF ON FIRST PASS OF SELFLEARN

; ********* UPDATE BUTTON CODE AND DISCR VALUE AFTER SELFLEARN **********
M_SL_UPDATE
	MOVLW	LRN_PTR			; POINT LEARN POINTER
	MOVWF	ADDRESS
	CALL	EE_READ1		; READ LEARN POINTER FROM EEPROM
	BSF	STATUS,PA0		; SELECT PAGE #1

	MOVLW	1H			; INDICATE LEARN ACTIVE IN EEPROM
	MOVWF	TMP1			

	MOVLW	0FH			; MASK LEARN POINTER
	ANDWF	TMP2,1
	MOVLW	6H			; TEST FOR INVALID LEARN POINTER
	SUBWF	TMP2,W			; TEST FOR INVALID LEARN POINTER
	BTFSC	STATUS,CARRY  		; TEST FOR INVALID LEARN POINTER
	CLRF	TMP2			; ... IF INVALID POINT TO FIRST POSITION

	SWAPF	TXNUM,W			; COPY TXNUM INTO UPPER NIBBLE
	IORWF	TMP2,1

	CALL	EE_WRITE1		; UPDATE LEARN POINTER IN EEPROM
	BSF	STATUS,PA0		; RE-SELECT PAGE #1

	CALL	BUT_LOOKUP		; GET BUTTON CODE BASE ADDRESS
	MOVWF	ADDRESS
	
	MOVFW	FUNC			; GET CURRENT RX BUTTON CODE
	MOVWF	TMP1
	MOVFW	CODE			; GET CURRENT RX DISCR CODE
	MOVWF	TMP2

	CALL	EE_WRITE1		; ... AND WRITE BUTTON & DISCR CODES TO EEPROM
	BSF	STATUS,PA0		; RE-SELECT PAGE #1

	MOVFW	CNTR_HI			; STORE ONE RX COUNTER 
	MOVWF	TMP1
	MOVFW	CNTR_LW
	MOVWF	TMP2

	CALL	TX_LOOKUP		; POINT TO LSB WORD OF SERIAL NUMBER
	CALL	EE_WRITE1		; WRITE ONE 16-BIT COUNTER TO EEPROM
	BSF	STATUS,PA0		; RE-SELECT PAGE #1

  	BCF	PORTB,LED		; LED OFF TO INDICATE FIRST VALID TRANSMISSION RECEIVED
	BSF	FLAGS,PASS2		; INDICATE PASS2 OF LEARN NOW ACTIVE
	BCF	FLAGS,PASS1		; INDICATE PASS2 OF LEARN NOW ACTIVE
	BCF	FLAGS,NORMAL		; CLEAR NORMAL MODE
	GOTO	M_RESYNC		; FORCE A COUNTER RESYNC

; ********* TEST DICRIMINATION VALUE *************
M_DIS
	CALL	BUT_LOOKUP		; POINT TO BUTTON CODE ADDRESS
	MOVWF	ADDRESS			; STORE VALUE IN ADDRESS REGISTER
	CALL	EE_READ1
	BSF	STATUS,PA0		; SELECT PAGE #1

        BTFSS   FLAGS,PASS2
        GOTO    M_DIS2			; CHECK IF IN SECOND PASS OF LEARN
	MOVFW	TMP1			; CHECK DISC VALUE
	XORWF	FUNC,W
	ANDLW	0F0H			; MASK BUTTON CODES
	BTFSC 	STATUS,ZERO 
	GOTO  	M_DIS2			; IF EQUAL CONTINUE
	GOTO	MAIN

M_DIS2
	MOVFW	TMP2			; CHECK DISCRIMINATION VALUE 
	XORWF	CODE,W
	BTFSC	STATUS,ZERO		; IF EQUAL CONTINUE
	GOTO	M_CNT

	BCF	FLAGS,RESYNC		; RESET RESYNC FLAG

        BTFSS   FLAGS,PASS2
        GOTO    M_LOOP	      		; TEST IF IN SECOND PASS OF LEARN 
	GOTO	MAIN

; *************** CHECK COUNTERS VALID ************
M_CNT
	BTFSS	FLAGS,RESYNC		; TEST RESYNC BIT
	GOTO	M_CNT1			; ... IF NOT GET COUNTERS FROM EEPROM

	MOVLW	TMPCNT
	MOVWF	ADDRESS
	CALL	EE_READ1
	BSF	STATUS,PA0		; SELECT PAGE #1
	GOTO	M_SUB			; SUBSTRACT FROM CURRENT COUNTER

M_CNT1
	CALL	TX_LOOKUP		; POINT LOWER 16 BIT COUNTER
	CALL	EE_READ1		; READ LOWER 16 BIT COUNTER FROM EEPROM
	BSF	STATUS,PA0		; SELECT PAGE #1

	MOVFW	TMP1			; TEMPORY STORE FIRST 16-BIT COUNTER
	MOVWF	TMP3
	MOVFW	TMP2
	MOVWF	TMP4

	INCF	ADDRESS,F		; POINT TO UPPER 16-BIT COUNTER
	CALL	EE_READ1		; READ UPPER 16-BIT COUNTER FROM EEPROM
	BSF	STATUS,PA0		; SELECT PAGE #1

	MOVFW	TMP1			; COMPARE UPPER BYTES OF EEPROM COUNTER
	XORWF	TMP3,W
	BTFSS	STATUS,ZERO  		; ... IF EQUAL COMPARE LOWER
	GOTO	M_CNT3			; ... IF NOT EQUAL FORCE RESYNC

	MOVFW	TMP2			; COMPARE LOWER BYTES OF EEPROM COUNTER

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -