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

📄 12f629=keelog.asm

📁 12f629单片机解码KEELOG源码,遥控器滚动码常用
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;序列号:04213496
;识别字:0496
;密码:5BD20B0AD945F5E2 
;**************************************************************************
;不改变寄存器的分配,以防移植到寄存器不同的CPU,	
;**************************************************************************
;-------------------------------------------------------------------------
;  微芯KEELOQ解码程序(正常学习模式)
;
;-------------------------------------------------------------------------
	PROCESSOR   PIC12F629
	RADIX       	DEC
    include     <P12F629.inc>
   __CONFIG  _BODEN_ON&_CP_OFF&_PWRTE_ON&_WDT_ON&_CPD_OFF&_INTRC_OSC_NOCLKOUT&_MCLRE_OFF  
   __IDLOCS  0608H   
;------------------------------------------------------------------------
  ERRORLEVEL 0,-305,-302  ; Messages, Warnings and Errors Printed
                          ; Ignore [305] => Using default dest of
                          ; 1 file
                          ; Ignore [302] => Register in operand not in bank 0

;用户寄存器

FLAGS		EQU	20H		; USER FLAG REGISTER
ADDRESS		EQU	21H		; ADDRESS REGISTER
TXNUM		EQU	22H		; CURRENT TX
OUTBYT		EQU	23H		; GENERAL DATA REGISTER
MASK		EQU OUTBYT	; MASK REGISTER USED IN DECRYPTION

;计数寄存器

CNT0    EQU 24H		; LOOP COUNTERS
CNT1    EQU 25H		
CNT2    EQU 26H		

CNT_HI	EQU	27H		; 16 位时钟计数器
CNT_LW	EQU	28H		

; 临时寄存器

TMP1	EQU	29H		;  临时寄存器
TMP2	EQU	2AH
TMP3	EQU	2BH
TMP4	EQU	2CH

; 循环缓冲寄存器

CSR4    EQU     2DH            	; 64位接收移位寄存器
CSR5    EQU     2EH            
CSR6    EQU     2FH            
CSR7    EQU     30H            

CSR0    EQU     31H            	
CSR1    EQU     32H            
CSR2    EQU     33H            
CSR3    EQU     34H            

; 工作寄存器

OLD_BUT 	EQU	35H		;存早先的按键代码
RAM_HI	 	EQU	36H		;16位随机存储计数寄存器( 使用同步)
RAM_LW	 	EQU	37H
SREG	 	EQU	38H		; 程序状态存储指示器寄存器
;********************************************************************
ADDR	 	EQU	39H	    ;读写EE用

; **************解码重新映射寄存器图*******************
;
; 注意: 间接寻址使用, 不可改变寄存器分配 
;
; ******************************************************************

KEY0	EQU	TMP2		;64BIT移位寄存器 WITH 解码钥匙
KEY1	EQU	TMP1        
KEY2	EQU	TMP3
KEY3	EQU	TMP4
KEY4	EQU	CSR4
KEY5	EQU	CSR5
KEY6	EQU	CSR6
KEY7	EQU	CSR7

HOP1	EQU	CSR0		; 32位跳码寄存器
HOP2	EQU	CSR1
HOP3	EQU	CSR2
HOP4	EQU	CSR3

; 用户重新映射寄存器

DAT1	EQU	CSR3		; 32位数据寄存器
DAT2	EQU	CSR2
DAT3	EQU	CSR1
DAT4	EQU	CSR0

; 注意: 这些寄存器用作密匙产生期的32位寄存器

ETMP1	EQU	CNT2		; 延伸32位寄存器
ETMP2	EQU	OLD_BUT
ETMP3	EQU	RAM_HI
ETMP4	EQU	RAM_LW

; 接收固定的32字节

SER_0	EQU	CSR7		; 24/28 字节序列号
SER_1	EQU	CSR6
SER_2	EQU	CSR5
SER_3	EQU	CSR4

; RECEIVED TRANSMISSION ENCRYPTED 32 BITS 

FUNC	EQU	CSR3		; 按键代码 &功能代码字节
DISC	EQU	CSR2		; 识别值
CNTR_HI	EQU	CSR1		; 16字节的接收计数器
CNTR_LW	EQU	CSR0

; ********* PORTA I/O口定? *******

RES0	EQU	0H		; 保留
RFIN	EQU	5H		; RF输入
LEARN	EQU	3H		; 学习按键
LED		EQU	4H		; 学习指示,LED输出

; ********* GPIO I/O口定? *******

S0		EQU	0H		; S0 OUTPUT
S1		EQU	1H		; S1 OUTPUT
S2		EQU	2H		; S2 OUTPUT
S3		EQU	3H		; S3 OUTPUT

B_LRN	EQU	2H		; 指示学习功能键

; ********* COMPILER DEFINES ******************
NBITS   EQU     64      	;; 传输最大长度的字节
MIN     EQU     540         ; TRANSMISSION HEADER MINIMUM LENGTH 
MAX     EQU     10800 		; TRANSMISSION HEADER MAXIMUM LENGTH
GPIOS	EQU		00101000B		; PORTA: TRI-STATE VALUE
;****** NTQ106 FLAGS DEFINITIONS **************
BITIN	EQU	0H		;保留
FLAG1	EQU	1H		;保留
FLAG2	EQU	2H		;保留
FLAG3	EQU	3H		;保留
TCHECK	EQU	4H		; INDICATE ONLY 16 BIT COUNTER UPDATE
NTQ106	EQU	5H		; 指示标准的微芯HCS TX码
RESYNC	EQU	6H		; 重新同步
OUT_500	EQU	7H		; 指示忙500MS溢出

;******* PROGRAM STATES ***********************
PASS1	EQU	0C9H		; 学习第一次通过标示
PASS2	EQU	0CAH 		; 学习第二次通过标示
NORMAL	EQU	05CH		; 正常程序标志.
BUSY	EQU	0C7H		; 指示学习忙标示

;****** STATUS REGISTER BIT DEFINITIONS *****************
C       EQU       0		; CARRY
DC      EQU       1		; DIGIT CARRY
Z       EQU       2		; ZERO
PD      EQU       3		; POWER DOWN
TO      EQU       4		; TIMEOUT
OVF     EQU       7		; TIMER0 OVERFLOW


;-------------------------------------------------------------------------


	ORG 00H
   ; BSF     3,5
   ;MOVWF   OSCCAL   ;振荡校正系数
	GOTO	RESET
	ORG	 4	
	RETFIE           ;中断留下,防止改为有中断功能.
;-------------------------------------------------------------------------
;
; FUNCTION     : RESET ()	      			
;
; DESCRIPTION  : PROGRAM RESET ROUTINE
;-------------------------------------------------------------------------
RESET
    banksel OPTION_REG	
	MOVLW	000111B		; SETUP TIMER0 PRESCALER
	MOVWF   OPTION_REG   ;预分频器(1:256)RTCC,内部指今周期
	CLRW
    MOVWF    WPU
    MOVWF    IOC
    MOVLW   GPIOS 
    MOVWF   TRISIO
    BANKSEL CMCON
    MOVLW   7
    MOVWF   CMCON       ;关模似
    CLRF	GPIO		;GPIO口
    CLRW
   	MOVWF   INTCON	    ;关所有的中断,本程序没有用到中断.
	CLRF	FUNC		;RESET FUNCTION BYTE
	CLRF	OLD_BUT		;RESET OLD BUTTON CODE
	CLRF	FLAGS		;RESET FLAGS
	CLRF	CNTR_HI		;RESET CLOCK COUNTER
	CLRF	CNTR_LW

	MOVLW	NORMAL		; INDICATE NORMAL PROGRAM FLOW
	MOVWF	SREG        ;正常程序标志
	GOTO	MAIN		;到主循环
;-------------------------------------------------------------------------
; FUNCTION     	: ROT_SHIFT()	      			
; DESCRIPTION  	: RIGHT ROTATE 64 BIT RECEIVE SHIFT REGISTER
;-------------------------------------------------------------------------
ROT_SHIFT
        RRF     CSR7
        RRF     CSR6                     
        RRF     CSR5                     
        RRF     CSR4                     
        RRF     CSR3                     
        RRF     CSR2                     
        RRF     CSR1                    
        RRF     CSR0                    	
        RETURN
;-------------------------------------------------------------------------
; FUNCTION        : NTQ_LP1 ()
; DESCRIPTION     : WAIT FOR CNT1 TIMES 1 MS
;			CNT2 = OSC/[4*6*1000]  [ 1MS ]
;-------------------------------------------------------------------------
NTQ_LP1
	MOVLW	200D			; DELAY COUNTER FOR 1 MS
	MOVWF	CNT2
NTQ_LP2
	NOP						; [1] WASTE TIME
	CLRWDT					; [1]
	DECFSZ	CNT2			; [1]
	GOTO	NTQ_LP2			; [2]
	DECFSZ	CNT1			; [1]
	GOTO	NTQ_LP1			; [2]
    RETURN
;-------------------------------------------------------------------------
; FUNCTION     	: TX_LOOKUP ()	      			
; DESCRIPTION  	: TRANSMITTER MEMORY LOOKUP TABLE
;-------------------------------------------------------------------------
TX_LOOKUP
	CALL	TX_LOOKUP2		; GET VALUE FROM LOOKUP TBLE BELOW
	MOVWF	ADDRESS			; STORE VALUE IN ADDRESS REGISTER
    RETURN
; ****** LOOKUP TABLE WITH BASE ADDRESS OF TRANSMITTERS ************	
TX_LOOKUP2
	MOVFW	TXNUM		; 得到当前发射机.
	ADDWF	PCL,1
	RETLW	10H			;0号发射机的基地址 
	RETLW	18H			;1号发射机的基地址 
	RETLW	20H			;2号发射机的基地址 
	RETLW	28H			;3号发射机的基地址 
	RETLW	30H			;4号发射机的基地址 
	RETLW	38H			;5号发射机的基地址 
;-------------------------------------------------------------------------
; 功能     	: 按钮查找 ()	      			
;
; 描述  	: 发射机按钮查找表
;-------------------------------------------------------------------------
BUT_LOOKUP
	MOVFW	TXNUM		; 获得当前发射机
	ADDWF	PCL,1
	RETLW	02H			; TX0 按钮代码地址
	RETLW	03H			; TX1 .
	RETLW	08H			; TX2 .
	RETLW	09H			; TX3 .
	RETLW	0AH			; TX4 .
	RETLW	0BH			; TX5 按钮代码地址
;-------------------------------------------------------------------------
; ?匙?存影射?
;-------------------------------------------------------------------------
KEY_LOOKUP
	ADDWF	PCL,1			; ADD OFFSET TO PROGRAM COUNTER
KEYBASE	EQU	$			; BASE ADDRESS 40H
MAS_KEY	EQU	$			; MASTER KEY BASE ADDRESS
	RETLW	0EFH			; MKEY_0 LSB ;64位工厂代码
	RETLW	0CDH			; MKEY_1
	RETLW	0ABH			; MKEY_2
	RETLW	089H			; MKEY_3
	RETLW	067H			; MKEY_4
	RETLW	045H			; MKEY_5
	RETLW	023H			; MKEY_6
	RETLW	001H			; MKEY_7 MSB

EN_KEY	EQU	$			; ENVELOPE KEY BASE ADDRESS
	RETLW	0FFH			; EN_KEY_0 LSB
	RETLW	0FFH			; EN_KEY_1 MSB

EE_KEY	EQU	$			; EEPROM KEY BASE ADDRESS   ;加密才用到
	RETLW	088H			; EKEY_0 LSB
	RETLW	077H			; EKEY_1
	RETLW	066H			; EKEY_2
	RETLW	055H			; EKEY_3
	RETLW	044H			; EKEY_4
	RETLW	033H			; EKEY_5
	RETLW	022H			; EKEY_6
	RETLW	011H			; EKEY_7 MSB
;-------------------------------------------------------------------------
; FUNCTION     	: TST_RTCC ()	      			
; DESCRIPTION  	: TEST TIMER0 COUNTER AND UPDATE OUTPUT IF REQUIRED
;-------------------------------------------------------------------------
TST_RTCC
	CLRWDT				; 清WDT,,,RESET WATCHDOG TIMER
	MOVFW	STATUS
	XORWF	TMR0,W
	ANDLW	080H
	BTFSS	STATUS,Z
	GOTO	TST_RTCC_2		;测试32MS溢出时间	
    RETURN                  ; 迅速的回到接收程序
; **** INCREASE 16 BIT CLOCK TIMER *******
TST_RTCC_2
	BCF		STATUS,OVF
	MOVFW	TMR0
	ANDLW	080H
	IORWF	STATUS
	INCF	CNT_LW			; INCREASE 16 COUNTER
	BTFSC	STATUS,Z		;计数器溢出否(OVERFLOW)
	INCF	CNT_HI
    BSF     3,5
	MOVLW	GPIOS			; UPDATE TRIS REGISTER FOR PORTA
	MOVWF   TRISIO
    BCF     3,5
	BTFSS	TMR0,7		; TEST FOR 32MS TIMEOUT	
    RETURN             ; 迅速的回到接收程序
; *********** UPDATE LED IF REQUIRED ********
TST_LED
	MOVLW	PASS1			; TEST IF IN 1ST PASS OF SELFLEARN
	XORWF	SREG,W
	SKPZ					; ... IF NOT BYPASS
	GOTO	TST_500
	BSF		GPIO,LED		; INDICATE 1ST VALID TX RECEIVED
; ***** TEST FOR 500 MS TIMEMOUT ON OUTPUTS **********
TST_500
	BTFSS	CNT_LW,4		; TEST FOR 500 MS TIMEOUT
	GOTO	TST_30			; ... IF NOT TEST 30S TIMEOUT
	BCF		FLAGS,OUT_500		; RESET 500 MS OUTPUT INICATION
	;BCF		GPIO,B_LRN		; RESET LEARN BUTTON CODE,629里对学习指示有冲突故屏蔽掉.
	MOVLW	0F0H
	ANDWF	GPIO,1			; DOWN ALL PULSE OUTPUTS 
	CLRF	OLD_BUT
 ; ********* TEST FOR 30 S LEARN TIMEOUT *************
TST_30	
	MOVLW	NORMAL			; TIMEOUT USE ONLY WITH LEARN
	XORWF	SREG,W
	SKPNZ
	GOTO	TST_END			; ... IF NOT RETURN 
	BTFSC	CNT_HI,2		; TEST FOR LEARN TIMEOUT
	GOTO	RESET			; IF TIMEMOUT FORCE SOFT RESET
TST_END	
	RETURN
;-------------------------------------------------------------------------
; 功能     	:解码 ()	      			
; 描述  	: 解32位跳码[HOP1:HOP4] USING [CSR0:CSR7])
;-------------------------------------------------------------------------
DECRYPT
        MOVLW   11+1	; 外循环11+1 次 
        MOVWF   CNT1    ;
DECRYPT_OUTER
        MOVLW   48      ;外循环 48 次
        MOVWF   CNT0    ; 
DECRYPT_INNER
		CLRWDT			;清看门狗
        MOVFW   CNT1	;最后48次循环恢复密匙
        XORLW   1              ; 
        SKPNZ                  	;
        GOTO    ROTATE_KEY      ; 
                              ; 查表程序压缩成4字节以节省空间(以运算的方法代替查表)    
                              ; 这部分设计的原因是避免常规查表程序导致的堆栈增加 
							
        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
        RLF     MASK            
        BTFSC   HOP1,0       	; SHIFT MASK ANOTHER 1X IF BIT 0 SET
        RLF     MASK            ; 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   PCL              ; 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            ; ISOLATE THE CORRECT BIT
        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            ; LEFT ROTATE MASK TO GET BIT 7 INTO CARRY
        RLF     HOP1         	; SHIFT IN THE NEW BIT
        RLF     HOP2
        RLF     HOP3
        RLF     HOP4
ROTATE_KEY
        CLRC			    ; 清除C
        BTFSC   KEY7,7     	; 置C,若最左边位为1
        SETC                    	; SET CARRY IF LEFTMOST BIT SET

        RLF     KEY0         	; LEFT-ROTATE THE 64-BIT KEY 
        RLF     KEY1
        RLF     KEY2
        RLF     KEY3
        RLF     KEY4
        RLF     KEY5
        RLF     KEY6
        RLF     KEY7         	
        DECFSZ  CNT0          	;  内循环48次
        GOTO    DECRYPT_INNER   ;
        DECFSZ  CNT1          	; 外循环12次(最后一次还原KEY)
        GOTO    DECRYPT_OUTER   ; OUTER LOOP 12 TIMES (11+1 TO RESTORE KEY)     
        RETURN

;-------------------------------------------------------------------------
;   功能:接收程序 ()
;   描述  : 接收到HCS发射信程序,(RECEIVE ROUTINE FOR NTQ106/HCS TRANSMITTERS)
;-------------------------------------------------------------------------
RECEIVE
;********等待数据头;调整 *******************
	BCF    	FLAGS,NTQ106	 ;清除发送标志
	BTFSS   GPIO,RFIN		; 输入是低?
	GOTO    RMT_0           ; 是;接收错误
	MOVLW   10              ; 不是,待10 ms
	MOVWF   CNT1
RCV0
	MOVLW   200
	MOVWF   CNT0
RCV1
	BTFSS   GPIO,RFIN        ; 输入是高?
	GOTO    RCV2             ; 不是, 跳过循环
	DECFSZ  CNT0             ;  是, 继续循环
	GOTO    RCV1             ; 5 us X CNT0
	DECFSZ  CNT1                    ; 1MS
	GOTO    RCV0
RCV2
	CLRF    CNT0             ; 清计数器低字节
	CLRF    CNT1             ; 清计数器高字节
RCV3
	BTFSC   GPIO,RFIN              ; [2][2] 输入是高?
	GOTO    RCV6                    ; [0][0] YES--END CALIBRATION
	MOVLW   ((MAX+2559)/10/256)      ; [1][1] LOAD W WITH TIMEOUT VALUE
	INCF    CNT0                    		; [1][1] LOW BYTE OF COUNTER
	BTFSS   STATUS,Z				; [1][2] OVERFLOW IN LOW BYTE?
	GOTO    RCV5                    ; [2][0] NO-DON'T UPDATE HIGH BYTE
RCV4
	INCF    CNT1                    ; [0][1] YES--INCREMENT HIGH BYTE
	SUBWF   CNT1,W                  ; [0][1] COUNTER > MAX.?
	BTFSC   STATUS,C		        ; [0][2] COUNTER > MAX.?
	GOTO    RMT_0                   ; [0][0]   YES--HEADER TOO LONG
RCV5
	CLRWDT                          ; [1][1]
	GOTO    RCV3                    ; [2][2] LOOP BACK
									; TOTAL 10/13us (WTH/WTHOUT CARRY)

⌨️ 快捷键说明

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