打造国内最大的IC交易平台
技术资料 行业资讯 PDF资料 IC价格 IC替换 缩略语 IC供应 IC采购
PIC 滚动码的解码程序
类别:单片机/DSP  
 
摘要:PIC单片机滚动码的解码程序

  #include <p16f877.inc>

  ;

  GLOBAL DECRYPT

  GLOBAL KEY0,KEY1,KEY2,KEY3,KEY4,KEY5,KEY6,KEY7

  GLOBAL CSR0,CSR1,CSR2,CSR3,CSR4,CSR5,CSR6,CSR7,CSR8

  ;

  #define HOP1 CSR0 ; ﹚竡 HOP1~4 单 CSR1~4

  #define HOP2 CSR1

  #define HOP3 CSR2

  #define HOP4 CSR3

  #define MAX_CODE_LENGTH .72

  #define CODE_LENGTH .66

  ;

  UDATA_SHR ; Difine CSR0:CSR7 on Share MEMORY

  CSR0 res 1 ; Hopping Code 钡Μ纗既竟 (LSB)

  CSR1 res 1

  CSR2 res 1

  CSR3 res 1

  CSR4 res 1

  CSR5 res 1

  CSR6 res 1

  CSR7 res 1

  CSR8 res 1 ; Hopping Code 钡Μ纗既竟 (MSB)

  ;

  Encrypt_Data UDATA 0x20

  KEY0 res 1 ; 64-bit 秆盞じン戈 (LSB)

  KEY1 res 1

  KEY2 res 1

  KEY3 res 1

  KEY4 res 1

  KEY5 res 1

  KEY6 res 1

  KEY7 res 1

  ;

  UDATA

  CNT0 res 1

  CNT1 res 1

  HOP_LENGTH res 1

  MASK res 1

  KEELOQ_Temp res 1

  ;

  ;

  KEELOQ_CODE CODE

  ;

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

  ;**** Rotate CSRs register right 1 bit

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

  ROT_CSRs

  RRF CSR8,F

  RRF CSR7,F

  RRF CSR6,F

  RRF CSR5,F

  RRF CSR4,F

  RRF CSR3,F

  RRF CSR2,F

  RRF CSR1,F

  RRF CSR0,F

  return

  ;

  ;

  ;

  ;

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

  ;

  ; FUNCTION : DECRYPT ()

  ;

  ; DESCRIPTION : DECRYPTS 32 BIT [HOP1:HOP4] USING [CSR0:CSR7]

  ;

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

  DECRYPT

  BANKSEL CNT1

  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,Z ; 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

  bcf STATUS,C ; CLEAR CARRY (FOR THE LEFT SHIFT)

  MOVLW .1 ; INITIALISE MASK = 1

  BTFSC HOP3,3 ; SHIFT MASK 4X IF BIT 2 SET

  MOVLW B'00010000' ; 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 HIGH TABLE

  MOVwf PCLATH

  MOVlw LOW TABLE

  MOVwf KEELOQ_Temp

  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 KEELOQ_Temp,W

  btfsc STATUS,C

  incf PCLATH,F

  MOVwf PCL ; ADD THE INDEX TO THE PROGRAM COUNTER

  ; [ MUST BE IN LOWER HALF OF PAGE ]

  TABLE

  MOVLW 0x2E ; BITS 4:3 WERE 00

  GOTO TABLE_END ; END OF LOOKUP

  MOVLW 0x74 ; BITS 4:3 WERE 01

  GOTO TABLE_END ; END OF LOOKUP

  MOVLW 0x5C ; BITS 4:3 WERE 10

  GOTO TABLE_END ; END OF LOOKUP

  MOVLW 0x3A ; BITS 4:3 WERE 11

  TABLE_END

  ANDWF MASK,1 ; ISOLATE THE CORRECT BIT

  MOVLW 0 ; COPY THE BIT TO BIT 7

  btfss STATUS,Z ; COPY THE BIT TO BIT 7

  MOVLW B'10000000' ; 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 CARRY

  RLF HOP1,F ; SHIFT IN THE NEW BIT

  RLF HOP2,F

  RLF HOP3,F

  RLF HOP4,F

  ROTATE_KEY

  bcf STATUS,C ; CLEAR CARRY

  BTFSC KEY7,7 ; SET CARRY IF LEFTMOST BIT SET

  bsf STATUS,C ; 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