是错误的
SKPNC
GOTO LOOP
MOVLW 32
MOVWF CNT2 ;接收数据共32位,16位用户码,8位控制码加8位控制码的反码
RCV5
CLRF CNT3
MOVLW 170 ;低电平大于256-170=86*10US=860US错误
MOVWF CNT0
MOVLW 56
MOVWF CNT1 ;高电平大于256-56=200*10US=2MS错误
RCV5_HI
GOTO content1
NOP
BTFSC PORTA,RMT
INCF CNT3,1
BTFSS PORTA,RMT
CLRF CNT3
BTFSC CNT3,2 ;高电平大于8*10US=80US则为有效高电平
GOTO RCV6
INCFSZ CNT0,1
GOTO RCV5_HI ;低电平大于860US则是错误的
GOTO LOOP
RCV6
CLRF CNT3
RCV6_LO
GOTO content1
NOP
BTFSS PORTA,RMT
INCF CNT3,1
BTFSC PORTA,RMT
CLRF CNT3
BTFSC CNT3,3 ;低电平大于10*8US=80US则是有效低电平
GOTO COMPARE
INCFSZ CNT1,1
GOTO RCV6_LO ;高电平大于256-56=200*10US=2MS错误
GOTO LOOP
COMPARE
MOVLW 170
SUBWF CNT0,1 ;CNT0的值减初始值等于实际低电平计数值
MOVLW 56
SUBWF CNT1,1 ;CNT1的值减初始值等于实际高电平计数值
MOVFW CNT1
ADDWF CNT0,1 ;将高低电平的计数加在一起并存入CNT0,通过比较高低电平总的时间来确定是1还是0
SKPNC
GOTO LOOP ;总的值大于255(即时间大于255*10US=2.55MS)则错误
MOVLW 70
SUBWF CNT0,0
SKPC
GOTO LOOP ;总的时间小于70*10US=700US则是错误的
MOVLW 130 ;130*10=1.3MS
SUBWF CNT0,0
SKPNC
GOTO COMPARE_H ;时间大于1.3MS转去确定是否1
BCF FLAGS2,BITIN ;时间在700US-1.3MS之间则是0
GOTO MOVDATA ;送数
COMPARE_H
MOVLW 160
SUBWF CNT0,0
SKPC
GOTO LOOP ;小于160*10US=1.6MS,则错误
MOVLW 230
SUBWF CNT0,0
SKPNC
GOTO LOOP ;大于230*10US=2.3MS,则错误
BSF FLAGS2,BITIN ;时间在1.6MS-2.3MS之间则是1
MOVDATA
RRF CSR0A,1 ;将每一位移入相应寄存器
RRF CSR1A,1
RRF CSR2A,1
RRF CSR3A,1
BCF CSR0A,7
BTFSC FLAGS2,BITIN ;接收当前位送入CSR0.7
BSF CSR0A,7
DECFSZ CNT2,1 ;是否接收完32位
GOTO RCV5
MOVFW CSR0A ;将临时寄存器中的数存回相应寄存器
MOVWF CSR0
MOVFW CSR1A
MOVWF CSR1
MOVFW CSR2A
MOVWF CSR2
MOVFW CSR3A
MOVWF CSR3
COMF CSR0,0 ;比较键码的反码取反后是否等于键码
XORWF CSR1,0
BNZ LOOP ;不等于则接收到的是错误的信息
;将键码送显示
SWAPF CSR1,W ;显示值高低位交换,先处理高位
ANDLW 0FH ;屏蔽掉高位
MOVWF DISPBUF_H ;