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

📄 12f629=keelog.asm

📁 12f629单片机解码KEELOG源码,遥控器滚动码常用
💻 ASM
📖 第 1 页 / 共 3 页
字号:
RCV6
	CLRC
	RRF     CNT1
	RRF     CNT0
	RRF     CNT1
	RRF     CNT0
	RRF     CNT1
	RRF     CNT0                    ; TOTAL:  7 us
									; DIVIDE CNT1:CNT0 BY 8 (600/8=75)
	MOVLW   MIN/80
	SUBWF   CNT0,W
	BTFSS   STATUS,C				; NEGATIVE?
	GOTO    RMT_0                   ; YES--HEADER SHORTER THAN MIN.

; ************* VALID HEADER RECEIVED *********************
RCV7
	MOVLW   NBITS                   ; VALID START MARKER WAS RECEIVED
	MOVWF   CNT1
	MOVF    CNT0,W
	MOVWF   CNT2                    ; CNT2 = CNT0
	MOVLW   5
	SUBWF   CNT2,1
	GOTO    DL1                     ;清第一字节

;*************** 等待下一字节 ************************

RCV8					      ; Timeout = 1BPW
	MOVLW   1H                  ;补偿RTCC
	SUBWF   CNT0,0            ; and CSR processing
	MOVWF   CNT2
RCV9
	BTFSC   GPIO,RFIN              ; (2) 等待下一个上升沿到来
	GOTO    RCV11                   ; (0) 如果上升沿到取样
	GOTO    $+1                     ; (2) 延时2MS
	CLRWDT                          ; (1) 清WDT
	DECFSZ  CNT2                    ; (1) 消耗时间
	GOTO    RCV9                    ; (2) 回到循环
RCV9A
	RLF     CNT0,W
	MOVWF   CNT2                    ; 6xCNT0x2 = 3/2(CNT2x8) = 1.5 Te
RCV10
	BTFSC   GPIO,RFIN              ; (2) Check if clear - Data
	GOTO    RMT01					; (0) 如果高-引导头
	CLRWDT                          ; (1) 清WDT
	DECFSZ  CNT2,1                  ; (1)消耗时间
	GOTO    RCV10                   ; (2)回到循环

	MOVLW   0FFH                    ;计时时间 = 1.18 Te(max)
	MOVWF   CNT2                    ; Refer to explanation above
RCV10A
	BTFSC   GPIO,RFIN              ; (2) 等待下一上升沿到来
	GOTO    RCV11                   ; (0) 上升沿到--处理
	DECFSZ  CNT2,1                  ; (1) 消耗时间
	GOTO    RCV10A                  ; (2) 回到循?
	GOTO    RMT01					; (0) (5)计时时间--没有发现边沿
RCV11
	MOVF    CNT0,W                  ;校准计数器
	MOVWF   CNT2                    ; 

	DECF    CNT2
	DECF    CNT2
	GOTO    $+1
DL1
	CLRWDT                          ; RESET WATCHDOG TIMER
	DECFSZ  CNT2                    ;
	GOTO    DL1                     ; CNT0 X 4 us

	BTFSS   GPIO,RFIN              ; 输入高吗? 第一个样
	GOTO    RMT01					; NO--ERROR

	MOVF    CNT0,W                  ; 校准计数器
	MOVWF   CNT2                    ; (NOMINALLY 75 FOR 300 us PULSE)
	DECF    CNT2
	CLRC                            ; 
	RLF     CNT2                    ; 乘2 FOR 600 us
	GOTO    $+1
DL2
	CLRWDT                          ; RESET WATCHDOG TIMER
	DECFSZ  CNT2
	GOTO    DL2                     ; CNT0 X 4 us
	BCF     FLAGS,BITIN             ; CLEAR BIT POSITION
	BTFSS   GPIO,RFIN              ; 输入高吗?
	BSF     FLAGS,BITIN             ; MAKE 1 IF LINE LOW
	MOVF    CNT0,W                  ; CALIBRATION COUNTER
	MOVWF   CNT2                    ; (NOMINALLY 75 FOR 300 us PULSE)
	CLRC                            ; OPTIONAL--LITTLE DIFFERENCE
	RLF     CNT2                    ; 乘2 FOR 600 us
	MOVLW	5						; [1]
	SUBWF	CNT2					; [1]
	BCF		STATUS,C					; [1]
	CALL    ROT_SHIFT               ; [10]+[2] CSR SHIFT + CALL
	BTFSC   FLAGS,BITIN				; [1]
	BSF     CSR7,7					; [1]
DL3
	CLRWDT                          ; RESET WATCHDOG TIMER
	DECFSZ  CNT2                    ;
	GOTO    DL3                     ; CNT0 X 4 us
	BTFSC   GPIO,RFIN              ; 输入是低? 第三个取样
	GOTO    RMT0                    ;NO--接收--错误
	CALL    TST_RTCC                ; 检查 RTCC
	DECFSZ  CNT1                    ; 最后的字节?
	GOTO    RCV8                    ; 没有获得下一字节
	GOTO    RMT1
RMT_0
	BSF     CNT1,4              ;引道头错误, HEADER ERROR--FORCE COUNTER > 8
RMT0					       ; HERE IF FAIL ON 3RD SAMPLE
	DECF	CNT1,1		       ; COMPENSATE FOR ROTATE BEFORE DL3
RMT01					       ; HERE IF FAIL ON 1ST SAMPLE
	CALL    TST_RTCC           ; CHECK RTCC
	MOVLW   9H                      ; TEST FOR NTQ106 TRANSMISSION
	SUBWF   CNT1,W                  ;如果进位标示设置(接收不 OK)
	BTFSC   STATUS,C	
    RETURN
RMT2
	CALL    ROT_SHIFT               ; COMPLETE 64-BIT SHIFT
	DECFSZ  CNT1                    ; 完成64位的移位,COMPLETE 64-BIT SHIFT
	GOTO    RMT2
	CLRF    SER_0                     ;清序列?寄存器, CLEAR UPPER BYTE OF SERIAL NR
	BSF     FLAGS,NTQ106            ; INDICATE NTQ106 TX RECEIVED
RMT1	
	CLRC					;  [ 接收 OK ]
	MOVFW	SREG
	XORLW	PASS2
	SKPNZ					; DON'T CLR TXNUM CONTAINS LRN POS
	RETLW	0

	BTFSS	FLAGS,OUT_500	; TEST IF 500 MS TIMEOUT 
	BSF		GPIO,LED		; ... IF SO SET LED ONvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
	CLRC
	RETLW   1                       ; RETURN WITH 1 

;-------------------------------------------------------------------------
; 功能     	:学习测试()	      			
; DESCRIPTION  	: TEST AND HANDLE LEARN BUTTON
;-------------------------------------------------------------------------
TST_LEARN1
	CLRWDT					; 清WDT寄存器
	BTFSC	GPIO,LEARN		; 检查学习按钮是否按下
	RETURN
	CLRF	CNT_HI			;有清寄存器高字节
	CLRF	CNT_LW          ;清寄存器高字节
TST_LEARN2
	CALL	TST_RTCC		; 更新RTCC,  CALL RTCC UPDATE ROUTINE
	BTFSS	CNT_HI,0	    ; TEST FOR ERASE TIMEMOUT,8.2 SEC
	GOTO	TST_LEARN3		; IF NOT WAIT FOR LEARN KEY LIFT
	MOVLW	PASS1			; INDICATE FIRST STATE OF LEARN
	MOVWF	SREG
	GOTO	NTQ_ERASE		; ERASE ALL LEARNED TRANSMITTERS
TST_LEARN3
	BSF		GPIO,LED		; LED亮指示学习模式, ON TO INDICATE LEARN 
	BTFSS	GPIO,LEARN		; 等侍按钮松开
	GOTO	TST_LEARN2		; ... 如果没松开检查时间
	MOVLW	2H				; 测试如果按下大干64MS
	SUBWF	CNT_LW,W					       
	SKPC
    RETURN
	MOVLW	PASS1			; 指示第一次通过
	MOVWF	SREG
    RETURN
;-------------------------------------------------------------------------
; 功能     	: 学习成功 ()
; 描述  	: LED闪亮3秒 [ 指示学习成功 ]
;-------------------------------------------------------------------------
LEARN_OK
	CLRF	CNT_HI			; RESET EVENT COUNTER		
	CLRF	CNT_LW
LEARN_OK2
	CLRWDT				    ; RESET WATCHDOG TIMER
	BTFSS	TMR0,7		    ; TEST FOR 32MS TIMEOUT
	GOTO	LEARN_OK2		; ... IF NOT WAIT
	BCF		TMR0,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		GPIO,LED 		; FLASH LED @ 4HZ
	BTFSC	CNT_LW,2		
	BSF		GPIO,LED
	BTFSS	CNT_LW,7		; WAIT FOR 3 SEK
	GOTO	LEARN_OK2
	GOTO	RESET			; RESET SYSTEM
;-------------------------------------------------------------------------
; CALLS TO FIRST PAGE
;-------------------------------------------------------------------------
EE_CLEAR1
	CLRF	TMP1			;CLEAR UPPER 16 BITS
	CLRF	TMP2			;... AND THEN WRITE TO EEPROM
	GOTO	EEWRITE			; CALL EEPROM WRITE ROUTINE
;-------------------------------------------------------------------------
; FUNCTION     	: CHK_PASS2 ()
; DESCRIPTION  	: CHECK FOR PASS2 VALUE IN SREG
;-------------------------------------------------------------------------
CHK_PASS2
	MOVLW	PASS2			;TEST IF ON 2ND PASS OF SELFLEARN
	XORWF	SREG,W			;ZERO BIT WILL BE SET 
    RETURN
;-------------------------------------------------------------------------
; FUNCTION     	: WIPE_TX ()
; DESCRIPTION  	: WIPE CURRENT TX SERIAL NUMBER IN EEPROM
;-------------------------------------------------------------------------
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 NEX
;-------------------------------------------------------------------------
; FUNCTION     	: ERROR_LED ()
; DESCRIPTION  	: LED ON FOR 1 SEC [ INDICATE ERROR ]
;-------------------------------------------------------------------------
ERROR_LED
	CLRF	CNT_HI			
	CLRF	CNT_LW

ERROR_LED2
	CLRWDT				    ; RESET WATCHDOG TIMER
	BTFSS	TMR0,7		; TEST FOR 32MS TIMEOUT 
	GOTO	ERROR_LED2		; ... ELSE WAIT
	BCF		TMR0,7			; RESET EVENT CLOCK
	INCF	CNT_LW			; INCREASE 16 COUNTER
	BTFSC	STATUS,Z		; INCREASE UPPER BYTE IF ZERO
	INCF	CNT_HI			
	BSF		GPIO,LED		    ; LED ON TO INDICATE ERROR
	BTFSS	CNT_LW,5		; WAIT FOR 1 SEK
	GOTO	ERROR_LED2
	GOTO	RESET			; RESET SYSTEM
;-------------------------------------------------------------------------
; FUNCTION     	: NTQ_KEYGEN ()	      			
; DESCRIPTION  	: GENERATE A KEY USING MASTER KEY ( ADDR 40H IN ROM )
;-------------------------------------------------------------------------
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
	MOVFW	CNT1
	CALL	KEY_LOOKUP		; GET BYTE FROM LOOKUP TABLE
	MOVWF	INDF				; STORE BYTE IN KEY BYTE
	DECF	FSR				; NEXT ENTRY IN CIRCULAR BUFFER
	DECF	CNT1			; NEXT ENTRY IN KEY LOOKUP TABLE
	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)
	CALL	DECRYPT 		; DECRYPT 32 BIT USING MASTER KEY
	MOVFW	HOP2			; GET LOW 16BIT OF DECRYPTED WORD
	MOVWF	TMP1			
	MOVFW	HOP1
	MOVWF	TMP2
	CALL	EEWRITE		; ... AND WRITE TO EEPROM 
	MOVFW	HOP4			; GET UP 16 BIT OF DECRYPTED WORD
	MOVWF	TMP1
	MOVFW	HOP3
	MOVWF	TMP2
	CALL	EEWRITE		; ... 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  	: 计算刚接收到的32位码
;-------------------------------------------------------------------------
CALC_KEY
	MOVFW	HOP1			;存储32位码到临时寄存器
	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			; 获得下半部16位序列号
	MOVWF	TMP1
	MOVFW	SER_3
	MOVWF	TMP2
	CALL	EEWRITE		    ; ... 写入EE
	MOVFW	SER_0			;获得上半部16位序列号,
	MOVWF	TMP1
	MOVFW	SER_1
	MOVWF	TMP2
	CALL	EEWRITE		    ; ...写入EE
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		;?生最初32位?匙, FIRST 32 KEY BITS
S_SEED2	
	CALL	TX_LOOKUP		; GET TRANSMITTER BASE ADDRESS
	BSF		ADDRESS,1			; ADD 2 TO BASE ADDRESS
	CALL	EEREAD		; READ LOW 16BITS OF SER # FROM EE
	MOVFW	TMP1
	MOVWF	DAT3
	MOVFW	TMP2
	MOVWF	DAT4
	INCF	ADDRESS			
	CALL	EEREAD		;?存?器?16位序列? 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		;?生第二?32位?匙 GENERATE SECOND 32 KEY BITS

CALC_END
	MOVFW	ETMP1			; ???器恢复32位的?匙,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
;-------------------------------------------------------------------------
NTQ_ERASE
	BSF		GPIO,LED		; LED亮
	MOVLW	1H				; 指示??地址
	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	    ; 清除低16位的序列?,CLEAR LOW 16BITS OF SERIAL NR
	CALL    EE_CLEAR1 	    ; 清除高16位的序列?,CLEAR UP 16BITS OF SERIAL NR
	INCF	TXNUM			;指向下存EE的下一位置.
	MOVLW	6H				; TEST FOR LAST POSITION
	SUBWF	TXNUM,W
	SKPC					; IF NOT UPDATE NEXT ENTRY
	GOTO	NTQ_ERASE2
	BCF		GPIO,LED			;LED熄灭所的擦除完成.
M_ERASE3
	CLRWDT					; RESET WATCHDOG TIMER
	BSF     3,5
    MOVLW	GPIOS			; UPDATE TRIS REGISTER FOR PORTA
	MOVWF   TRISIO
    BCF     3,5
	BTFSS	GPIO,LEARN		; 等候按?松?,WAIT FOR BUTTON LIFT
	GOTO	M_ERASE3	 
	GOTO	MAIN2			; THEN WAIT FOR NEXT TRANMISSION

;-------------------------------------------------------------------------
; FUNCTION     	: 读密匙 ()	      			
; DESCRIPTION  	: 读存储器?64字节密匙 [CSR0:CSR7] 
;-------------------------------------------------------------------------
READ_KEY
	MOVLW	3H			; 指向密匙的高字节地址
	ADDWF	ADDRESS,1	
	MOVLW	KEY7		;指向64位的低字节移位寄存器
	MOVWF	FSR	
	MOVLW	3H			;  3x16字节值
	MOVWF	CNT2
READ_KEY2
	CALL	EEREAD		; ?低16字?
	MOVFW	TMP1		; GET UPPER 8 BITS
	MOVWF	INDF			; STORE 1ST 8BITS IN 64BT SHIFT REG
	DECF	FSR			; POINT TO NEXT BYTE IN SHIFT REG
	MOVFW	TMP2		; GET LOWER 8 BITS
	MOVWF	INDF			; STORE 2ND 8BITS IN 64BT SHFT REG
	DECF	FSR			; POINT TO NEXT BYTE IN SHIFT REG
	DECF	ADDRESS		; POINT TO NEXT EEPROM ADDRESS
	DECFSZ	CNT2		; ALL THREE 16-BIT WORDS READ
	GOTO	READ_KEY2	; ... IF NOT GET NEXT 
	CALL	EEREAD		; READ LOWER 16 BITS
	GOTO	M_DEC		; 回到主循?
;-------------------------------------------------------------------------
; FUNCTION     	: ?存?器 ()	      			
; DESCRIPTION  	: 加密16字?值并?入存?器
;用BANKSEL宏指令方便移植到任何CPU
;-------------------------------------------------------------------------
EEWRITE
	CLRC
	RLF		ADDRESS,W  ;因微芯原程序用的是93C46读写16字节的方试所以每次地址都要加2.
	MOVWF	ADDR
	MOVF	TMP2,W
	MOVWF	OUTBYT
	CALL	W_EE
    BANKSEL EECON1
    CLRWDT
    BTFSC	EECON1,WR	;WAIT FOR
	GOTO	$-2
    BANKSEL ADDR	
	INCF	ADDR,1
	MOVF	TMP1,W
	MOVWF	OUTBYT
	CALL	W_EE
    BANKSEL EECON1
    CLRWDT
    BTFSC	EECON1,WR	;WAIT FOR
	GOTO	$-2
    BANKSEL ADDR
	INCF	ADDRESS,1	
	RETURN

W_EE 
    BANKSEL EECON1
    CLRWDT
	BTFSC	EECON1,WR	;WAIT FOR
	GOTO	$-2			;WRITE TO FINISH
	BANKSEL EEADR
	MOVF	ADDR,W
	MOVWF	EEADR		;WRITE TO
	MOVF	OUTBYT,W	;DATA TO
	MOVWF	EEDATA		;WRITE 
	BANKSEL EECON1
	BSF		EECON1,WREN  ;ENABLE WRITES
						;ONLY DISABLE INTERRUPTS
	BCF		INTCON,GIE	;IF ALREADY ENABLED,OTHER DISCARD
	MOVLW	0X55		;WRITE 55H TO EECON2
	MOVWF	EECON2
	MOVLW	0XAA
	MOVWF	EECON2		  ;WRITE AAH TO EECON2
	BSF		EECON1,WR	  ;START WRITE OPERATION ONLY ENABLE INTERRUPTS
	BCF		EECON1,WREN 	;DISABLE WRITES
	BANKSEL	GPIO
	RETURN
;-------------------------------------------------------------------------
; 功能    	: 读ee ()	      			
; 描述 		: ee
;-------------------------------------------------------------------------
R_EE
	MOVF	ADDR,W
	BANKSEL	EEADR
	MOVWF	EEADR		;TO READ FROM
	BANKSEL	EECON1
	BSF		EECON1,RD	;START READ OPERATION
	BANKSEL	EEDATA
	MOVF	EEDATA,W	;W=EEDATA
	BANKSEL	GPIO
	MOVWF	OUTBYT
	RETURN		
EEREAD			
	CLRC

⌨️ 快捷键说明

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