📄 1527o2272.c
字号:
1527 and 2272
解码
foreverwolfer
作者:
免责声明:本程序只用于学习交流,如有用于商业用途而引
起的任何纠纷与本人无关!
;-----------------------解码子程序 ;1527 and 2272
JM BCF STATUS,5
BCF RR,1 ;RR-1为解码成功标志位(为1 成功)
CLRF R2
CLRF R3
CLRF R4
CLRF R5
CLRF R6
CLRF R7
CLRF R8
CLRF TMR0
MOVLW 0C0H
MOVWF INTCON
KT MOVLW 18H ;24BIT
MOVWF R0
BTFSS PORTA,5
GOTO JMEND
MOVLW 3CH ;
MOVWF DEYH
J1 NOP
NOP
nop
nop
BTFSS PORTA,5 ;是否有0.1-0.5ms高电平
GOTO MT ;计算码头脉宽
DECF DEYH,1
时间有 。 ?则 超时
BTFSS STATUS,2 ; 0 5MS
一个周期循环
GOTO J1 ; 10US
时间有 。 ?则 超时退出
GOTO JMEND ; 0 5MS
;判断是否有0.1-0.5ms高电平
MT
MOVF DEYH,0
SUBLW 08H
BTFSC STATUS,C ;10-DEYH<0则C为0,即DEYH>10
GOTO JMEND
件使用 "pdfFactory" 试用版本创建 www.fineprint.cn
MOVF DEYH,0
SUBLW 032H
MOVWF R_TMT
INCF R_TMT,1 ;是有0.1-0.5ms高电平,补偿,T=R_TMT*10+10 US
CLRF DEYL
CLRF DEYH
TT CLRWDT
BTFSC PORTA,5
GOTO MT1
INCF DEYH,1
NOP
MOVF DEYH,0
SUBLW 0FFH
BTFSS STATUS,Z
GOTO TT ;10us一个周期
则
INCF DEYL,1 ;DEYH=255 DEYL+1
CLRF DEYH
MOVF DEYL,0
SUBLW 07H
BTFSS STATUS,Z ;DEYL=6则已超时
GOTO TT ;未超时则继续
GOTO JMEND
;判断脉宽是否有5。1MS-17。8MS
MT1 MOVF DEYL,0
SUBLW 02H
BTFSC STATUS,C
低电平不能持续 。 ,退出
GOTO JMEND ; 5 1MS
INCF DEYH,1
INCF DEYH,1 ; 补偿,T=DEYH*10+10 +10 US
MOVF R_TMT,0
ADDWF DEYH,1
BTFSC STATUS,C
INCF DEYL,1
RRF DEYL,1
RRF DEYH,1
RRF DEYL,1
RRF DEYH,1
RRF DEYL,1
RRF DEYH,1
RRF DEYL,1
RRF DEYH,1 ;码头除以16=8*OSC
MOVF DEYH,0
MOVWF DEYH_1
DECF DEYH,1
DECF DEYH,1
DECF DEYH,1
;;是同位码,延时 MS采集信号
J5 NOP
NOP
NOP
NOP
NOP
NOP
NOP
DECFSZ DEYH,1
GOTO J5 ;延时8*OSC后采样
;采集信号并记录
BTFSC PORTA,5
GOTO Z1
能则清
BCF R2,0 ; R2-0
GOTO XH
为高则检测高电平时间是否能持续
Z1 NOP ; 0.18MS
BSF R2,0 ;能则置R2-1
;等待第2个上升沿,先等待到低电平的到来
XH MOVF DEYH_1,0
MOVWF DEYH
J8 DECF DEYH,1 ;是否超时
BTFSC STATUS,Z
GOTO JMEND
NOP
NOP
NOP
NOP
BTFSC PORTA,5
GOTO J8
;是否接收完24位
CLRWDT
DECFSZ R0,1
GOTO JJ8
GOTO CSJ1
没检测完 位,则移位
JJ8 RLF R2,1 ; 24
RLF R3,1
RLF R4,1
;等待高电平的到来
JX MOVF DEYH_1,0
MOVWF DEYH
RLF DEYH,1
J9 DECF DEYH,1 ;是否超时
BTFSC STATUS,Z
GOTO JMEND
NOP
NOP
NOP
NOP
BTFSS PORTA,5
GOTO J9
MOVF DEYH_1,0
MOVWF DEYH
DECF DEYH,1
DECF DEYH,1
DECF DEYH,1
GOTO J5
;接收完24位则判断是否已重复接收
CSJ1 INCF R8,1
MOVLW 01H
SUBWF R8,0
BTFSC STATUS,2
GOTO JX1 ;第一次接收则存接收码
MOVLW 02H
SUBWF R8,0
BTFSC STATUS,2 ;是否为2
GOTO BJ ;为2则比较
MOVLW 03H
SUBWF R8,0
是否为
BTFSS STATUS,2 ; 3
GOTO JMEND
BJ MOVF R2,0
XORWF R5,0 ;R2=R5? 也可用subwf r5,0
BTFSS STATUS,2
GOTO JMEND
MOVF R3,0
XORWF R6,0 ;R3=R6?
BTFSS STATUS,2
GOTO JMEND
MOVF R4,0
XORWF R7,0 ;R4=R7?
BTFSS STATUS,2
GOTO JMEND
BSF RR,1 ;都相同则置解码成功标志
bsf PORTC,3 ;*******************
CALL YS ;*******************
;CALL YS ;*******************
bCf PORTC,3 ;*******************
GOTO JMEND
;-----------未接收完3次则继续
;-----------等待高电平的到来限时 2.056MS
JX1 MOVF R2,0
MOVWF R5
MOVF R3,0
MOVWF R6
MOVF R4,0
MOVWF R7
CLRF R2 ;清除第一次接收的数据
CLRF R3
CLRF R4
MOVF DEYH_1,0 ;限时S内检测到同位信号的高电平
MOVWF DEYH
RLF DEYH,1
JX11 DECF DEYH,1
BTFSC STATUS,Z
GOTO JMEND
BTFSS PORTA,5
GOTO JX11
GOTO KT ;未超时就检测到高电平
;--------------解码结束
JMEND bsf R1,0
MOVLW 0C0H
MOVWF INTCON
RETURN
;===============================
输出:R2,R3,R4
I/O
对 口的检测应按自己的实际情况做相应的修改
对本程序中有些不必要指令可以做删除,不影响解码效果
可对本程序码头判断的“宽”“严”做调整
有任何问题欢迎到http://pic16.com/bbs/dispbbs.asp?boardID=27&ID=15769&page=1
交流
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -