📄 ap0610-receive.asm
字号:
;起始码判断接收
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 + -