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

📄 secsys14.asm

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

TST_LEARN5

        BTFSC   FLAGS,PASS1
        GOTO    TST_LEARN7		; ALREADY IN LEARN

	MOVLW	2
	SUBWF	CNT_LW,W

       	BTFSC 	STATUS,CARRY
       	GOTO  	TST_LEARN6		; TEST IF LEARN PRESS LONGER THAN 64 MS

	MOVLW	ARMEDS			; CHECK IF IN ARMED STATE
	XORWF	RAMS,W
	BTFSC  	STATUS,ZERO		; ... NO,  CONTINUE
	BSF	FLAGS,LFLASH		; RESET FLASH FLAG

  	BCF	PORTB,LED
	RETLW	0			; ... IF NOT ABORT LEARN

TST_LEARN6
	BSF	FLAGS,PASS1		; INDICATE FIRST STATE OF LEARN
	BCF	FLAGS,NORMAL		; INDICATE FIRST STATE OF LEARN
	BCF	FLAGS,PASS2
	BCF	FLAGS1,S_RSTR		; FLAGS MUST NOT BE RESTORED

TST_LEARN7
	BSF	PORTB,LED		; LED ON TO INDICATE LEARN ACTIVATED
	RETLW	0H

;**************************************************************************
;
; FUNCTION     	: SENDC ()	      			
;

; DESCRIPTION  	: SEND EEPROM COMMAND 
;
; PAGE		: 0
;
;**************************************************************************
SENDC1
	CLRWDT				; RESET WATCHDOG TIMER

        BCF     PORTA,CS                ; RESET CS STATE
        BCF     PORTA,CLK               ; RESET CLK STATE
        BCF     PORTA,DIO               ; RESET DIO STATE

        MOVLW   WRCFG
        TRIS    PORTA                   ; DIO = OUTPUT
        GOTO    $+1                     ; WAIT FOR OUTPUTS TO SETTLE
        BSF     PORTA,CS                ; SELECT EEPROM
        SETC                            ; START BIT = 1
        MOVLW   9D                 	; START BIT + 8 DATA BITS
	MOVWF	CNT1

SENDC2
        BTFSS	STATUS,CARRY            ; TEST BIT
        BCF     PORTA,DIO               ; WRITE TO DIO
        BTFSC	STATUS,CARRY            ; TEST BIT
        BSF     PORTA,DIO               ; WRITE TO DIO
        GOTO    $+1                     ; WAIT 2 US
        RLF     OUTBYT,F                ; GET NEXT BIT INTO CARRY
        BSF     PORTA,CLK               ; CLOCK HIGH
        GOTO    $+1                     ; WAIT 2 US
        GOTO    $+1                     ; WAIT 2 US
        BCF     PORTA,CLK               ; CLOCK LOW
	DECFSZ	CNT1,F			; LOOP COUNTER
        GOTO	SENDC2
        BCF     PORTA,DIO               ; AVOID CONTENTION WITH READ
        RETLW   0

;**************************************************************************
;
; FUNCTION     	: EEWRITE ()	      			
;

; DESCRIPTION  	: ENCRYPT AND WRITE 16 BIT VALUE TO EEPROM 
;
; PAGE		: 0
;
;**************************************************************************
EEWRITE
; ****** ENCRYPT 16-BIT WORD TO WRITE TO EEPROM ***************

FNC
        MOVLW   16D                	; 16 DATA BITS TO ENCRYPT
	MOVWF	CNT1

FNC2
	MOVLW   07H			; MASK ONLY LOWER 3 BITS
        ANDWF   TMP1,W
	MOVWF	OUTBYT			; TEMPORY STORE RESULT
	MOVLW	(EE_KEY-KEYBASE)	; GET BASE ADDRES OF EEPROM KEY
	ADDWF	OUTBYT,W		; ... AND ADD TO RESULT
        CALL    KEY_LOOKUP		; GET BYTE FROM KEY LOOKUP TABLE
        XORWF   TMP2,F			 
        CALL    ROTR                    ; ROTATE RIGHT 16 BIT WORD
	DECFSZ	CNT1,F
	GOTO	FNC2

; ******* EEPROM WRITE ENABLE ******************
WRITE0  
	MOVLW	30H			; WRITE ENABLE COMMAND
	MOVWF   OUTBYT               	
        CALL    SENDC			; SEND COMMAND TO EEPROM
        BCF     PORTA,CS                ; END COMMAND, DESELECT

; ******** WRITE 16-BIT WORD TO EEPROM *********
WRITE1  
	MOVFW   ADDRESS			; GET EEPROM ADDRESS
	MOVWF	OUTBYT
        BSF     OUTBYT,6		; WRITE COMMAND
        CALL    SENDC                   ; SEND COMMAND TO EEPROM

	MOVLW	16D			; 16 DATA BITS
        MOVWF   CNT1	                

WRITE2
        BTFSS   TMP1,7			; TEST MSB OF 16 BIT WORD
        BCF     PORTA,DIO		; CLEAR DATA BIT
        BTFSC   TMP1,7			; ... ELSE 
        BSF     PORTA,DIO               ; SET DATA BIT
        GOTO    $+1                     ; WAIT 2 US
        RLF     TMP2,F                  ; SHIFT LO BYTE
        BSF     PORTA,CLK               ; CLOCK HIGH
        GOTO    $+1                     ; WAIT 2 US
        RLF     TMP1,F                  ; SHIFT HI BYTE
        BCF     PORTA,CLK               ; CLOCK LOW
	DECFSZ	CNT1,F
        GOTO	WRITE2             	; LOOP COUNTER
        BCF     PORTA,CS                ; END OF WRITE COMMAND, DESELECT

        MOVLW   RDCFG
        TRIS    PORTA                   ; DIO = INPUT
        BSF     PORTA,CS                ; CS HIGH TO WAIT FOR ACK
	CLRF	RTCC

WRITE5  
        BTFSC   RTCC,7			; CHECK FOR TIMOUT
	GOTO	RESET			; START OVER
	CLRWDT				; RESET WATCHDOG TIMER
        BTFSS   PORTA,DIO		; CHECK FOR ACK RISING EDGE
        GOTO    WRITE5			; LOOP BACK

WRITE6  BCF     PORTA,CS                ; END OF ACK

; ******* EEPROM WRITE DISABLE ****************
        MOVLW   000H             	; WRITE DISABLE COMMAND
	MOVWF	OUTBYT
        CALL    SENDC
        BCF     PORTA,CS                ; END OF DISABLE COMMAND, DESELECT

	INCF	ADDRESS,F		; POINT TO NEXT EEPROM ADDRESS ( BY DEFAULT )
	RETLW	0H

;**************************************************************************
;
; FUNCTION     	: LEARN_OK ()
;
; DESCRIPTION  	: LED ON FOR 1 SEK [ INDICATE LEARN SUCCESSFUL ]
;
; PAGE		: 0
;
;**************************************************************************

LEARN_OK
	CLRF	CNT_LW			; CLEAR COUNTER
  	BSF	PORTB,LED 		; LED ON FOR 1 SEC

LEARN_OK2
	CALL	TST_RTCC		; UPDATE COUNTER
        BTFSS   CNT_LW,5		; TEST FOR 1 SEC TIMEOUT
        GOTO    LEARN_OK2		; LOOP BACK
  	BCF	PORTB,LED		; LED OFF
	CLRF	CNT_LW
LEARN_OK3
	CALL	TST_RTCC		; UPDATE COUNTER		
	BTFSS	CNT_LW,4		; TEST FOR 0.5S TIMEOUT
	GOTO	LEARN_OK3		; LOOP BACK

LEARN_END
	BSF	FLAGS,NORMAL		; SELECT NORMAL MODE	
	BCF	FLAGS,PASS1		; CLEAR LEARN MODE
	BCF	FLAGS,PASS2		; CLEAR LEARN MODE

	BSF	FLAGS1,S_RSTR		; RESTORE FLAGS
	 
	BSF	STATUS,PA0		; CONTINUE ON PAGE 1
	GOTO	M_LOOP			; RETURN TO MAIN LOOP

;**************************************************************************
;
; FUNCTION     	: WIPE_TX ()  
;
; DESCRIPTION  	: WIPE CURRENT TX SERIAL NUMBER IN EEPROM
;
; PAGE		: 0
;
;**************************************************************************
WIPE_TX	
	MOVLW	LRN_PTR			; POINT LEARN POINTER
	MOVWF	ADDRESS
	CALL	EEREAD			; READ LEARN POINTER WORD
 
        BTFSS   TMP1,0			; BUSY LEARNING?
        GOTO    LEARN_NOK    		; .. NO, BYPASS TX WIPE

	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_WRITE0		; UPDATE EEPROM

WIPE_TX1
	BSF	STATUS,PA0		; CALL TO PAGE 1
	CALL	TX_LOOKUP		; TO GET BASE ADDRESS OF TX
	BCF	STATUS,PA0		; RETURN TO PAGE 0
	BSF	ADDRESS,1		; ADD 2 TO BASE ADDRESS
	CLRF	TMP1			; SET VALUE TO ZERO
	CLRF	TMP2
	CALL	EE_WRITE0		; CLEAR LOWER 16 BITS
	CLRF	TMP1			; SET VALUE TO ZERO
	CLRF	TMP2
	CALL	EE_WRITE0		; CLEAR UPPER 16 BITS

;**************************************************************************
;
; FUNCTION     	: LEARN_NOK ()
;
; DESCRIPTION  	: LED ON FOR 0.1 SEC [ INDICATE LEARN SUCCESSFUL ]
;
; PAGE		: 0
;
;**************************************************************************

LEARN_NOK
	BSF	FLAGS1,S_RSTR		; RESTORE FLAGS
	BCF	FLAGS,PASS1
	BCF	FLAGS,PASS2
	BSF	FLAGS,NORMAL		; SELECT NORMAL MODE
	BCF	FLAGS,RESYNC		; RESET RESYNC FLAG

	CLRF	CNT_LW			; CLEAR COUNTER
  	BSF	PORTB,LED 		; LED ON FOR 0.1 SEC

LEARN_NOK2
	CALL	TST_RTCC		; UPDATE COUNTER
	
        BTFSS   CNT_LW,2		; CHECK FOR 100MS TIMEOUT
        GOTO    LEARN_NOK2
  	BCF	PORTB,LED		; LED OFF

	CLRF	CNT_LW
LEARN_NOK3
	CALL	TST_RTCC		; UPDATE COUNTER		
	BTFSS	CNT_LW,4		; TEST FOR 0.5S TIMEOUT
	GOTO	LEARN_NOK3		; LOOP BACK

	BTFSS	FLAGS1,ENTRY		
	GOTO	M_LOOP0			; RETURN TO MAIN LOOP
	BSF	STATUS,PA0		; GOTO PAGE 1
	GOTO	MAIN			; RETURN TO STATUS READ

;**************************************************************************
; PAGE 1:
;**************************************************************************
	ORG	200H

;**************************************************************************
; CALLS TO FIRST PAGE
;**************************************************************************

RESET1	BCF	STATUS,PA0		; SELECT PAGE #0
	GOTO	RESET			; GOTO RESET

EE_READ1
	BCF	STATUS,PA0		; SELECT PAGE #0
	GOTO	EEREAD			; CALL EEPROM READ ROUTINE

EE_CLEAR1
	CLRF	TMP1			; CLEAR UPPER 16 BITS
	CLRF	TMP2			; ... AND THEN WRITE TO EEPROM

EE_WRITE1
	BCF	STATUS,PA0		; SELECT PAGE #0
	GOTO	EEWRITE			; CALL EEPROM WRITE ROUTINE

;**************************************************************************
;
; FUNCTION     	: TX_LOOKUP ()	      			
;
; DESCRIPTION  	: TRANSMITTER MEMORY LOOKUP TABLE
;
; PAGE		: 1	( NOTE : MUST BE LOWER HALF OF PAGE )
;
;**************************************************************************
TX_LOOKUP
	CALL	TX_LOOKUP2		; GET VALUE FROM LOOKUP TABLE BELOW
	MOVWF	ADDRESS			; STORE VALUE IN ADDRESS REGISTER
	RETLW	0

; ****** LOOKUP TABLE WITH BASE ADDRESS OF TRANSMITTERS ************
	
TX_LOOKUP2
	MOVFW	TXNUM			; GET CURRENT TRANSMITTER
	ADDWF	PC,1
	RETLW	10H			; TX0 BASE ADDRESS 
	RETLW	18H			; TX1 BASE ADDRESS
	RETLW	20H			; TX2 BASE ADDRESS
	RETLW	28H			; TX3 BASE ADDRESS
	RETLW	30H			; TX4 BASE ADDRESS
	RETLW	38H			; TX5 BASE ADDRESS

;**************************************************************************
;
; FUNCTION     	: BUT_LOOKUP ()	      			
;
; DESCRIPTION  	: TRANSMITTER BUTTON LOOKUP TABLE
;
; PAGE		: 1	( NOTE : MUST BE LOWER HALF OF PAGE )
;
;**************************************************************************
BUT_LOOKUP
	MOVFW	TXNUM			; GET CURRENT TRANSMITTER
	ADDWF	PC,1
	RETLW	0AH			; TX0 BUTTON CODE ADDRESS
	RETLW	0BH			; TX1 BUTTON CODE ADDRESS
	RETLW	0CH			; TX2 BUTTON CODE ADDRESS
	RETLW	0DH			; TX3 BUTTON CODE ADDRESS
	RETLW	0EH			; TX4 BUTTON CODE ADDRESS
	RETLW	0FH			; TX5 BUTTON CODE ADDRESS

;**************************************************************************
;
; FUNCTION     	: KEYGEN ()	      			
;
; DESCRIPTION  	: GENERATE A KEY USING MASTER KEY ( ADDR 40H IN ROM )
;
; PAGE		: 1
;
;**************************************************************************
KEYGEN
	MOVLW	KEY7			; POINT TO FIRST KEY BYTE
	MOVWF	FSR

	MOVLW	(MAS_KEY-KEYBASE+7)	; GET TABLE MSB OFFSET FOR MASTER KEY
	MOVWF	CNT1

	MOVLW	8H			; INDICATE 8 BYTE TO READ FROM LOOKUP TABLE
	MOVWF	CNT0			; BYTE COUNTER

KEYGEN2
	BCF	STATUS,PA0		; SELECT PAGE #0
	MOVFW	CNT1
	CALL	KEY_LOOKUP		; GET BYTE FROM LOOKUP TABLE
	MOVWF	IND			; STORE BYTE IN KEY BYTE
	DECF	FSR,F			; POINT TO NEXT ENTRY IN CIRCULAR BUFFER
	DECF	CNT1,F			; POINT TO NEXT ENTRY IN KEY LOOKUP TABLE
	BSF	STATUS,PA0		; RE-SELECT PAGE #1
	DECFSZ	CNT0,F			; ALL BYTES READ
	GOTO	KEYGEN2			; ... NO THEN READ NEXT BYTE
	MOVFW	KEY0			; SWAP KEY1 AND KEY0 
	MOVWF	OUTBYT			; NOTE : THIS MUST BE DONE BECAUSE THE TMP1 & TMP2
	MOVFW	KEY1			;        ( KEY0 & KEY1 ) REGISTERS IS ALSO USED 
	MOVWF	KEY0			; 	 DURING DECRYPTION ( KEYGEN )
	MOVFW	OUTBYT
	MOVWF	KEY1

	BCF	STATUS,PA0		; SELECT PAGE #0
	CALL	DECRYPT 		; DECRYPT 32 BIT USING MASTER KEY
	BSF	STATUS,PA0		; RE-SELECT PAGE #1
	
	MOVFW	HOP2			; GET LOWER 16 BIT OF DECRYPTED WORD
	MOVWF	TMP1			
	MOVFW	HOP1
	MOVWF	TMP2
	CALL	EE_WRITE1		; ... AND WRITE TO EEPROM 
	BSF	STATUS,PA0		; RE-SELECT PAGE #1

	MOVFW	HOP4			; GET UPPER 16 BIT OF DECRYPTED WORD
	MOVWF	TMP1
	MOVFW	HOP3
	MOVWF	TMP2
	CALL	EE_WRITE1		; ... AND WRITE TO EEPROM
	BSF	STATUS,PA0		; RE-SELECT PAGE #1

	BTFSC	ADDRESS,1		; TEST IF FIRST 32 BIT OF KEY GENERATED
	GOTO	S_SEED2			; ... IF SO GENERATE SECOND 32 BITS
	GOTO	CALC_END		; ... ELSE KEYGEN COMPLETE

;**************************************************************************
;
; FUNCTION     	: CALC_KEY ()	      			
;
; DESCRIPTION  	: CALCULATE NEW KEY FROM RECEIVED SERIAL NUMBER
;
; PAGE		: 1
;
;**************************************************************************
CALC_KEY
	BSF	FSR,5
	MOVFW	HOP1			; STORE 32 BIT HOPCODE IN THE EXTENDED TEMP BUFFER
	MOVWF	ETMP1			
	MOVFW	HOP2
	MOVWF	ETMP2
	MOVFW	HOP3
	MOVWF	ETMP3
	MOVFW	HOP4
	MOVWF	ETMP4
	BCF	FSR,5

	CALL	TX_LOOKUP		; GET TRANSMITTER BASE ADDRESS
	BSF	ADDRESS,1		; ADD 2 TO BASE ADDRESS

	MOVFW	SER_2			; GET LOWER 16 BIT OF SERIAL NUMBER
	MOVWF	TMP1
	MOVFW	SER_3
	MOVWF	TMP2
	CALL	EE_WRITE1		; ... AND WRITE TO EEPROM
	BSF	STATUS,PA0		; RE-SELECT PAGE #1
	
	MOVFW	SER_0			; GET UPPER 16 BIT OF SERIAL NUMBER
	MOVWF	TMP1
	MOVFW	SER_1
	MOVWF	TMP2
	CALL	EE_WRITE1		; ... AND WRITE TO EEPROM
	BSF	STATUS,PA0		; RE-SELECT PAGE #1

S_SEED1	
	MOVLW	20H			; PATCH IF TRANSMITTER IS A HCS360 / HCS300
	BTFSC	FLAGS,NTQ106		
	MOVLW	2BH			; PATCH IF TRANSMITTER IS A NTQ106 / NTQ105
	IORWF	SER_0,W
	MOVWF	DAT1

	MOVFW	SER_1			; GET SERIAL NUMBER FROM RECEIVER BUFFER
	MOVWF	DAT2
	MOVFW	SER_2
	MOVWF	DAT3
	MOVFW	SER_3
	MOVWF	DAT4
	GOTO	KEYGEN			; GENERATE FIRST 32 KEY BITS

S_SEED2	
	CALL	TX_LOOKUP		; GET TRANSMITTER 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
	MOVWF	DAT3
	MOVFW	TMP2

⌨️ 快捷键说明

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