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

📄 ap0610-receive.asm

📁 定时器
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;起始码判断接收
RF_RECEIVE:	
RF:
	CLRWDT
	BTFSS	RF_IN
	GOTO	RF_ERROR
	MOVLW	.7						;先判断360us高,保证至少220us高,否则出错
	MOVWF	COUNT_RF
RF1_0
	BTFSS RF_IN             
	GOTO RF_ERROR			
	CALL DELAY18US
	DECFSZ COUNT_RF,F
	GOTO RF1_0
	MOVLW .15						;开始检测低,若超过300us接收不到低,出错
;	MOVLW .25
	MOVWF COUNT_RF
RF1_1  
	BTFSS RF_IN             
	GOTO RF1_2						; 在合法时间内接收到低,同步起始头高合法,转检测11600us低
	CALL DELAY18US
	DECFSZ COUNT_RF,F
	GOTO RF1_1
	GOTO RF_ERROR
RF1_2
	MOVLW .100				;.110
	MOVWF COUNT_RF
RF2_1							; 等待一个大于9.2mS的低电平
	BTFSC RF_IN
	GOTO RF_ERROR				; 接收错误,退出
	CALL DELAY80US    
	DECFSZ COUNT_RF,F
	GOTO RF2_1    
RF2_2:					
	MOVLW .166					;.166 再延时4.0mS,限制在9.2 - 13.0 mS之间
	MOVWF COUNT_RF
RF2_3:                                
	BTFSC RF_IN         
	GOTO RF3_1					; 在9.2 - 13.0 mS之间,为合法接收,等待第一个数据高电平
	CALL DELAY20US
	DECFSZ COUNT_RF,F
	GOTO RF2_3
	GOTO RF_ERROR				; 超出13mS,接收错误
    
; ************************************* 1527解码 ****************************************
RF3_1				; 同步头接收完成,开始接收8位数据
;test
	MOVLW 	.32
	BTFSC	CODE5,0		;加入测试模式		
	MOVLW	.24
	MOVWF BIT_COUNT
;*******************************************************
RF8BIT_IN1_1                                              
	MOVLW .2
	MOVWF COUNT_RF
RF8BIT_IN1_2							; 等待一个大于75uS的高电平
	BTFSS RF_IN
	GOTO RF_ERROR
	CALL DELAY20US
	DECFSZ COUNT_RF,F
	GOTO RF8BIT_IN1_2              
	MOVLW  .8
	MOVWF COUNT_RF
RF8BIT_IN1_3							; 再等待670uS
	CALL DELAY80US 
	DECFSZ COUNT_RF,F                          
	GOTO RF8BIT_IN1_3
	MOVLW .7
	MOVWF COUNT_RF
	CLRF H_LEVEL
	CLRF L_LEVEL
RF8BIT_IN1_4							; 在750uS处判断PB,RF_IN的引脚状态 
	BTFSC RF_IN
	GOTO RF8BIT_H
;	GOTO	RF8BIT_HIN
;	GOTO	RF8BIT_LIN
RF8BIT_L
	INCF L_LEVEL,F						; RF_IN = 低
	CALL DELAY18US                  
	DECFSZ COUNT_RF,F                  
	GOTO RF8BIT_IN1_4					; 延时150uS左右
	GOTO RF8BIT_IN1_5
RF8BIT_H  
	INCF H_LEVEL,F 						; RF_IN = 高
	CALL DELAY18US
	DECFSZ COUNT_RF,F
	GOTO RF8BIT_IN1_4
RF8BIT_IN1_5							; 在900uS处
	MOVF H_LEVEL,W
	SUBWF L_LEVEL,W
	SKPNZ
	GOTO RF_ERROR						; 高低电平个数相同 -> 错误
	SKPNC
	GOTO RF8BIT_LIN						; C=1 H > L
RF8BIT_HIN
	MOVLW .3							; C=0 H < L
	SUBWF H_LEVEL,W
	SKPC
	GOTO RF_ERROR			; C=0 0DH<3
	SETC				; 
	GOTO RF8BIT1_IN
RF8BIT_LIN    
	MOVLW .3
	SUBWF L_LEVEL,W
	SKPC
	GOTO RF_ERROR			; C=0 0EH<3
	CLRC				; BCF    STATUS,0
RF8BIT1_IN   
;	INCF	DELAY3,F
	RLF RF4,F
	RLF RF3,F                     
	RLF RF2,F 
	RLF RF1,F 
 	DECFSZ BIT_COUNT,F		; 接收完成32位数据?
	GOTO 	RF8BIT_WL
	GOTO	RECEIVE_OK

RF8BIT_WL
;test
;	MOVLW .110
	MOVLW .30                    

	MOVWF COUNT_RF
RF8BIT_WL_1					; 收到数据后,等待低电平
	BTFSS RF_IN
	GOTO RF8BIT_WL_2
	CALL DELAY18US
	DECFSZ COUNT_RF,F
	GOTO RF8BIT_WL_1         
	GOTO RF_ERROR				; 等待450mS后,溢出错误
RF8BIT_WL_2						; PB,RF_IN变为低电平   
	MOVLW .2
	MOVWF COUNT_RF
RF8BIT_WL_3   
	BTFSC RF_IN             
	GOTO RF_ERROR 				; 在50uS内变成高电平,接收错误
	CALL DELAY18US
	DECFSZ COUNT_RF,F
	GOTO RF8BIT_WL_3
	MOVLW .35					; 延时50uS后,再等待700uS 
	MOVWF COUNT_RF
RF8BIT_WL_4   
	BTFSC RF_IN
	GOTO RF8BIT_IN1_1			; 在900+700uS以内变为高电平,数据合法,接收下一位
	CALL DELAY18US                 
	DECFSZ COUNT_RF,F 
	GOTO RF8BIT_WL_4
	GOTO RF_ERROR			; 溢出,接收错误

; ******************************** 数据接收循环 *************************************

RECEIVE_OK				; 1527接收成功
	CLRC
	GOTO CHECK_CODE			;转checkcode
;********************************************************************
RF_ERROR
RF_ERROR_OUT:
	BTFSS	S_LEARN
	GOTO	LEARN
	GOTO	MAIN
;*************************************************;	
CHECK_CODE
	BTFSS	R_STATUS,1
	GOTO	$+3
	BTFSS	S_LEARN
	GOTO	LEARN_OK
	BSF	R_STATUS,0
	GOTO	READ_CODE
RF_READCODE
;	BTFSC	CODE5,0
;	GOTO	RF_REA_1
	MOVF	CODE1,W
	XORWF	CODE11,W
	BNZ	CHECK_CB
RF_REA_1
	MOVF	CODE2,W
	XORWF	CODE21,W
	BNZ	CHECK_CB
	MOVF	CODE3,W
	XORWF	CODE31,W
	BNZ	CHECK_CB
;TEST
;	BTFSC	CODE5,0			;CODE5,0=1为测试模式
;	GOTO	CHECKOPENLOS
;******************************&(&^(*
	MOVLW	B'01011111'
	XORWF	CODE4,W
	BZ	CLOSE_C
	MOVLW	B'10101111'
	XORWF	CODE4,W
	BZ	OPEN_C		
	GOTO	MAIN

CHECK_CB	
;	MOVLW	0CBH
;	XORWF	CODE2,W
;	BZ	CHECK_5CH
	GOTO	MAIN
;CHECK_5CH
;	MOVLW	05CH
;	XORWF	CODE3,W
;	BZ	CHECK_GO
;	GOTO	MAIN
;CHECK_GO				
CHECKOPENLOS
	BTFSS	RF1,0
	GOTO	CLOSE_C
OPEN_C
	BSF		CONTROL_OUT
	GOTO	MAIN
CLOSE_C	
	BCF		CONTROL_OUT
	GOTO	MAIN		

LEARN_OK
	BTFSC	CODE5,0			;CODE5,0=1为测试模式
	GOTO	LEARN_W
	MOVLW	B'10101111'
	XORWF	CODE4,W
	BZ	LEARN_W
	MOVLW	B'01011111'
	XORWF	CODE4,W
	BZ	LEARN_W	
	BCF	R_STATUS,1
	GOTO	MAIN

LEARN_W
	MOVF	CODE1,W
	MOVWF	CODE11
	MOVF	CODE2,W
	MOVWF	CODE21
	MOVF	CODE3,W
	MOVWF	CODE31
;	MOVF	CODE4,W
;	MOVWF	CODE41
	GOTO	WRITE_CODE	
;*********************************************************	
LEARN
	BCF		CONTROL_OUT
	BCF		R_STATUS,0
	BSF		R_STATUS,1
LEARN_LP
	BTFSC	S_LEARN
	GOTO	READ_CODE
	BTFSC	RF_IN
	GOTO	RECEIVE
	CLRWDT
	GOTO	LEARN_LP
;*************************************************;
READ_CODE
	MOVLW	B'00011000'
	TRIS	PORTB
	MOVLW	0CH
	MOVWF	ADDR_I2C
	CALL	RD_EEPROM
	MOVF	BUFF,W
	MOVWF	CODE11
	MOVLW	0DH
	MOVWF	ADDR_I2C
	CALL	RD_EEPROM
	MOVF	BUFF,W
	MOVWF	CODE21
	MOVLW	0EH
	MOVWF	ADDR_I2C
	CALL	RD_EEPROM
	MOVF	BUFF,W
	MOVWF	CODE31
;	MOVLW	0FH
;	MOVWF	ADDR_I2C
;	CALL	RD_EEPROM
;	MOVF	BUFF,W
	MOVLW	B'10101111'
	MOVWF	CODE41
	BTFSS	R_STATUS,0
	GOTO	MAIN
	GOTO	RF_READCODE			
;*************************************************;
WRITE_CODE
 	MOVLW	B'00011000'
	TRIS	PORTB
	MOVLW	0CH
	MOVWF	ADDR_I2C
	MOVF	CODE1,W
	MOVWF	VALUE
	CALL	WR_EEPROM
	MOVLW	0DH
	MOVWF	ADDR_I2C
	MOVF	CODE2,W
	MOVWF	VALUE
	CALL	WR_EEPROM
	MOVLW	0EH
	MOVWF	ADDR_I2C
	MOVF	CODE3,W
	MOVWF	VALUE
	CALL	WR_EEPROM
;	MOVLW	0FH
;	MOVWF	ADDR_I2C
;	MOVF	CODE4,W
;	MOVWF	VALUE
;	CALL	WR_EEPROM
	BCF	R_STATUS,1
	BSF		PB,5
	CALL	DELAY500MS
	BCF		PB,5
	CALL	DELAY500MS

	BSF		PB,5
	CALL	DELAY500MS
	BCF		PB,5
	CALL	DELAY500MS
	BSF		PB,5
	CALL	DELAY500MS
	BCF		PB,5
	CALL	DELAY500MS
	BSF		PB,5
	CALL	DELAY500MS
	BCF		PB,5
	CALL	DELAY500MS
	CLRWDT
	BTFSS	S_LEARN
	GOTO	$-2
	BSF		PB,5
	CALL	DELAY500MS
	BCF		PB,5
	CALL	DELAY500MS
	BSF		PB,5
	CALL	DELAY500MS
	BCF		PB,5
	CALL	DELAY500MS
	BSF		PB,5
	CALL	DELAY500MS
	BCF		PB,5	
	GOTO	MAIN

;*************************************************;


		END

;--------------------PROGRAMME  END------------------------;
;**************************************************************************************************;

⌨️ 快捷键说明

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