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

📄 滚动码接收程序.txt

📁 KEELOQ CODE HOPPING SIMPLE DECODER USE 16C54
💻 TXT
📖 第 1 页 / 共 3 页
字号:
        GOTO        WRITE5

WRITE6  BCF     PORTB,CS                ; END OF ACK

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

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

;------------------------------------------------------------------------------
;
; FUNCTION             : EEREAD ()                                      
;
; DESCRIPTION          : READ 16 BIT VALUE FROM EEPROM 
;
; NOTE                : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;------------------------------------------------------------------------------

EEREAD
        MOVFW   ADDRESS
        MOVWF        OUTBYT
        BSF     OUTBYT,7                ; COMMAND = READ
        CALL    SENDC                   ; SEND COMMAND
        MOVLW   RDCFG
        TRIS    PORTB                   ; DIO = INPUT
        MOVLW   16D                        ; 16 BITS TO READ
        MOVWF        CNT1

READ0   BSF     PORTB,CLK               ; CLOCK HIGH
        RLF     TMP2,F                  ; SHIFT LO BYTE
        BCF     TMP2,0                  ; ASSUME BIT WILL BE 1
        BTFSC   PORTB,DIO               ; READ DIO LINE
        BSF     TMP2,0                  ; COPY BIT TO REGISTER
        BCF     PORTB,CLK               ; CLOCK LOW
        RLF     TMP1,F                  ; SHIFT HI BYTE
        DECFSZ  CNT1,F                        ; LOOP COUNTER
        GOTO        READ0
        BCF     PORTB,CS                ; END READ CYCLE

        RETLW        0H

;------------------------------------------------------------------------------
;
; FUNCTION             : DECRYPT ()                                      
;
; DESCRIPTION          : DECRYPTS 32 BIT [HOP1:HOP4] USING [CSR0:CSR7]
;
; NOTE                : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;------------------------------------------------------------------------------


; THE KEY USED IS A FIXED KEY WHICH IS NOT SERIAL NUMBER DEPENDANT
; THE USER MUST CHOOSE A KEY AND CHANGE THE CODE HERE TO REFLECT THAT KEY

DECRYPT
        MOVLW        0EFH                ; LOAD FIXED 64 BIT KEY LSB                
        MOVWF        KEY0
        MOVLW        0CDH
        MOVWF        KEY1
        MOVLW        0ABH
        MOVWF        KEY2
        MOVLW        089H
        MOVWF        KEY3
        MOVLW        067H
        MOVWF        KEY4
        MOVLW        045H
        MOVWF        KEY5
        MOVLW        023H
        MOVWF        KEY6
        MOVLW        01H                ; LOAD FIXED 64 BIT KEY MSB
        MOVWF        KEY7

        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
        SKPNZ                   ; 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
        SKPZ                    ; 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

        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
2005-4-2 19:00 16C54
;

;------------------------------------------------------------------------------
;
; FUNCTION             : LOAD_CNT_VALS()                                      
;
; DESCRIPTION          : LOAD COUNTERS INTO WRITE BUFFERS
;
; NOTE                : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;------------------------------------------------------------------------------

LOAD_CNT_VALS
        MOVFW        CNTR_HI                        ; LOAD MSB OF COUNTER
        MOVWF        TMP1
        MOVFW        CNTR_LW                        ; LOAD LSB OF COUNTER
        MOVWF        TMP2
        RETLW        0

;------------------------------------------------------------------------------
;
; FUNCTION             : RECEIVE()                                      
;
; DESCRIPTION          : RECEPTION ROUTINE FOR PWM TRANSMISSIONS
;
; NOTE                : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;------------------------------------------------------------------------------

RECEIVE

;******** WAIT FOR HEADER AND CALIBRATE *******************

        BTFSS   PORTA,RFIN              ; INPUT LOW?
        GOTO    RMT_0                   ; YES; RECEIVE ERROR

        MOVLW   10                      ; 10 ms TIMER
        MOVWF   CNT1
RCV0
        MOVLW   200
        MOVWF   CNT0
RCV1
        BTFSS   PORTA,RFIN              ; [2] INPUT HIGH?
        GOTO    RCV2                    ; [0] NO, JUMP OUT OF LOOP
        DECFSZ  CNT0,1                  ; [1] YES, CONTINUE WITH TIMING LOOP
        GOTO    RCV1                    ; [2] 5 us X CNT0
        DECFSZ  CNT1,1                  ; [0] DO 1 ms LOOP CNT1 TIMES
        GOTO    RCV0                        ; [0]

RCV2
        CLRF    CNT0                    ; [1] CLEAR CALIB COUNTER LOW BYTE
        CLRF    CNT1                    ; [1] CLEAR CALIB COUNTER HIGH BYTE

;*************************************************************************
;  2.5 IS AVERAGE FOR DETECTING FALLING EDGE IN RCV1
;  2   INSTRUCTIONS FOR JUMP OUT RCV1 TO RCV2
;  2   INSTRUCTIONS FOR RCV2 - CLEAR CALIBRATION COUNTER
;  TOTAL 6.5 INSTRUCTIONS < 1 CALIBRATION LOOP SO DISCARD
;*************************************************************************

RCV3
        BTFSC   PORTA,RFIN              ; [2][2] INPUT HIGH?
        GOTO    RCV6                    ; [0][0] YES--END CALIBRATION
        INCF        CNT0,1                        ; [1] INCREMENT 16BIT COUNTER        
        SKPNZ                                      ; [2]
        INCF        CNT1,1                        ; [0]
        CLRWDT                                ; [1] RESET WATCH DOG TIMER
        NOP                                ; [1]
        BTFSS        CNT1,3                        ; [1]
        GOTO        RCV3                          ; [2]
        GOTO        RMT_0                         ; [0]
                                              ; TOTAL = 10
                                              
RCV6
        CLRC                                ; [1] DIVIDE CNT1:CNT0 BY 8 (600/8=75)
        RRF     CNT1,1                        ; [1]
        RRF     CNT0,1                        ; [1]
        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,C                ; [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
2005-4-2 19:02 16C54
;

;*************************************************************************

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

⌨️ 快捷键说明

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