📄 pd_sw1.asm
字号:
list n=0
include "D:\INC\P16C5X.INC"
include "D:\INC\PIC_MAC.INC"
; -------------------------------------------------
; Port Defines:
#define P_RXD GPIO,3
; 76543210
GPIO_TRIS EQU B'00111000'
;GPIO_INIT EQU B'00111000'
;
;#define P_DIRECT PORTA,0
;
MY_ADDR EQU 0x9 ; IIC 移位寄存器
;
RxPROC EQU 0x0A
RxBUF EQU 0x0B
RxGAP EQU 0x0C
#define F_RXDF RXGAP,6
;
FLAGS EQU 0x0D
;RUNFLAGS.7: UART 1/3 Tick Flag!
#define F_SWON FLAGS,0
;
TICKH EQU 0x0E
TICKL EQU 0x0F
; -------------------------------------------------
SWTIMER1 EQU 0x10
SWTIMER2 EQU 0x11
SWTIMER3 EQU 0x12
; -------------------------------------------------
ORG 0
NOP
GOTO SYS_RESET
; ==============================================================
SW_ONOFF ANDLW 0x7
ADDWF PCL,F
GOTO RESET_RX ; 0
GOTO RESET_RX ; 1
GOTO SW1_OFF ; 2
GOTO SW1_ON ; 3
GOTO SW2_OFF ; 4
GOTO SW2_ON ; 5
GOTO SW3_OFF ; 6
GOTO SW3_ON ; 7
; ==============================================================
RX_BYTE MOVFW RxPROC
ANDLW 0x7
ADDWF PCL,F
GOTO RX_ADDR ; 0
GOTO RX_CMD1 ; 1
GOTO RX_CMD2 ; 2
GOTO RX_DATA1 ; 3
GOTO RX_DATA2 ; 4
GOTO RESET_RX ; 5
GOTO RESET_RX ; 6
GOTO RESET_RX ; 7
; ==============================================================
UART_BITS MOVFW TMR0
XORWF FLAGS,W
ANDLW 0x80 ; 2400bps
SKPNZ
GOTO UART_BITS
XORWF FLAGS,F
CLRWDT
;
INCFSZ TICKL,F
SKP
INCF TICKH,F ; TICKH.7:4.5秒时隙
;
BCF F_RXDF
SKPB P_RXD ; 采样RXD
GOTO RX_BIT_0
;
RX_BIT_1 DECFSZ RxGAP,F
GOTO RX_BIT_PROC
GOTO RX_SYNC
;
RX_BIT_0 MOVLW (.64 + .26)
MOVWF RxGAP
; -------------------------------------------------
RX_BIT_PROC SWAPF RxPROC,W
ANDLW 0xF
ADDWF PCL,F
; -------------------------------------------------
RETLW 0x00 ; 0: 空操作,不接受指令,等待同步
SKPNB F_RXDF ;*1: 测试停止位
RETLW 0x10 ; 2
SKPB F_RXDF ;*3: 测试起始位
RETLW 0x30 ; 4
RETLW 0x60 ; 5
SKPB F_RXDF ;*6: 检查起始位
GOTO RESET_RX ; 7: 起始位失败!
CLRF RxBUF ; 8
BSF RxBUF,7 ; 9
RETLW 0xB0 ; A
;
RETLW 0xC0 ;*B
RETLW 0xD0 ;*C
SKPB F_RXDF ;*D
SETC ; E
RRF RxBUF,F ; F
RETLW 0xB0
; ==============================================================
RESET_RX MOVLW .26
MOVWF RxGAP
CLRF RxPROC
GOTO WAIT_CMD
; ----------------------------------------------
RX_SYNC MOVLW 0x30
MOVWF RxPROC
CLRF RxGAP
BSF RxGAP,0
GOTO WAIT_CMD
; ----------------------------------------------
DO_RXSTAT XORWF RxPROC,W
ANDLW 0xF0
XORWF RxPROC,F
; ----------------------------------------------
WAIT_CMD SKPB TICKH,7
GOTO WAIT_CMD1
BCF TICKH,7
;
MOVFW SWTIMER1
SKPZ
INCFSZ SWTIMER1,F
SKP
BCF GPIO,0
;
MOVFW SWTIMER2
SKPZ
INCFSZ SWTIMER2,F
SKP
BCF GPIO,1
;
MOVFW SWTIMER3
SKPZ
INCFSZ SWTIMER3,F
SKP
BCF GPIO,2
; ----------------------------------------------
WAIT_CMD1 CALL UART_BITS
SKPC
GOTO DO_RXSTAT
MOVLW 0x30
INCFSZ RxBUF,F ; 接收到的字节先加1
CALL RX_BYTE ; 非FF,需解释
MOVWF RxPROC
GOTO WAIT_CMD
; ==============================================================
; 来自RX_BYTE调用,入口RxBUF = 接收到的字节+1
RX_ADDR DECF RxBUF,W
XORWF MY_ADDR,W
SKPZ
GOTO RESET_RX ; 地址不吻合
RETLW 0x11 ; 地址吻合,接收下一字节
; ----------------------------------------------
RX_CMD1 DECFSZ RxBUF,W
GOTO RESET_RX
RETLW 0x12
; ----------------------------------------------
RX_CMD2 DECF RxBUF,F
BCF F_SWON
SKPB RxBUF,1
BSF F_SWON
;
BCF RxBUF,1
MOVFW RxBUF
XORLW 0x09
SKPZ
GOTO RESET_RX
RETLW 0x13
; ----------------------------------------------
RX_DATA1 DECFSZ RxBUF,W
GOTO RESET_RX
RETLW 0x14
; ----------------------------------------------
RX_DATA2 DECF RxBUF,W
ANDLW 0xFC
SKPZ
GOTO RESET_RX ; 仅处理 1,2,3
DECF RxBUF,F
CLRC
SKPNB F_SWON
SETC
RLF RxBUF,W
GOTO SW_ONOFF
; ----------------------------------------------
SW1_OFF BCF GPIO,0
CLRF SWTIMER1
GOTO RESET_RX
SW1_ON BSF GPIO,0
CLRF SWTIMER1
BSF SWTIMER1,1
GOTO RESET_RX
; ----------------------------------------------
SW2_OFF BCF GPIO,1
CLRF SWTIMER2
GOTO RESET_RX
SW2_ON BSF GPIO,1
CLRF SWTIMER2
BSF SWTIMER2,1
GOTO RESET_RX
; ----------------------------------------------
SW3_OFF BCF GPIO,2
CLRF SWTIMER3
GOTO RESET_RX
SW3_ON BSF GPIO,2
CLRF SWTIMER3
BSF SWTIMER3,1
GOTO RESET_RX
; ==============================================================
;RESET
SYS_RESET NOP
CLRWDT
MOVLW 0xDF
OPTION
MOVLW GPIO_TRIS
TRIS GPIO
CLRF GPIO
; --------------------------------------
MOVLW 0x7
MOVWF FSR
MOVWF 0x1F
CLR_RAM CLRF INDF
INCF FSR,F
MOVFW 0x1F
SKPZ
GOTO CLR_RAM
GOTO MYADDR
; ==============================================================
ORG 0x180
MYADDR NOP
WHILE $ < 0x1F0
XORLW 0xFF
ENDW
MOVLW 0x50
MOVWF MY_ADDR
GOTO RESET_RX
; ==============================================================
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -