📄 rx.asm
字号:
;------------------------------------------
;接收电路,汇编源代码
;------------------------------------------
;型号:PIC12C508A configuration=00001110
;------------------------------------------
ORG 0
MOVLW 0xC5 ;设定时方式
OPTION
MOVLW 0x38 ;设I\O口
TRIS 6
MOVLW 0x00 ;输出0
MOVWF 6
MOVLW 0xAA ;设码1
MOVWF 7
MOVLW 0xAA ;设码2
MOVWF 8
MOVLW 0x06 ;输出报警1
MOVWF 6
CALL LD6
MOVLW 0x00 ;输出报警0
MOVWF 6
MOVLW 0x02 ;报警倒计时
MOVWF 13
MOVLW 0x05 ;灭灯定时次数
MOVWF 25
CLRF 6
CLRF 9
CLRF 11
BTFSS 6,4 ;=1就跳
GOTO LOOB ;寻找模式
GOTO LOOA ; 监控工作模式
;----------------------------
;子程序区
;-----------------------------
;0.8秒等待带报警输出程序 OK
;----------------------------
LOOC MOVF 13,1
BTFSS 3,2 ;Z=1 既F13=0 就跳
GOTO LV1
BTFSS 6,1 ;是否在报警 是就跳
GOTO ADE
MOVLW 0x00 ;输出报警0
MOVWF 6
GOTO LV2
ADE MOVLW 0x06 ;输出报警1 80MS
MOVWF 6
CALL LD6
CALL LD6
CALL LD6
CALL LD6
MOVLW 0x00 ;输出报警0
MOVWF 6
LV2 MOVLW 0x2 ;定时次数 0.5S
MOVWF 17
GOTO POP
LV1 MOVLW 0x3 ;定时次数 1S
MOVWF 17
POP MOVLW 0xA ;200MS 定时
MOVWF 18
LOD CALL LD6
DECFSZ 18,1
GOTO LOD ;200ms定时末到
DECFSZ 17,1 ;-1等于0就跳
GOTO POP ;1秒末到
BTFSS 6,4 ;=1 跳A模式
GOTO LOOB ;寻找模式
DECFSZ 25,1 ;-1等于0就跳
GOTO LPQ
BSF 6,2 ;开灯
MOVLW 0x05 ;灭灯定时次数
MOVWF 25
LPQ MOVF 13,1 ;是否该报警
BTFSC 3,2 ;Z=0 既F13=1 就跳
GOTO LOFD
DECFSZ 13,1 ;-1等于0就跳
GOTO LOOA
GOTO LOFD ;去报警程序
;----------------------------------------------
;存储程序区 OK
;---------------------------------------------
LOOE RRF 9,1 ;右移
BCF 9,7
RETLW 0x00
LOOF RRF 9,1 ;右移
BSF 9,7
RETLW 0x00
LOAB RRF 11,1 ;右移
BCF 11,7
RETLW 0x00
LOAC RRF 11,1 ;右移
BSF 11,7
RETLW 0x00
;-------------------------------------
;结果对比
;-----------------------------------------
LOAA MOVF 7,0 ;F30到F27
MOVWF 12
MOVF 8,0 ;F29到F26
MOVWF 14
MOVF 12,0 ;F到W
SUBWF 9,0
BTFSS 3,2 ;Z=1 既结果相等 就跳
GOTO LC1
MOVF 14,0 ;F到W
SUBWF 11,0
BTFSS 3,2 ;Z=1 既结果相等 就跳
GOTO LC1
BTFSS 6,4 ;=1就跳
GOTO LC3 ;寻找模式
MOVLW 0x00 ;收到码 清报警
MOVWF 6
MOVLW 0x02 ;收到码 清报警
MOVWF 13
GOTO LOOC
LC3 MOVLW 0x0 ;收到码 清报警
MOVWF 13
GOTO LOOC
LC1 BTFSS 6,4 ;=1就跳
GOTO LC4 ;寻找模式
GOTO LOOC
LC4 MOVLW 0x02 ;收到码 清报警
MOVWF 13
GOTO LOOC
;----------------------------------------------
;定时程序 OK
;----------------------------------------------
LD1 CLRF 1 ;定时器清零
MOVLW 0xC7 ;定时器分频比1:256
OPTION
MOVLW 0x38 ;设I\O口
TRIS 6
LS1 MOVLW 0x14 ;定时时间 5ms
CLRWDT ;清狗
SUBWF 1,0 ;F减W
BTFSS 3,2 ;Z=1 既结果相等 就跳
BTFSC 3,0 ;C=0 即结果为负 就跳
RETLW 0x00 ;时间到
GOTO LS1 ;时间末到
LD2 CLRF 1 ;定时器清零
MOVLW 0xC7 ;定时器分频比1:256
OPTION
MOVLW 0x38 ;设I\O口
TRIS 6
LS2 MOVLW 0x5 ;定时时间 1.5ms
CLRWDT ;清狗
SUBWF 1,0 ;F减W
BTFSS 3,2 ;Z=1 既结果相等 就跳
BTFSC 3,0 ;C=0 即结果为负 就跳
RETLW 0x00 ;时间到
GOTO LS2 ;时间末到
LD3 CLRF 1 ;定时器清零
MOVLW 0xC7 ;定时器分频比1:256
OPTION
MOVLW 0x38 ;设I\O口
TRIS 6
LS3 MOVLW 0xB ;定时时间 3ms
CLRWDT ;清狗
SUBWF 1,0 ;F减W
BTFSS 3,2 ;Z=1 既结果相等 就跳
BTFSC 3,0 ;C=0 即结果为负 就跳
RETLW 0x00 ;时间到
GOTO LS3 ;时间末到
LD4 CLRF 1 ;定时器清零
CLRWDT ;清狗
MOVLW 0xC6 ;定时器分频比1:128
OPTION
MOVLW 0x38 ;设I\O口
TRIS 6
LS4 MOVLW 0x7 ;定时时间 1ms
SUBWF 1,0 ;F减W
BTFSS 3,2 ;Z=1 既结果相等 就跳
BTFSC 3,0 ;C=0 即结果为负 就跳
RETLW 0x00 ;时间到
GOTO LS4 ;时间末到
LD5 CLRF 1 ;定时器清零
CLRWDT ;清狗
MOVLW 0xC7 ;定时器分频比1:256
OPTION
MOVLW 0x38 ;设I\O口
TRIS 6
LS5 MOVLW 0x5 ;定时时间 1.3ms
SUBWF 1,0 ;F减W
BTFSS 3,2 ;Z=1 既结果相等 就跳
BTFSC 3,0 ;C=0 即结果为负 就跳
RETLW 0x00 ;时间到
GOTO LS5 ;时间末到
LD6 CLRF 1 ;定时器清零
MOVLW 0x38 ;设I\O口
TRIS 6
MOVLW 0xC7 ;定时器分频比1:256
OPTION
LS6 MOVLW 0x4E ;定时时间 20ms
CLRWDT ;清狗
SUBWF 1,0 ;F减W
BTFSS 3,2 ;Z=1 既结果相等 就跳
BTFSC 3,0 ;C=0 即结果为负 就跳
RETLW 0x00 ;时间到
GOTO LS6 ;时间末到
;------------------------------
;主程序区
;------------------------------
LOOB BCF 6,2 ;关灯
MOVLW 0x02 ;收到码 清报警
MOVWF 13
LOOA MOVLW 0x27 ;倒数次数前 定时1900ms
MOVWF 17
LH2 MOVLW 0x2A ;倒数次数后 定时50ms
MOVWF 18
LH3 MOVLW 0xC8 ;倒数次数后 定时1.2ms
MOVWF 19
LH4 BTFSC 6,3 ;测信号,无输入就跳
GOTO LH1
DECFSZ 19,1 ;-1等于0就跳
GOTO LH4
CLRWDT ;清狗
LH5 DECFSZ 18,1 ;-1等于0就跳
GOTO LH3 ;时间末到
LL1 BCF 6,2 ;关灯
DECFSZ 17,1 ;-1等于0就跳
GOTO LH2
BTFSS 6,4 ;=1就跳
GOTO LOB ;寻找模式
GOTO LOFD ;1.8秒没信号去报警
LOB BSF 6,2 ;开灯
MOVLW 0x27 ;倒数次数前 定时1900ms
MOVWF 17
MOVLW 0x2A ;倒数次数后 定时50ms
MOVWF 18
BA3 MOVLW 0xC8 ;倒数次数后 定时1.2ms
MOVWF 19
BA4 BTFSC 6,3 ;测信号,无输入就跳
GOTO LH1
DECFSZ 19,1 ;-1等于0就跳
GOTO BA4
CLRWDT ;清狗
BA5 DECFSZ 18,1 ;-1等于0就跳
GOTO BA3 ;时间末到
GOTO LOOB
LH1 CALL LD5 ;定时时间 1.3ms
BTFSC 6,3 ;测信号=0就跳
GOTO LH5 ;去报警
CALL LD4 ;定时时间 1024us
BTFSS 6,3 ;测信号,=1就跳
GOTO LH5 ;去报警
CALL LD2 ;定时时间 1.5ms
MOVLW 0x08 ;接收次数
MOVWF 15
MOVLW 0x08 ;接收次数
MOVWF 16
LH6 MOVLW 0x64 ;倒数次数前 定时3ms
MOVWF 17
LH8 MOVLW 0x3C ;倒数次数后 定时0.3ms
MOVWF 18
LH7 BTFSC 6,3 ;测信号,=0就跳
GOTO LH9
DECFSZ 18,1 ;-1等于0就跳
GOTO LH7 ;时间末到
DECFSZ 17,1 ;-1等于0就跳
GOTO LH8 ;时间末到
GOTO LL1
LH9 CALL LD1 ;定时时间 5ms
BTFSS 6,3 ;测信号,=1就跳
GOTO LL1 ;去报警
CALL LD4 ;定时时间 1ms
BTFSC 6,3 ;测信号=0就跳
GOTO LL1 ;去报警
MOVLW 0xCC ;倒数次数前 定时1ms
MOVWF 17
LK2 BTFSC 6,3 ;测信号,=0就跳
GOTO LK1
DECFSZ 17,1 ;-1等于0就跳
GOTO LK2
GOTO LOOC
LK1 CALL LD3 ;定时时间 3ms
LAD BTFSS 6,3 ;测信号,=1就跳
GOTO KK1 ;D0=0
GOTO KK2 ;D0=1
KK1 CALL LOOE
GOTO LOOG
KK2 CALL LOOF
LOOG CALL LD3
DECFSZ 15,1 ;-1等于0就跳
GOTO LH6
BCF 6,2 ;关灯
LG6 MOVLW 0x64 ;倒数次数前 定时3ms
MOVWF 17
LG8 MOVLW 0x3C ;倒数次数后 定时0.3ms
MOVWF 18
LG7 BTFSC 6,3 ;测信号,=0就跳
GOTO LG9
DECFSZ 18,1 ;-1等于0就跳
GOTO LG7 ;时间末到
DECFSZ 17,1 ;-1等于0就跳
GOTO LG8 ;时间末到
GOTO LOOC
LG9 CALL LD1 ;定时时间 5ms
BTFSS 6,3 ;测信号,=1就跳
GOTO LOOC ;去报警
CALL LD4 ;定时时间 1ms
BTFSC 6,3 ;测信号=0就跳
GOTO LOOC ;去报警
MOVLW 0xCC ;倒数次数前 定时1ms
MOVWF 17
LG2 BTFSC 6,3 ;测信号,=0就跳
GOTO LG1
DECFSZ 17,1 ;-1等于0就跳
GOTO LG2
GOTO LOOC
LG1 CALL LD3 ;定时时间 3ms
BTFSS 6,3 ;测信号,=1就跳
GOTO KK3 ;D1=0
GOTO KK4 ;D1=1
KK3 CALL LOAB
GOTO LOAD
KK4 CALL LOAC
LOAD CALL LD3
DECFSZ 16,1 ;-1等于0就跳
GOTO LG6
GOTO LOAA ;收完,去对比
;--------------------------------------------
;报警程序
;--------------------------------------------
LOFD MOVLW 0x06 ;输出报警1
MOVWF 6
MOVLW 0x32 ;输出报警 定时60ms
MOVWF 17
LA1 MOVLW 0xFF ;输出报警 定时1.2ms
MOVWF 18
LCB BTFSC 6,3 ;测信号,无输入就跳
GOTO LCD
DECFSZ 18,1 ;-1等于0就跳
GOTO LCB
CLRWDT ;清狗
LA4 DECFSZ 17,1 ;-1等于0就跳
GOTO LA1
LA5 MOVLW 0x01 ;输出报警0
MOVWF 6
MOVLW 0xFA ;输出报警0 定时 500ms
MOVWF 17
LA3 MOVLW 0xFF ;输出报警 定时2ms
MOVWF 18
LA2 BTFSC 6,3 ;测信号,无输入就跳
GOTO LCD
NOP
NOP
NOP
DECFSZ 18,1 ;-1等于0就跳
GOTO LA2
CLRWDT ;清狗
LA8 DECFSZ 17,1 ;-1等于0就跳
GOTO LA3
GOTO LOFD ;时间到
LCD CALL LD5 ;定时时间 1.3ms
BTFSC 6,3 ;测信号=0就跳
GOTO LA9 ;去报警
CALL LD4 ;定时时间 1024us
BTFSS 6,3 ;测信号,=1就跳
GOTO LA9 ;去报警
CALL LD2 ;定时时间 1.5ms
MOVLW 0x08 ;接收次数
MOVWF 15
MOVLW 0x08 ;接收次数
MOVWF 16
LC6 MOVLW 0x64 ;倒数次数前 定时3ms
MOVWF 17
LC8 MOVLW 0x3C ;倒数次数后 定时0.3ms
MOVWF 18
LC7 BTFSC 6,3 ;测信号,=0就跳
GOTO LC9
DECFSZ 18,1 ;-1等于0就跳
GOTO LC7 ;时间末到
DECFSZ 17,1 ;-1等于0就跳
GOTO LC8 ;时间末到
GOTO LA9
LC9 CALL LD1 ;定时时间 5ms
BTFSS 6,3 ;测信号,=1就跳
GOTO LA8 ;去报警
CALL LD4 ;定时时间 1ms
BTFSC 6,3 ;测信号=0就跳
GOTO LA8 ;去报警
MOVLW 0xCC ;倒数次数前 定时1ms
MOVWF 17
LT2 BTFSC 6,3 ;测信号,=0就跳
GOTO LT1
DECFSZ 17,1 ;-1等于0就跳
GOTO LT2
GOTO LOOC
LT1 CALL LD3 ;定时时间 3ms
BTFSS 6,3 ;测信号,=1就跳
GOTO AK1 ;D0=0
GOTO AK2 ;D0=1
AK1 CALL LOOE
GOTO LOGG
AK2 CALL LOOF
LOGG CALL LD3
DECFSZ 15,1 ;-1等于0就跳
GOTO LC6
MOVLW 0x00 ;输出报警0
MOVWF 6
LQ6 MOVLW 0x64 ;倒数次数前 定时3ms
MOVWF 17
LQ8 MOVLW 0x3C ;倒数次数后 定时0.3ms
MOVWF 18
LQ7 BTFSC 6,3 ;测信号,=0就跳
GOTO LQ9
DECFSZ 18,1 ;-1等于0就跳
GOTO LQ7 ;时间末到
DECFSZ 17,1 ;-1等于0就跳
GOTO LQ8 ;时间末到
GOTO LOOC
LQ9 CALL LD1 ;定时时间 5ms
BTFSS 6,3 ;测信号,=1就跳
GOTO LOOC ;去报警
CALL LD4 ;定时时间 1ms
BTFSC 6,3 ;测信号=0就跳
GOTO LOOC ;去报警
MOVLW 0xCC ;倒数次数前 定时1ms
MOVWF 17
LQ2 BTFSC 6,3 ;测信号,=0就跳
GOTO LQ1
DECFSZ 17,1 ;-1等于0就跳
GOTO LQ2
GOTO LOOC
LQ1 CALL LD3 ;定时时间 3ms
BTFSS 6,3 ;测信号,=1就跳
GOTO AK3 ;D1=0
GOTO AK4 ;D1=1
AK3 CALL LOAB
GOTO LODD
AK4 CALL LOAC
LODD CALL LD3
DECFSZ 16,1 ;-1等于0就跳
GOTO LQ6
GOTO LOAA ;收完,去对比
LA9 BTFSS 6,1 ;是否在报警 是就跳
GOTO LA8
GOTO LA4
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -