51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机技术文章 > PIC单片机 > 详细内容
PIC单片机滚动码汇编解码程序
发布时间:2009/7/17  阅读次数:636  字体大小: 【】 【】【

#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     B00010000         ; 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     B10000000         ; 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

我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号