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

📄 复件 rx_qk_c.c

📁 这是一个用630编码和用630解码的多控源码
💻 C
字号:
#define		RF_IN		5,4
unsigned char rx_length,CNT0,CNT1;
extern unsigned char CSR0,CSR1,CSR2,qk_cnt,dk_cnt;
unsigned char recieve(void)
{	
	

#asm
;*************************************************************************
; recevive function
;*************************************************************************
			STATUS 	EQU		3
			C		EQU		0
			Z		EQU		2	
			recieve	CODE
RcCEIVE
			clrf	_ik_cnt
			clrf	_ik_cnt	
			movlw	24			; Code length 24
			movwf	_rx_length			; Rx Counter for the Hopping Code!!	
			clrf	_CNT0				; Normal is Low on Keeloq input pin
			btfsc	RF_IN				; Is RF_IN = High ??
			goto	GO_Calibrate		; Yes, Goto Calibrate portion

			clrf	_CNT0
			clrf	_CNT1
SEE_FIRST_HIGH							; Check Low period is over 18mS 
			brfsc	RF_IN				; [2]RF_IN = 0
			goto	GO_Calibrate    	; 	RF_IN=1 , GO_Calibrate TE
			incf	CNT0,F				; [3]CNT0=255 then loop time =2.55mS
			btfsc	STATUS,Z			; [5]CNT0 Overflow ??
			incf	_CkT1,F				;  	Yes ! CNT1 + 1
			movf	_CNT1,W				; [6]
			sublw	6   				; [7]CNT1 > 6?
			btfsc	STATUS,C			; 
			goto	SEE_FIRST_HIGH		; [10]No , Sample Again !!
			goto	RECEIVE_Fail		;  Low Period is over 18mS 		

GO_Calibrate							; Start to Check hi signal time 
			clrf	_CNT0				; Check High period is over 640uS?
Cal_1									;  
			nop							; [1]  loop time 10us
			goto	$+1					; [3]
			btfss	RF_IN				; [5] 		RF_IN = LOW ?
			goto	Cal_2				; 		Yes , goto Cal_2
			incf	_CNT0,F				; [6]	No, Increase CNT0
			btfsc	_CNT0,6				; [8] 	High Time Exceed 640uS
			goto	RECEIVE_Fail		; 		Yes , Receive Fail " Return 0 "
			goto	Cal_1				; [10]	No,   Continue to Sample RF_IN
;
Cal_2							
			movf	_CNT0,W
			SUBLW	16
			btfsc	STATUS,C
			goto	RECEIVE_Fail		; Yes , Receive wide <160 uS Fail " Return 0 "	
			
			clrf	_CNT1
Cal_3   								; Check Sync Header period is over 18mS?
										; 	Loop Time =  10uS  @4MHz ,
			btfsc	RF_IN				; [2]RF_IN = 0
			goto	Calcute_TE			; 	RF_IN=1 , Calcute the Length of TE
			incf	_CNT0,F				; [3]CNT0=255 then loop time = 2.55mS
			btfsc	STATUS,Z			; [5]CNT0 Overflow ??
			incf	_CNT1,F				;  	Yes ! CNT1 + 1
			movf	_CNT1,W				; [6]
			sublw	6					; [7]CNT1 > 6 ?
			btfsc	STATUS,C			; [8]
			goto	Cal_3				; [10]No , Sample Again !!
			goto	RECEIVE_Fail		; 	CNT1 >6 , Low Period is over 18mS 
;******************************************************************************
;****	Calctue the SYNC Header period of RF_IN
;****	Receive Fail if The time less than 2.55 ms 
;******************************************************************************
Calcute_TE		
			movf	_CNT1,W
			sublw	2					; Check CNT1=0 ? IF =0 Low Period is under 2.55*3mS, Fail Receive.
			btfsc	STATUS,C
			goto	RECEIVE_Fail		; Fail Low period, It is not a SYNC Header (2.6mS*3-18mS)	
			bcf		STATUS,C			; 
			RLF		_CNT0,F
			RLF		_CNT1,F
			bcf		STATUS,C			; 
			RLF		_CNT0,F
			RLF		_CNT1,F	
			bcf		STATUS,C			; 
			RLF		_CNT0,F
			RLF		_CNT1,F				
			
			btfsc	_CNT0,7
			incf	_CNT1,F				; si se wu ru	
			movf	_CNT1,W
			movwf	_CNT0
						

;******************************************************************************
; Now !! The TE is stored to CNT0 with 4 us Base
; Important !!  Substract 4 us from CNT0 for first Data 
;******************************************************************************	

;	
FIRST_KEELOQ_DATA
			movlw	4					; Each value on CNT0 are 10uS
			subwf	_CNT0,W				; Finetune the First sampling time
			movwf	_CNT1				; save to CNT1 
			bcf		STATUS,C
			rrf		_CNT1,F				; Check @ 1/2 TE location !!
;
PHASE_1_Delay			
			goto	$+1					;[2]  10uS delay time base for 1 TE
			goto	$+1 				;[2]
			goto	$+1 				;[2]
			nop							;[1]
			decfsz	_CNT1,F				;[1]	
			goto	PHASE_1_Delay		;[2]	
			btfss	RF_IN				; Does Simple-Point "A" is high?
			goto	RECEIVE_Fail		; Still Low, Fail receive data	
PHASE_2_init
			movf	_CNT0,W				; Load TE value to CNT1 Reg.
			movwf	_CNT1
PHASE_2_Delay
			goto	$+1					;[2]  10uS delay time base for 1 TE
			goto	$+1 				;[2]
			goto	$+1 				;[2]
			nop							;[1]
			decfsz	_CNT1,F
			goto	PHASE_2_Delay
			btfss	RF_IN				; Is Logical 1 ??
			goto	P3_init_L			
		
P3_init_H
			movf	_CNT0,W				; Load TE value to CNT1 Reg.
			movwf	_CNT1
PHASE_3_Delay_H							;1527_h
			goto	$+1					;[2]  10uS delay time base for 1 TE
			goto	$+1 				;[2]
			goto	$+1 				;[2]
			nop							;[1]
			decfsz	_CNT1,F
			goto	PHASE_3_Delay_H
			btfss	RF_IN				; Test Sample-point "C", it must be High Level
			goto	PHASE_3_Delay_HL
		    bsf		STATUS,C			; No , Set C as 1
			call	ROT_CSRs			; Store 1 bit Hopping data to [CSR0-8] Reg.
			incf	_dk_cnt
			movf	_qk_cnt,W
			btfss	STATUS,Z
			goto	RECEIVE_Fail
		    goto	PHASE_4_init

P3_init_L
			movf	_CNT0,W				; Load TE value to CNT1 Reg.
			movwf	_CNT1
PHASE_3_Delay_L							;1527_l
			goto	$+1					;[2]  10uS delay time base for 1 TE
			goto	$+1 				;[2]
			goto	$+1 				;[2]
			nop							;[1]
			decfsz	_CNT1,F
			goto	PHASE_3_Delay_L
			btfsc	RF_IN				; Test Sample-point "C", it must be Low Level
			goto	PHASE_3_Delay_LH
			bcf		STATUS,C			; No , Set C as 0
			call	ROT_CSRs			; Store 1 bit Hopping data to [CSR0-8] Reg.
			incf	_dk_cnt
			movf	_qk_cnt,W
			btfss	STATUS,Z
			goto	RECEIVE_Fail
			goto	PHASE_4_init
PHASE_3_Delay_HL						;qk_h
			bsf		STATUS,C			; No , Set C as 1
			call	ROT_CSRs			; Store 1 bit Hopping data to [CSR0-8] Reg.
			incf	_qk_cnt
			movf	_dk_cnt,W
			btfss	STATUS,Z
			goto	RECEIVE_Fail
		    goto	PHASE_4_init
PHASE_3_Delay_LH						;qk_l
			bcf		STATUS,C			; No , Set C as 1
			call	ROT_CSRs			; Store 1 bit Hopping data to [CSR0-8] Reg.
			incf	_qk_cnt
			movf	_dk_cnt,W
			btfss	STATUS,Z
			goto	RECEIVE_Fail
		    goto	PHASE_4_init
PHASE_4_init
			movlw	0x02				; Fine-tune the TE
			subwf	_CNT0,W
			movwf	_CNT1	
PHASE_4_Delay
			goto	$+1					;[2]  10uS delay time base for 1 TE
			goto	$+1 				;[2]
			goto	$+1 				;[2]
			nop							;[1]
			decfsz	_CNT1,F				;[1]	
			goto	PHASE_4_Delay		;[2]	
			btfsc	RF_IN				; Does Simple-Point "A" is low?
			goto	RECEIVE_Fail		; Still high, Fail receive data		
Phase_5_init
			movf	_CNT0,W
			movwf	_CNT1
	; over 1 TE that input signal still is low, Fail receive!
Finish_a_bit							; Reload CNT0 value to CNT1 for next bit comming	
			decfsz	rx_length,F		; Check total Rx data langth?
			goto	Init_For_Next		; Receive isn't complete yet, Continue receive
			goto	RECEIVE_A_FRAME		; Receive a complete hopping code
; 
Init_For_Next							; Reload CNT0 value to CNT1 for next bit comming
			movf	_CNT0,W
			movwf	_CNT1
			bcf		STATUS,C
			rrf		_CNT1,F				; Wait 1/2 TE 
			goto	PHASE_1_Delay		
;
RECEIVE_A_FRAME
;			btfss	rx_led_f
;			goto	rx_on
;rx_off
;			bcf		rx_led_f			
;			bsf		STATUS,C
;			retlw	0x01
;rx_on		
;			bsf		rx_led_f
			bsf		STATUS,C
			retlw	0x01					
RECEIVE_Fail
			bcf		STATUS,C
			retlw	0x00
;
;*****************************************************
;****	Rotate CSRs register right 1 bit
;*****************************************************
ROT_CSRs
                
       	 	RLF     _CSR0,F                     
        	RLF     _CSR1,F                    
        	RLF     _CSR2,F     
#endasm
}

⌨️ 快捷键说明

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