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

📄 secsys14.asm

📁 keeloq滚动码解码大全
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	RRF     CNT1,1			; [1]
	RRF     CNT0,1			; [1]
	RRF     CNT1,1			; [1]
	RRF     CNT0,1                  ; [1] 
					
	MOVLW   MIN/80			; [1]
	SUBWF   CNT0,W			; [1]
	BTFSS   STATUS,CARRY		; [2] NEGATIVE?
	GOTO    RMT_0                   ; [0] YES--HEADER SHORTER THAN MIN.
					; TOTAL = 11
; ************* VALID HEADER RECEIVED *********************
RCV7
	MOVLW   NBITS                   ; [1] VALID START MARKER WAS RECEIVED
	MOVWF   CNT1			; [1]
	MOVF    CNT0,W			; [1]
	MOVWF   CNT2                    ; [1] CNT2 = CNT0
	MOVLW   6H			; [1] SEE NOTE BELOW
	SUBWF   CNT2,1			; [1]
	GOTO    DL1                   	; [2] COMPENSATE FOR FIRST BIT
					; TOTAL = 8

;**********************************************************************************
;  2.5 IS AVERAGE PLAY BETWEEN RISING EDGE AND JUMP OUT OF CALIBRATION LOOP.
;  2   FOR JUMP OUT OF RCV3 TO RCV6
; 11   INSTRUCTIONS FOR RVC6 - CAIBRATION COUNTER DIVIDE
;  8   INSTRUCTIONS FOR RCV7 - COMPENSATE FOR POST CALIBRATION CALCUATIONS
; TOTAL 22.5 INSTRUCTIONS BETWEEN RISING EDGE AND ENTERING DL1
;  THEREFORE SUBTRACT 22.5/4 = 5.625 TO COMPENSATE FOR POST CALCULATION ON 1ST BIT
;**********************************************************************************

RCV8					
	MOVLW	4H			; [1] WAIT A MAXIMUM OF 4 Te
	MOVWF	TMP_CNT			; [1] SET TEMP LOOP COUNTER

RCV10A
	MOVFW	CNT0                  	; [1] and CSR processing
	MOVWF   CNT2			; [1] Refer to explanation above

RCV10B
	BTFSC   PORTA,RFIN              ; [2] Wait for rising edge
	GOTO    RCV11                   ; [0] Edge found--Process
	CLRWDT                          ; [1] Clear watchdog Timer
	BTFSC   PORTA,RFIN              ; [2] Wait for Next rising edge
	GOTO    RCV11                   ; [0] Edge found--Process
	DECFSZ  CNT2,1                  ; [1] Decrement Timeout counter
	GOTO    RCV10B                  ; [2] Loop Back
					; TOTAL = 8, RFIN CHECKED EVERY 4uS ON AVERAGE

	DECFSZ	TMP_CNT,1		; [1] ALL Te PERIODS
	GOTO	RCV10A			; [2] ... NO, THEN WAIT FOR NEXT ONE
	GOTO    RMT01                   ; [0] ... YES, [0] TIMEOUT--no edge found

RCV11
	MOVLW	3H			; [1]  SEE NOTE BELOW
	SUBWF	CNT0,W			; [1]
	MOVWF	CNT2			; [1]

;*************************************************************************
; 2   SETUP OF TEMP LOOP COUNTER  ( ONLY ONCE )
; 2   SETUP TE LOOP COUNTER       ( MAX 4 )
; 3   DECREMENT TEMP LOOP COUNTER ( MAX 4 )
; 4   IS THE AVERAGE PLAY BETWEEN EDGE AND EDJE BEING DETECTED IN RCV9
; 2   JUMP OUT OF RCV10B TO RCV11
; 3   FOR RCV11
; TOTAL 10 INSTRUCTIONS BETWEEN EDGE AND ENTERING DL1
; THEREFORE SUBTRACT 10/4 = 2.5 => 3 DL1 LOOPS TO COMPENSATE FOR 
;*************************************************************************

DL1
	CLRWDT                          ; [1] RESET WATCHDOG TIMER
	DECFSZ  CNT2,1                  ; [1] [2, IF SKIP]
	GOTO    DL1                     ; [2] CNT0 X 4 us

SAMPLE1
	BTFSS   PORTA,RFIN              ; [2] INPUT HIGH?  FIRST SAMPLE
	GOTO    RMT01                   ; [0] NO--ERROR

	MOVF    CNT0,W                  ; [1] CALIBRATION COUNTER
	MOVWF   CNT2                    ; [1] (NOMINALLY 75 FOR 300 us PULSE)
	DECF    CNT2,1			; [1] SUBTRACT 2 FROM FINAL CALIB COUNTER TO COMPENATE FOR THIS
	GOTO	$+1			; [2]
	NOP				; [1]
					; TOTAL = 8 => 1 LOOP COUNTER
DL2
	CLRWDT                          ; [1] RESET WATCHDOG TIMER
	GOTO	$+1			; [2] WAISTE TIME
	GOTO	$+1			; [2] WAISTE TIME
	DECFSZ  CNT2,1			; [1]
	GOTO    DL2                     ; [2] CNT0 X 8 us [ CNT0 x Te ]

SAMPLE2
	BCF     FLAGS1,BITIN             ; [1]   CLEAR BIT POSITION
	BTFSS   PORTA,RFIN              ; [1.5] LEAVE 0 IF LINE HIGH
	BSF     FLAGS1,BITIN             ; [0.5] MAKE 1 IF LINE LOW
					; SUB TOTAL = 3 CYCLES

	CALL    ROT_SHIFT               ; [11]+[2] CSR SHIFT + CALL
	BCF	CSR8,7			; [1]
	BTFSC   FLAGS1,BITIN		; [1.5]
	BSF     CSR8,7			; [0.5]
					; SUB TOTAL = 16 CYCLES


	MOVF    CNT0,W                  ; [1] CALIBRATION COUNTER
	MOVWF   CNT2                    ; [1] (NOMINALLY 75 FOR 300 us PULSE)
	MOVLW	3			; [1] SEE CALCULATION BELOW
	SUBWF	CNT2,1			; [1]
	NOP				; [1]
					; SUB TOTAL = 5 CYCLE
					; TOTAL = 24 => 24/8 = 3 LOOP COUNTERS
					 
;*************************************************************************
; TOTAL = 24 INSTRUCTIONS
; SUBTRACT 24/8 = 3 TO COMPESATE FOR UPDATEING CSR AND OTHER PROCESSING 
; AFTER DATA SAMPLE IS TAKEN.
;*************************************************************************

DL3
	GOTO	$+1			; [2] WAISTE TIME
	GOTO	$+1			; [2] WAISTE TIME
	CLRWDT                          ; [1] RESET WATCHDOG TIMER
	DECFSZ  CNT2,1                  ; [1]
	GOTO    DL3                     ; [2] CNT0 X 8 us [ CNT0 X Te ]

SAMPLE3
	BTFSC   PORTA,RFIN              ; [2] INPUT LOW?  THIRD SAMPLE
	GOTO    RMT0                    ; [0] NO--RECEIVE ERROR

	CALL    TST_RTCC                ; [11] CHECK RTCC

	DECFSZ  CNT1,1                  ; [1] LAST BIT?
	GOTO    RCV8                    ; [2] ... NO, GET NEXT BIT
					; TOTAL = 14 CYCLES

	GOTO    RMT21			; [2] ... YES, ALL BITS RECEIVED

RMT_0
	BSF     CNT1,4                  ; [1] HEADER ERROR--FORCE COUNTER > 11

RMT0					; [1] HERE IF NOT ALL BITS RECEIVED OK
	DECF	CNT1,1			; [1] COMPENSATE FOR ROTATE BEFORE DL3

; ***** JUMP TO HERE IF NOT ALL 66 BITS RECEIVED OK *****

RMT01					
	CALL    TST_RTCC                ; [11] CHECK RTCC

	MOVLW   11D                     ; TEST FOR NTQ106 TRANSMISSION
	SUBWF   CNT1,W                  ; IF CARRY FLAG SET (RX NOT OK)

	BTFSC   STATUS,CARRY		; CARRY SET IF FORMAT INVALID
	RETLW   0                       ; HERE IF NOT ALL BITS RECEIVED OK
	BSF     FLAGS,NTQ106            ; INDICATE NTQ106 TX RECEIVED

; ***** ROTATE FOR ANOTHER 6 TIME TO LINE-UP CSR *****

RMT21
	MOVLW	6H			; ADDITIONAL 6 BIT ROTATION REQUIRED
	ADDWF	CNT1,1			; ADD TO WHAT LEFT IN COUNTER

RMT22
	CLRC
	CALL    ROT_SHIFT               ; COMPLETE 64-BIT SHIFT
	DECFSZ  CNT1,1                  ; COMPLETE 64-BIT SHIFT
	GOTO    RMT22

	BTFSS	FLAGS,NTQ106		; TEST FOR NTQ106 TRANSMISSION
	GOTO	RMT1
	CLRF    SER_0                   ; ... YES, THEN CLEAR UPPER BYTE OF SN
	CLRF	CSR8

RMT1	
	BCF	FLAGS1,BAT_LOW		; CLEAR VLOW BIT
	BTFSC	CSR8,0			; TEST VLOW BIT IN TRANSMISSION
	BSF	FLAGS1,BAT_LOW		; INDICATE TX BATERY LOW BIT SET
RMT11
;	BSF	PORTA,LED		; VALID TRANSMISSION FORMAT, LED ON
	NOP
	  
RMT3
	MOVLW	0FH			; FORCE OPEN BUTTON CODES TO ZERO
	ANDWF	SER_0,1

RMT4	CLRC				; VALID SERIAL NUMBER => VALID TX
 	RETLW   E_OK                    ; RETURN WITH 1

;**************************************************************************
;
; FUNCTION     	: DECRYPT ()	      			
;
; DESCRIPTION  	: DECRYPTS 32 BIT [HOP1:HOP4] USING [CSR0:CSR7]
;
; PAGE		: 0 ( NOTE : MUST BE LOWER HALF OF PAGE )
;
;**************************************************************************
DECRYPT
        MOVLW   11+1            ; OUTER LOOP 11+1 TIMES 
        MOVWF   CNT1          	; OUTER LOOP 11+1 TIMES 

DECRYPT_OUTER

        MOVLW   48              ; INNER LOOP 48 TIMES
        MOVWF   CNT0          	; INNER LOOP 48 TIMES

DECRYPT_INNER
	CLRWDT			; RESET WATCHDOG TIMER
        MOVFW   CNT1		; LAST 48 LOOPS RESTORE THE KEY
        XORLW   1               ; LAST 48 LOOPS RESTORE THE KEY
        BTFSC	STATUS,ZERO     ; LAST 48 LOOPS RESTORE THE KEY
        GOTO    ROTATE_KEY      ; LAST 48 LOOPS RESTORE THE KEY

        ; THE LOOKUP TABLE IS COMPRESSED INTO IN 4 BYTES TO SAVE SPACE
        ; USE THE 3 LOW INDEX BITS TO MAKE UP AN 8-BIT BIT MASK
        ; USE THE 2 HIGH INDEX BITS TO LOOK UP THE VALUE IN THE TABLE
        ; USE THE BIT MASK TO ISOLATE THE CORRECT BIT IN THE BYTE
        ; PART OF THE REASON FOR THIS SCHEME IS BECAUSE NORMAL TABLE LOOKUP
        ; REQUIRES AN ADDITIONAL STACK LEVEL

        CLRC                    ; CLEAR CARRY (FOR THE LEFT SHIFT)
       
        MOVLW   1               ; INITIALISE MASK = 1
        BTFSC   HOP3,3       	; SHIFT MASK 4X IF BIT 2 SET
        MOVLW   10000B          ; SHIFT MASK 4X IF BIT 2 SET
        MOVWF   MASK            ; INITIALISE MASK = 1

        BTFSS   HOP2,0       	; SHIFT MASK ANOTHER 2X IF BIT 1 SET
        GOTO    $+3
        RLF     MASK,F
        RLF     MASK,F            

        BTFSC   HOP1,0       	; SHIFT MASK ANOTHER 1X IF BIT 0 SET
        RLF     MASK,F

        ; MASK HAS NOW BEEN SHIFTED 0-7 TIMES ACCORDING TO BITS 2:1:0

        MOVLW   0               ; TABLE INDEX = 0
        BTFSC   HOP4,1
        IORLW   2               ; IF BIT 3 SET ADD 2 TO THE TABLE INDEX
        BTFSC   HOP4,6
        IORLW   4               ; IF BIT 4 SET ADD 4 TO THE TABLE INDEX

        ADDWF   PC,F            ; ADD THE INDEX TO THE PROGRAM COUNTER
				;  [ MUST BE IN LOWER HALF OF PAGE ]
                               
TABLE
        MOVLW   02EH            ; BITS 4:3 WERE 00
        GOTO    TABLE_END       ; END OF LOOKUP

        MOVLW   074H            ; BITS 4:3 WERE 01
        GOTO    TABLE_END       ; END OF LOOKUP

        MOVLW   05CH            ; BITS 4:3 WERE 10
        GOTO    TABLE_END       ; END OF LOOKUP

        MOVLW   03AH            ; BITS 4:3 WERE 11
                                 
TABLE_END

        ANDWF   MASK,F          ; ISOLATE THE CORRECT BIT BY ANDING WITH MASK
        MOVLW   0               ; COPY THE BIT TO BIT 7
        BTFSS	STATUS,ZERO     ; COPY THE BIT TO BIT 7
        MOVLW   10000000B       ; COPY THE BIT TO BIT 7

        XORWF   HOP2,W    	; ONLY INTERESTED IN BIT HOP2,7
        XORWF   HOP4,W    	; ONLY INTERESTED IN BIT HOP4,7
        XORWF   KEY1,W		; ONLY INTERESTED IN BIT KEYREG1,7

        MOVWF   MASK            ; STORE W TEMPORARILY (WE NEED BIT 7)
        RLF     MASK,F          ; LEFT ROTATE MASK TO GET BIT 7 INTO THE CARRY

        RLF     HOP1,F         	; SHIFT IN THE NEW BIT
        RLF     HOP2,F
        RLF     HOP3,F
        RLF     HOP4,F

ROTATE_KEY

        CLRC			; CLEAR CARRY
        BTFSC   KEY7,7       	; SET CARRY IF LEFTMOST BIT SET
        SETC                    ; SET CARRY IF LEFTMOST BIT SET

        RLF     KEY0,F         	; LEFT-ROTATE THE 64-BIT KEY 
        RLF     KEY1,F
        RLF     KEY2,F
        RLF     KEY3,F
        RLF     KEY4,F
        RLF     KEY5,F
        RLF     KEY6,F
        RLF     KEY7,F         

        DECFSZ  CNT0,F        	; INNER LOOP 48 TIMES
        GOTO    DECRYPT_INNER   ; INNER LOOP 48 TIMES

	CALL	TST_RTCC
        DECFSZ  CNT1,F         	; OUTER LOOP 12 TIMES (11 + 1 TO RESTORE KEY)
        GOTO    DECRYPT_OUTER   ; OUTER LOOP 12 TIMES (11 + 1 TO RESTORE KEY)

        RETLW   0               ; RETURN 

;**************************************************************************
;
; FUNCTION     	: TST_RTCC ()	      			
;
; DESCRIPTION  	: TEST RTCC COUNTER AND UPDATE OUTPUT IF REQUIRED
;
; PAGE		: 0
;
;**************************************************************************

TST_RTCC1
	CLRWDT				; RESET WATCHDOG TIMER
	MOVFW	STATUS
	XORWF	RTCC,W
	ANDLW	080H

	BTFSS	STATUS,ZERO
	GOTO	TST_RTCC2		; TEST FOR 32MS TIMEOUT	ON RTCC MSB
	RETLW	0H			; ... DO QUICK RETURN TO RECEIVE ROUTINE

; **** INCREASE 16 BIT CLOCK TIMER *******
TST_RTCC2
	BCF	STATUS,OVF
	MOVFW	RTCC
	ANDLW	080H
	IORWF	STATUS,F

	INCF	CNT_LW,F		; INCREASE 16 COUNTER
	BTFSC	STATUS,ZERO		; INCREASE UPPER BYTE IF ZERO ( OVERFLOW )
	INCF	CNT_HI,F

	BSF	FSR,5			; SELECT RAM BANK 1
	INCF	CNT1_LW,F		; INCREASE REPEAT DEBOUNCE TIMER
	INCF	CNT2_LW,F		; INCREASE 2 SECOND PANIC TIMER
	BCF	FSR,5			; SELECT RAM BANK 0

	MOVLW	RDCFG			; 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

	
; *********** UPDATE LED IF REQUIRED ********
TST_LED 
        BTFSS   FLAGS,LFLASH
        GOTO    TST_PLIGHT

        BTFSS   CNT_LW,4		
        GOTO    TST_LED1

	BSF	PORTB,LED		; LED HIGH FOR 524MS			
	GOTO	TST_PLIGHT
TST_LED1
	BCF	PORTB,LED		; LED LOW FOR 524MS

; *********** UPDATE PLIGHT IF REQUIRED ********
TST_PLIGHT

        BTFSS   FLAGS,PFLASH
        GOTO    TST_30

        BTFSS   CNT_LW,4
        GOTO    TST_PLIGHT1

	BSF	PORTB,PLIGHT		; PLIGHT HIGH FOR 524MS
	GOTO	TST_30

TST_PLIGHT1
	BCF	PORTB,PLIGHT		; PLIGHT LOW FOR 524MS

 ; ********* TEST FOR 30 S LEARN TIMEOUT *************
TST_30	BTFSC   FLAGS,NORMAL		; TIMEOUT USE ONLY WITH LEARN
        GOTO    TST_RPT

        BTFSS   CNT_HI,2
        GOTO    TST_RPT			; TEST FOR LEARN TIMEOUT

	GOTO	WIPE_TX			; IF LEARN TIMEMOUT ABORT

 ; ********* TEST REPEAT TIMEOUT *************

TST_RPT 
	BSF	FSR,5			; SELECT RAM BANK 1

        BTFSS   CNT1_LW,4
        GOTO    TST_PANIC		; REPEAT TIMEMOUT OF 0.5 SEC

	BCF	FSR,5
	BCF	FLAGS,RPT

 ; ********* TEST PANIC TIMEOUT *************

TST_PANIC
	BCF	FSR,5

        BTFSS   FLAGS,RPT
        GOTO    TST_END

	BSF	FSR,5
	MOVLW	48D			; PANIC TIME OF 2 SEC
	SUBWF	CNT2_LW,W
       	BTFSS 	STATUS,CARRY
       	GOTO  	TST_END
	BCF	FSR,5			; SELECT RAM BANK 0
	BCF	FLAGS,RPT
	BSF	STATUS,PA1		; SELECT PAGE #2
	GOTO	ALARM

TST_END	
	BCF	FSR,5			; SELECT RAM BANK 0
	RETLW	0H

;**************************************************************************
;
; FUNCTION     	: TST_LEARN ()	      			
;

; DESCRIPTION  	: TEST AND HANDLE LEARN BUTTON
;
; PAGE		: 0
;
;**************************************************************************
TST_LEARN1
	CLRWDT				; RESET WATCHDOG TIMER
	BTFSS	PORTC,LEARN		; CHECK FOR LEARN BUTTON PRESSED
	RETLW	0			; ... IF NOT RETURN
        BTFSC   FLAGS,PASS2
        GOTO    TST_LEARN7    		; ALREADY IN LEARN
	
TST_LEARN2
	MOVLW	ALARMS			; CHECK IF IN ALARM STATE
	XORWF	RAMS,W
	BTFSC  	STATUS,ZERO		; ... NO,  CONTINUE
       	RETLW	0			; ... YES, RETURN

	CLRF	CNT_HI			; RESET EVENT COUNTER 
	CLRF	CNT_LW
	BCF	FLAGS,LFLASH		; CLEAR LED FLASH MODE

TST_LEARN3
	MOVLW	080H			; CHANGE LED STATE
	XORWF	PORTB,F			; USED TO FLASH LED AT 25KhZ
	CALL	TST_RTCC	   	; CALL RTCC UPDATE ROUTINE

        BTFSC   CNT_HI,0
        GOTO    TST_LEARN4		; TEST FOR ERASE TIMEMOUT ( 8.2 SEC )

        BTFSS   PORTC,LEARN
        GOTO    TST_LEARN5		; WAIT FOR LEARN BUTTON LIFT

	GOTO	TST_LEARN3		; ... IF NOT WAIT FOR LEARN KEY LIFT

TST_LEARN4
	BSF	STATUS,PA0		; SELECT PAGE #1
	GOTO	ERASE			; ERASE ALL LEARNED TRANSMITTERS

⌨️ 快捷键说明

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