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

📄 p676_koq.asm

📁 PIC16f676/630移植的keeloq滚动码汇编程序,节省一个外部EEPROM,并增加I/O端口.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;------------------------------------------------------------------------------
;  MICROCHIP KEELOQ CODE HOPPING SIMPLE DECODER
;
;------------------------------------------------------------------------------
;  LEGAL NOTICE
;
;  The information contained in this document is proprietary and 
;  confidential information of Microchip Technology Inc.  Therefore all 
;  parties are required to sign a non-disclosure agreement before 
;  receiving this document.
;------------------------------------------------------------------------------

;===========================================================================
; SIMPLE DECODER WITH ONE STEP LEARN AND SINGLE KEY
;===========================================================================
;
;PROGRAM INFORMATION:	FILE:	SIMDEC10.ASM	
;			DATE:	08/15/96 
;			VER.:	1.0
;			CKSM:	XXXXH - FUSES:RC,WDT=ON,CP=ON
;			ASM.: 	MPASM VERSION 1.40 USED
;			INCL:	NONE
;			TABS:   8
;===========================================================================
; CONFIGURATION CONTROL:
; 
; DATE		VERSION	LINE	CHANGES
; 08/14/96	1.0		FIRST VERSION
;===========================================================================
	INCLUDE<P16F676.INC>
	LIST P=PIC16F676,R=DEC
;===========================================================================
;******USER DEFINITIONS******
MAX_USERS	EQU	15
; This is the maximum number of transmitters that the system is able to 
; learn (1 to 15).  
;===========================================================================


; USER DEFINED REGISTER

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
TMP_CNT	EQU		OUTBYT		; TEMPORARY COUNTER

; COUNTER REGISTERS

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

CNT_HI	EQU		27H		; 16 BIT CLOCK COUNTER
CNT_LW	EQU		28H		

; CIRCULAR BUFFER REGISTER

CSR0    EQU     29H            	; 64 BIT RECEIVE SHIFT REGISTER
CSR1    EQU     2AH            
CSR2    EQU     2BH            
CSR3    EQU     2CH            
CSR4    EQU     2DH            	
CSR5    EQU     2EH            
CSR6    EQU     2FH            
CSR7    EQU     30H            

; TEMP REGISTERS
TMP1		EQU		31H		; TEMP REGISTER FOR READ AND WRITE
TMP2		EQU		32H		; TEMP REGISTER FOR READ AND WRITE
ADDRESS1	EQU		33H		; NOT USED
COUNT_ERASE	EQU		34H		; NOT USED

KEY0	EQU		35H		; 64 BIT KEY SHIFT REGISTER
KEY1	EQU		36H
KEY2	EQU		37H
KEY3	EQU		38H
KEY4	EQU		CNT2
KEY5	EQU		CSR5
KEY6	EQU		CSR6
KEY7	EQU		CSR7


DATAS	EQU		39H

; ***** USER REGISTER RE-MAPPINGS ***************

HOP1	EQU		CSR0		; 32 BIT HOPCODE REGISTER
HOP2	EQU		CSR1
HOP3	EQU		CSR2
HOP4	EQU		CSR3

; RECEIVED TRANSMISSION OPEN 32 BITS 

SER_0	EQU		CSR7		; 28 BIT SERIAL NUMBER
SER_1	EQU		CSR6
SER_2	EQU		CSR5
SER_3	EQU		CSR4

; RECEIVED TRANSMISSION ENCRYPTED 32 BITS 

FUNC	EQU		CSR3		; BUTTON CODE & USER BIT FUNCTION BYTE
CODEE	EQU		CSR2		; DISCRIMINATION VALUE
CNTR_HI	EQU		CSR1		; 16 BIT RX COUNTER HIGH BYTE
CNTR_LW	EQU		CSR0		; 16 BIT RX COUNTER LOW BYTE

; ********* EEPROM MEMORY *******
LRNPTR	EQU		02H		; LEARN POINTER

; ********* PORTA BIT DEFINITIONS *******

LED		EQU		0H		; RESERVED PIN
RFIN	EQU		1H		; RF INPUT
LRN		EQU		2H		; LEARN BUTTON
RES0	EQU		3H		; LEARN INDICATOR LED OUTPUT - VALID SIGNAL

; ********* PORTC BIT DEFINITIONS *******

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

DIO		EQU		4H		; EEPROM DATA LINE
CLK		EQU		5H		; EEPROM SERIAL CLOCK
CS		EQU		6H		; EEPROM CHIP SELECT
RES1	EQU		7H		; RESERVED PIN

; ********* COMPILER DEFINES ******************
NBITS   EQU     64      	; MAXIMUM TRANSMISSION BIT LENGTH
MIN     EQU     560            	; TRANSMISSION HEADER MINIMUM LENGTH [鍿]
TRIS_A	EQU		001110B		; PORTA: TRI-STATE VALUE
WRCFG	EQU		00000000B	; PORTC: EEPROM WRITE TRI-STATE VALUE
RDCFG	EQU		00000000B	; PORTC: EEPROM READ TRI-STATE VALUE

;****** FLAGS DEFINITIONS **************
BITIN	EQU		0H		; RF BIT VALUE 
LRNF	EQU		1H		; LEARN FLAG
SEC_CNT	EQU		2H		; SECOND COUNTER IS BEING CHECKED
RELEARN	EQU		3H		; RELEARNING A TRANSMITTER

;****** 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
PA0     EQU       5		; NOT USED
PA1     EQU       6		; NOT USED 

flash_flags	equ		40h
;===========================================================================
; PAGE 0: 
;===========================================================================
	ORG 00H

;===========================================================================
;
; FUNCTION     : RESET ()	      			
;
; DESCRIPTION  : PROGRAM RESET ROUTINE
;
;===========================================================================

RESET
	BSF		STATUS,RP0		;calibrating the internal oscillator
		MOVLW	07H				;setting option
		MOVWF	OPTION_REG
		MOVLW	TRIS_A			;setting TRIS_A
		MOVWF	TRISA	
		MOVWF	IOCA			;setting IOCA
		MOVLW	00h				;setting trisC
		MOVWF	TRISC
		MOVLW	34H				;setting wpua
		MOVWF	WPUA
		MOVLW	00H
		MOVWF	INTCON			;setting intcon
		CLRF	ANSEL			;setting along/digital pin
		;<80H REG SETTING
		BCF		STATUS,RP0
		MOVLW	07H				;setting cmcon
		MOVWF	CMCON

	CLRF	PORTA			; RESET PORTA
	CLRF	PORTC			; RESET PORTC

	CLRF	FLAGS			; RESET FLAGS


	GOTO	M_LOOP			; GOTO MAIN PROGRAM LOOP

;===========================================================================
;
; FUNCTION     	: ROT_SHIFT()	      			
;
; DESCRIPTION  	: RIGHT ROTATE 64 BIT RECEIVE SHIFT REGISTER
;
; NOTE		: THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;===========================================================================

ROT_SHIFT
        RRF     CSR7,F
        RRF     CSR6,F
        RRF     CSR5,F                     
        RRF     CSR4,F                     
        RRF     CSR3,F                     
        RRF     CSR2,F                     
        RRF     CSR1,F                    
        RRF     CSR0,F                    
	RETLW	0

;===========================================================================
;
; FUNCTION     	: TX_LOOKUP ()	      			
;
; DESCRIPTION  	: TRANSMITTER ADDRESS CALCULATION
;
; NOTE		: THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;===========================================================================

TX_LOOKUP
	MOVF	TXNUM,W			; USE TRANSMITTER NUMBER TO CALCULATE 
	MOVWF	ADDRESS			; ADDRESS OF TRANSMITER BLOCK
	CLRC					; MULTIPLY BY 4 
	RLF		ADDRESS,F
	RLF		ADDRESS,F
	MOVLW	04H				; AND ADD 4
	ADDWF	ADDRESS,F
	RETLW	0				; RETURN

;===========================================================================
;
; FUNCTION     	: TST_RTCC ()	      			
;
; DESCRIPTION  	: UPDATE RTCC COUNTER 
;
; NOTE		: THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;===========================================================================
TST_RTCC
	CLRWDT				; RESET WATCHDOG TIMER
	BSF		STATUS,RP0
	MOVLW	TRIS_A			; UPDATE TRI-STATE REGISTER FOR PORTA
	MOVLW	TRISA
	BCF		STATUS,RP0

	BTFSS	TMR0,7			; TEST FOR 32MS TIMEOUT	ON RTCC MSB
	RETLW	0			; ... DO QUICK RETURN TO RECEIVE ROUTINE

; **** INCREASE 16 BIT CLOCK TIMER *******

	BCF		TMR0,7			; CLEAR MSB OF RTCC
	INCF	CNT_LW,F		; INCREASE 16 COUNTER
	SKPNZ				; INCREASE UPPER BYTE IF ZERO ( OVERFLOW )
	INCF	CNT_HI,F
	RETLW	0

;===========================================================================
;
; FUNCTION     	: TST_TIMER()	      			
;
; DESCRIPTION  	: TEST 32MS TIMER AND UPDATE OUTPUTS IF REQUIRED
;
; NOTE		: THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;===========================================================================

TST_TIMER
; ***** TEST FOR 500 MS TIMEMOUT ON OUTPUTS **********
	BTFSS	CNT_LW,6		; TEST FOR 500 MS TIMEOUT
	GOTO	TST_30			; ... IF NOT TEST 30S TIMEOUT

	MOVFW	PORTC
	BTFSS	STATUS,Z
	COMF	PORTC			; DOWN ALL PULSE OUTPUTS 
	clrf	CNT_LW
 ; ********* TEST FOR 30 S LEARN TIMEOUT *************
TST_30		
	BTFSS	FLAGS,LRNF
	GOTO	TST_END
	
	BTFSC	CNT_HI,2		; TEST FOR LEARN TIMEOUT
	GOTO	RESET			; ... IF LEARN TIMEMOUT FORCE SOFT RESET 

TST_END	
	RETLW	0H



;===========================================================================
;
; FUNCTION     	: EEWRITE ()	      			
;
; DESCRIPTION  	: WRITE 16 BIT VALUE TO EEPROM 
;
; NOTE		: THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;===========================================================================

EEWRITE
		CLRWDT		
		MOVFW	ADDRESS
		MOVWF	ADDRESS1
		RLF		ADDRESS1
		MOVFW	TMP1
		MOVWF	DATAS
		MOVLW	02H
		MOVWF	CNT1
EEWRITE1
		BSF		STATUS,RP0
		MOVF	ADDRESS1,W
		MOVWF	EEADR
		MOVF	DATAS,W
		MOVWF	EEDATA
		BSF		EECON1,WREN
		MOVLW	55H
		MOVWF	EECON2
		MOVLW	0AAH
		MOVWF	EECON2
		BSF		EECON1,WR
WRIT_VERIFY
		CLRWDT	
		BTFSC	EECON1,WR
		GOTO	$-2
		MOVF	EEDATA,W
		BSF		EECON1,RD
		XORWF	EEDATA,W
		BTFSS	STATUS,Z
		GOTO	EEWRITE1
		BCF		STATUS,RP0

		DECFSZ	CNT1
		GOTO	EEWRITE2
		INCF	ADDRESS
		RETLW	0H					
EEWRITE2
		MOVFW	TMP2
		MOVWF	DATAS
		INCF	ADDRESS1
		GOTO	EEWRITE1


;===========================================================================
;
; FUNCTION     	: EEREAD ()	      			
;
; DESCRIPTION  	: READ 16 BIT VALUE FROM EEPROM 
;
; NOTE		: THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;===========================================================================
EEREAD
		CLRWDT
		MOVFW	ADDRESS
		MOVWF	ADDRESS1
		RLF		ADDRESS1
		MOVLW	02H
		MOVWF	CNT1		
EEREAD3
		MOVFW	ADDRESS1
		BSF		STATUS,RP0
		MOVWF	EEADR
		BSF		EECON1,RD
		MOVF	EEDATA,W
		BCF		STATUS,RP0
		BTFSS	CNT1,1
		GOTO	EEREAD4
		MOVWF	TMP1
EEREAD1
		DECFSZ	CNT1
		GOTO	EEREAD2
		CLRWDT
		RETLW	0H
EEREAD2
		INCF	ADDRESS1
		GOTO	EEREAD3
EEREAD4
		MOVWF	TMP2
		GOTO	EEREAD1

;===========================================================================
;
; 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   PCL,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 

;===========================================================================
;

⌨️ 快捷键说明

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