⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pd_sw1.asm

📁 PIC12C508 MCU 模拟串行口
💻 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 + -