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

📄 hcs301_pro.asm

📁 HCS301的解码程序
💻 ASM
📖 第 1 页 / 共 4 页
字号:
; ****** ENCRYPT 16-BIT WORD TO WRITE TO EEPROM ***************

FNC
        MOVLW   16D                	; 16 DATA BITS TO ENCRYPT
	MOVWF	CNT1

FNC2
	MOVLW   07H			; MASK ONLY LOWER 3 BITS
        ANDWF   TMP1,W
	MOVWF	OUTBYT			; TEMPORY STORE RESULT
	MOVLW	(EE_KEY-KEYBASE)	; GET BASE ADDRES OF EEPROM KEY
	ADDWF	OUTBYT,W		; ... AND ADD TO RESULT
        CALL    KEY_LOOKUP		; GET BYTE FROM KEY LOOKUP TABLE
        XORWF   TMP2
        CALL    ROTR                    ; ROTATE RIGHT 16 BIT WORD
	DECFSZ	CNT1
	GOTO	FNC2

; ******* EEPROM WRITE ENABLE ******************

WRITE0
	MOVLW	30H			; WRITE ENABLE COMMAND
	MOVWF   OUTBYT
        CALL    SENDC			; SEND COMMAND TO EEPROM
        BCF     PORTB,CS                ; END COMMAND, DESELECT

; ******** WRITE 16-BIT WORD TO EEPROM *********

WRITE1
	MOVFW   ADDRESS			; GET EEPROM ADDRESS
	MOVWF	OUTBYT
        BSF     OUTBYT,6		; WRITE COMMAND
        CALL    SENDC                   ; SEND COMMAND TO EEPROM

	MOVLW	16D			; 16 DATA BITS
        MOVWF   CNT1

WRITE2
        BTFSS   TMP1,7			; TEST MSB OF 16 BIT WORD
        BCF     PORTB,DIO		; CLEAR DATA BIT
        BTFSC   TMP1,7			; ... ELSE
        BSF     PORTB,DIO               ; SET DATA BIT
        GOTO    $+1                     ; WAIT 2 US
        RLF     TMP2                    ; SHIFT LO BYTE
        BSF     PORTB,CLK               ; CLOCK HIGH
        GOTO    $+1                     ; WAIT 2 US
        RLF     TMP1                    ; SHIFT HI BYTE
        BCF     PORTB,CLK               ; CLOCK LOW
	DECFSZ	CNT1
        GOTO	WRITE2             	; LOOP COUNTER
        BCF     PORTB,CS                ; END OF WRITE COMMAND,
 DESELECT

        MOVLW   RDCFG
        TRIS    PORTB                   ; DIO = INPUT
        BSF     PORTB,CS                ; CS HIGH TO WAIT FOR ACK

WRITE5
	CALL	CHK_TIMER
	BTFSS	PORTB,DIO		; CHECK FOR ACK
	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			; POINT TO NEXT EE ADDR (DEFAULT)
	BSF	STATUS,PA0		; RE-SELECT PAGE #1
	RETLW	0H

;-------------------------------------------------------------------------
;
; FUNCTION     	: EEREAD ()
;
; DESCRIPTION  	: READ 16 BIT VALUE FROM EEPROM AND DECRYPT
;
; PAGE		: 0
;
;-------------------------------------------------------------------------
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                    ; SHIFT LO BYTE
        BCF     TMP2,0                  ; ASSUME BIT WILL BE 0
        BTFSC   PORTB,DIO               ; READ DIO LINE
        BSF     TMP2,0                  ; COPY BIT TO REGISTER
        BCF     PORTB,CLK               ; CLOCK LOW
        RLF     TMP1                    ; SHIFT HI BYTE
        DECFSZ  CNT1			; LOOP COUNTER
	GOTO	READ0
        BCF     PORTB,CS                ; END READ CYCLE

; ******* DECRYPT 16-BIT WORD READ FROM EEPROM ***************

IFNC
	MOVLW   16D
	MOVWF	CNT1

IFNC1
	CALL    ROTL
	MOVLW	07H			; MASK ONLY LOWER 3 BITS
        ANDWF   TMP1,W
	MOVWF	OUTBYT			; TEMPORY STORE RESULT
	MOVLW	(EE_KEY-KEYBASE)	; GET BASE ADDRES OF EEPROM KEY
	ADDWF	OUTBYT,W		; ... AND ADD TO RESULT
	CALL    KEY_LOOKUP		; KEY BYTE FROM KEY LOOKUP TABLE
        XORWF   TMP2
	DECFSZ	CNT1
        GOTO	IFNC1

	BSF	STATUS,PA0		; RE-SELECT PAGE #1
	RETLW	0H

;-------------------------------------------------------------------------
;
; FUNCTION     	: LEARN_OK ()
;
; DESCRIPTION  	: FLASH LED FOR 3 SEC [ INDICATE LEARN SUCCESSFUL ]
;
; PAGE		: 0
;
;-------------------------------------------------------------------------
LEARN_OK
	CLRF	CNT_HI			; RESET EVENT COUNTER
	CLRF	CNT_LW

LEARN_OK2
	CLRWDT				; RESET WATCHDOG TIMER
	BTFSS	TIMER0,7			; TEST FOR 32MS TIMEOUT
	GOTO	LEARN_OK2		; ... IF NOT WAIT

	BCF	TIMER0,7			; RESET TIMER0 CLOCK
	INCF	CNT_LW			; INCREASE 16 COUNTER
	BTFSC	STATUS,Z		; INCREASE UPPER BYTE IF ZERO
	INCF	CNT_HI

	BTFSS	CNT_LW,2
	BCF	PORTA,LED 		; FLASH LED @ 4HZ
	BTFSC	CNT_LW,2
	BSF	PORTA,LED

	BTFSS	CNT_LW,7		; WAIT FOR 3 SEK
	GOTO	LEARN_OK2
	GOTO	RESET			; RESET SYSTEM

;-------------------------------------------------------------------------
; PAGE 1:
;-------------------------------------------------------------------------
	ORG	200H


;-------------------------------------------------------------------------
; CALLS TO FIRST PAGE
;-------------------------------------------------------------------------

RESET1
	BCF	STATUS,PA0		; SELECT PAGE #0
	GOTO	RESET			; GOTO RESET

EE_READ1
	BCF	STATUS,PA0		; SELECT PAGE #0
	GOTO	EEREAD			; CALL EEPROM READ ROUTINE

EE_CLEAR1
	CLRF	TMP1			; CLEAR UPPER 16 BITS
	CLRF	TMP2			; ... AND THEN WRITE TO EEPROM

EE_WRITE1
	BCF	STATUS,PA0		; SELECT PAGE #0
	GOTO	EEWRITE			; CALL EEPROM WRITE ROUTINE

;-------------------------------------------------------------------------
;
; FUNCTION     	: CHK_PASS2 ()
;
; DESCRIPTION  	: CHECK FOR PASS2 VALUE IN SREG
;
; PAGE		: 1
;
;-------------------------------------------------------------------------
CHK_PASS2
	MOVLW	PASS2			; TEST IF ON 2ND PASS OF SELFLEARN
	XORWF	SREG,W			; ZERO BIT WILL BE SET
	RETLW	0

;-------------------------------------------------------------------------
;
; FUNCTION     	: WIPE_TX ()
;
; DESCRIPTION  	: WIPE CURRENT TX SERIAL NUMBER IN EEPROM
;
; PAGE		: 1
;
;-------------------------------------------------------------------------
WIPE_TX
	CLRF	TMP1			; SET TO ZERO
	CLRF	TMP2

	CALL	TX_LOOKUP		; TO GET BASR ADDRESS OF TX
	BSF	ADDRESS,1		; ADD 2 TO BASE ADDRESS

	CALL	EE_CLEAR1		; CLEAR LOWER 16 BITS
	CALL	EE_CLEAR1		; CLEAR UPPER 16 BITS
					; ... DO 1SEC ERROR LED NEXT

;-------------------------------------------------------------------------
;
; FUNCTION     	: ERROR_LED ()
;
; DESCRIPTION  	: LED ON FOR 1 SEC [ INDICATE ERROR ]
;
; PAGE		: 1
;
;-------------------------------------------------------------------------
ERROR_LED
	CLRF	CNT_HI
	CLRF	CNT_LW

ERROR_LED2
	CLRWDT				; RESET WATCHDOG TIMER
	BTFSS	TIMER0,7			; TEST FOR 32MS TIMEOUT
	GOTO	ERROR_LED2		; ... ELSE WAIT

	BCF	TIMER0,7			; RESET EVENT CLOCK
	INCF	CNT_LW			; INCREASE 16 COUNTER
	BTFSC	STATUS,Z		; INCREASE UPPER BYTE IF ZERO
	INCF	CNT_HI

	BSF	PORTA,LED		; LED ON TO INDICATE ERROR

	BTFSS	CNT_LW,5		; WAIT FOR 1 SEK
	GOTO	ERROR_LED2
	GOTO	RESET1			; RESET SYSTEM

;-------------------------------------------------------------------------
;
; FUNCTION     	: TX_LOOKUP ()
;
; DESCRIPTION  	: TRANSMITTER MEMORY LOOKUP TABLE
;
; PAGE		: 1	( NOTE : MUST BE LOWER HALF OF PAGE )
;
;-------------------------------------------------------------------------
TX_LOOKUP
	CALL	TX_LOOKUP2		; GET VALUE FROM LOOKUP TBLE BELOW
	MOVWF	ADDRESS			; STORE VALUE IN ADDRESS REGISTER
	RETLW	0

; ****** LOOKUP TABLE WITH BASE ADDRESS OF TRANSMITTERS ************

TX_LOOKUP2
	MOVFW	TXNUM			; GET CURRENT TRANSMITTER
	ADDWF	PC,1
	RETLW	10H			; TX0 BASE ADDRESS
	RETLW	18H			; TX1 BASE ADDRESS
	RETLW	20H			; TX2 BASE ADDRESS
	RETLW	28H			; TX3 BASE ADDRESS
	RETLW	30H			; TX4 BASE ADDRESS
	RETLW	38H			; TX5 BASE ADDRESS

;-------------------------------------------------------------------------
;
; FUNCTION     	: BUT_LOOKUP ()
;
; DESCRIPTION  	: TRANSMITTER BUTTON LOOKUP TABLE
;
; PAGE		: 1	( NOTE : MUST BE LOWER HALF OF PAGE )
;
;-------------------------------------------------------------------------
BUT_LOOKUP
	MOVFW	TXNUM			; GET CURRENT TRANSMITTER
	ADDWF	PC,1
	RETLW	02H			; TX0 BUTTON CODE ADDRESS
	RETLW	03H			; TX1 BUTTON CODE ADDRESS
	RETLW	08H			; TX2 BUTTON CODE ADDRESS
	RETLW	09H			; TX3 BUTTON CODE ADDRESS
	RETLW	0AH			; TX4 BUTTON CODE ADDRESS
	RETLW	0BH			; TX5 BUTTON CODE ADDRESS

;-------------------------------------------------------------------------
;
; FUNCTION     	: NTQ_KEYGEN ()
;
; DESCRIPTION  	: GENERATE A KEY USING MASTER KEY ( ADDR 40H IN ROM )
;
; PAGE		: 1
;
;-------------------------------------------------------------------------
NTQ_KEYGEN
	MOVLW	KEY7			; POINT TO FIRST KEY BYTE
	MOVWF	FSR

	MOVLW	(MAS_KEY-KEYBASE+7)	; GET TABLE MSB OFFSET FOR M KEY
	MOVWF	CNT1

	MOVLW	8H			; INDICATE 8 BYTE TO READ
	MOVWF	CNT0			; BYTE COUNTER

NTQ_KEYGEN2
	BCF	STATUS,PA0		; SELECT PAGE #0
	MOVFW	CNT1
	CALL	KEY_LOOKUP		; GET BYTE FROM LOOKUP TABLE
	MOVWF	IND			; STORE BYTE IN KEY BYTE
	DECF	FSR			; NEXT ENTRY IN CIRCULAR BUFFER
	DECF	CNT1			; NEXT ENTRY IN KEY LOOKUP TABLE
	BSF	STATUS,PA0		; RE-SELECT PAGE #1
	DECFSZ	CNT0			; ALL BYTES READ
	GOTO	NTQ_KEYGEN2		; ... NO THEN READ NEXT BYTE
	MOVFW	KEY0			; SWAP KEY1 AND KEY0
	MOVWF	OUTBYT			; NOTE :THIS MUST BE DONE BECAUSE
	MOVFW	KEY1			;       THE TMP1 & TMP2 (KEY0 &
	MOVWF	KEY0			; 	KEY1) REGISTERS IS ALSO
	MOVFW	OUTBYT			;       USED  DURING DECRYPTION
	MOVWF	KEY1			;       (KEYGEN)

	BCF	STATUS,PA0		; SELECT PAGE #0
	CALL	DECRYPT 		; DECRYPT 32 BIT USING MASTER KEY
	BSF	STATUS,PA0		; RE-SELECT PAGE #1

	MOVFW	HOP2			; GET LOW 16BIT OF DECRYPTED WORD
	MOVWF	TMP1
	MOVFW	HOP1
	MOVWF	TMP2
	CALL	EE_WRITE1		; ... AND WRITE TO EEPROM

	MOVFW	HOP4			; GET UP 16 BIT OF DECRYPTED WORD
	MOVWF	TMP1
	MOVFW	HOP3
	MOVWF	TMP2
	CALL	EE_WRITE1		; ... AND WRITE TO EEPROM

	BTFSC	ADDRESS,1		; TEST IF FIRST 32BIT OF KEY GEN.
	GOTO	S_SEED2			; ... IF SO GENERATE SECOND 32BITS
	GOTO	CALC_END		; ... ELSE KEYGEN COMPLETE

;-------------------------------------------------------------------------
;
; FUNCTION     	: CALC_KEY ()
;
; DESCRIPTION  	: CALCULATE NEW KEY FROM RECEIVED SERIAL NUMBER
;
; PAGE		: 1
;
;-------------------------------------------------------------------------
CALC_KEY
	MOVFW	HOP1			; STORE 32 BIT HOPCODE IN THE
	MOVWF	ETMP1			; EXTENDED TEMP BUFFER
	MOVFW	HOP2
	MOVWF	ETMP2
	MOVFW	HOP3
	MOVWF	ETMP3
	MOVFW	HOP4
	MOVWF	ETMP4

	CALL	TX_LOOKUP		; GET TRANSMITTER BASE ADDRESS
	BSF	ADDRESS,1		; ADD 2 TO BASE ADDRESS

	MOVFW	SER_2			; GET LOWER 16 BIT OF SERIAL NR
	MOVWF	TMP1
	MOVFW	SER_3
	MOVWF	TMP2
	CALL	EE_WRITE1		; ... AND WRITE TO EEPROM

	MOVFW	SER_0			; GET UPPER 16 BIT OF SERIAL NR
	MOVWF	TMP1
	MOVFW	SER_1
	MOVWF	TMP2
	CALL	EE_WRITE1		; ... AND WRITE TO EEPROM

S_SEED1
	MOVLW	20H			; PATCH IF TX IS MCHIP HCS ENCODER
	BTFSC	FLAGS,NTQ106
	MOVLW	2BH			; PATCH IF TX IS A NTQ106 ENCODER
	IORWF	SER_0,W
	MOVWF	DAT1

	MOVFW	SER_1			; GET SERIAL NR FROM RX BUFFER
	MOVWF	DAT2
	MOVFW	SER_2
	MOVWF	DAT3
	MOVFW	SER_3
	MOVWF	DAT4
	GOTO	NTQ_KEYGEN		; GENERATE FIRST 32 KEY BITS

S_SEED2
	CALL	TX_LOOKUP		; GET TRANSMITTER BASE ADDRESS
	BSF	ADDRESS,1		; ADD 2 TO BASE ADDRESS
	CALL	EE_READ1		; READ LOW 16BITS OF SER # FROM EE
	MOVFW	TMP1
	MOVWF	DAT3
	MOVFW	TMP2
	MOVWF	DAT4

	INCF	ADDRESS
	CALL	EE_READ1		; READ UP 16BITS OF SER # FROM EE
	MOVLW	60H			; PATCH IF TX IS MCHIP HCS ENCODER
	BTFSC	FLAGS,NTQ106
	MOVLW	65H			; PATCH IF TRANSMITTER IS A NTQ106
	IORWF	TMP1,W
	MOVWF	DAT1
	MOVFW	TMP2
	MOVWF	DAT2

	INCF	ADDRESS			; POINT TO UPPER 32 BITS OF KEY
	INCF	ADDRESS
	INCF	ADDRESS
	GOTO	NTQ_KEYGEN		; GENERATE SECOND 32 KEY BITS

CALC_END
	MOVFW	ETMP1			; RECOVER 32 BIT HOPCODE FROM
	MOVWF	HOP1			; EXTENDED BUFFER
	MOVFW	ETMP2
	MOVWF	HOP2
	MOVFW	ETMP3
	MOVWF	HOP3
	MOVFW	ETMP4
	MOVWF	HOP4

	CLRF	CNT_HI			; RESET EVENT CLOCK
	CLRF	CNT_LW
	GOTO	M_HOP

;-------------------------------------------------------------------------
;
; FUNCTION     	: NTQ_ERASE ()
;
; DESCRIPTION  	: ERASE ALL TRANSMITTERS
;
; PAGE		: 1
;
;-------------------------------------------------------------------------
NTQ_ERASE
	BSF	PORTA,LED		; SET LED ON

	MOVLW	1H			; POINT TO LEARN POINTER ADDRESS
	MOVWF	ADDRESS
	CALL	EE_CLEAR1		; NOTE: CURNT PAGE BIT SET TO #0

	CLRF	TXNUM			; POINT TO 1ST TX POSISTION IN EE
NTQ_ERASE2
	CALL	TX_LOOKUP		; GET TX BASE ADRESS
	BSF	ADDRESS,1		; ADD 2 TO BASE ADDRESS

	CALL    EE_CLEAR1	        ; CLEAR LOW 16BITS OF SERIAL NR
	CALL    EE_CLEAR1 	        ; CLEAR UP 16BITS OF SERIAL NR

	INCF	TXNUM			; POINT TO NEXT EEPROM INDEX
	MOVLW	6H			; TEST FOR LAST POSITION
	SUBWF	TXNUM,W
	SKPC				; IF NOT UPDATE NEXT ENTRY
	GOTO	NTQ_ERASE2
	BCF	PORTA,LED		; LED OFF TO IND ERASE ALL COMPLTE

M_ERASE3
	CLRWDT				; RESET WATCHDOG TIMER
	MOVLW	TRISA			; UPDATE TRI-STATE REGISTER
	TRIS	PORTA
	BTFSS	PORTA,LEARN		; WAIT FOR BUTTON LIFT
	GOTO	M_ERASE3
	GOTO	MAIN2			; THEN WAIT FOR NEXT TRANMISSION

;-------------------------------------------------------------------------
;
; FUNCTION     	: READ_KEY ()
;
; DESCRIPTION  	: READ 64 BIT KEY FROM EEPROM [CSR0:CSR7]
;
; PAGE		: 1
;
;-------------------------------------------------------------------------
READ_KEY
	MOVLW	3H			; POINT TO MSB OF KEY
	ADDWF	ADDRESS,1

	MOVLW	KEY7			; POINT TO LSB OF 64 BIT SHFT REG
	MOVWF	FSR
	MOVLW	3H			; READ 3x16BIT VALUES FROM EEPROM
	MOVWF	CNT2

READ_KEY2
	CALL	EE_READ1		; READ LOWER 16 BITS
	MOVFW	TMP1			; GET UPPER 8 BITS

⌨️ 快捷键说明

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