📄 c34dsio.asm
字号:
;**************************************************************************************************
; 串行通讯程序
;**************************************************************************************************
; SIO interrupt subroutine
; used r0,r1,r2,r3,r6,r7
; CRCLo=r4,CRCHi=r5
; BANK 2
;--------------------------------------------------------------------------------------------------
INTSIO: CLR EA
CLR ES
CLR RI
PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL
CLR RS0
SETB RS1 ; set bank 2 registers
SETB EA
CLR SM2
;--------------------------------------------
jnb bEnComS, SioMbus
call SioSelf ; 公司自定义通讯协议
JMP SIOEND
SioMbus: jnb bEnComM, SioEn
;-------------------------------------------
jb bSetPidPara,SioEn ; MoDouBus通讯协议
jb bSetAlrPara,SioEn
MOV R0, #ComBufferAd
SIO1: MOV A, SBUF
CJNE A,comad, SIOEN
MOV @R0, A ; 接收地址
INC R0
MOV R3, #1
CALL ReceiveSub ; 接收命令
JNB bReceiveEr,SIOWA
CLR bReceiveEr
SIOEN: JMP SIOEND ; address error or receive error
;**************************************************************************************************
; function 10h 设置 系统参数 报警参数
;--------------------------------------------------------------------------------------------------
siowa: CJNE A,#10H, SIOWB
JMP SIOW_PARA
SIOWB: JMP SIORB
;===========================================
SIOW_PARA:
MOV R3, #5 ; 接收参数开始地址,参数个数,字节个数等5个字节以便判断设置哪个参数
CALL ReceiveSub
JNB bReceiveEr,SIOW_P1
CLR bReceiveEr
JMP SIOEND
SIOW_P1: ADD A, #2
MOV R3, A ; R3=接收参数字节数和CRC字节数总和
CALL ReceiveSub
JNB bReceiveEr,SIOW_P2
CLR bReceiveEr
JMP SIOEND
SIOW_P2: MOV A, R0 ; 指针
CLR C
SUBB A, #ComBufferAd
SUBB A, #2 ; A is all the byte num. except CRC
CALL CheckCRC ; CRC 检验
JBC bCRCOK, SIOWOK
JMP SIOEND
;--------------------------------------------
; CRC 检验正确后处理
;--------------------------------------------
SIOWOK:
MOV R0, #ComBufferAd+2 ; point to para start address hi
MOV A, @R0
;--------------------------------------------
cjne a,#06h, SysAlr
setb bSetPidPara ; 设置 PID参数 when #ComBufferAd+2+3 = 2006h
JMP WriteParaEnd
SysAlr: cjne a,#05h, WriteParaErEnd
setb bSetAlrPara ; 设置 报警参数 when #ComBufferAd+2+3 = 2005h
;--------------------------------------------
WriteParaEnd: ; 设置 系统参数 报警参数 后应答
mov r3, #6
call WriteReadOkAnswer ; 发送ComBufferAd中应答信息
JMP SIOEND
;
WriteParaErEnd:
call ErrorAnswer
JMP SIOEND
;**************************************************************************************************
; function 03h 读 系统参数 报警参数
;--------------------------------------------------------------------------------------------------
SIORB: cjne a,#03h, siorc ;
MOV R3, #6 ; 接收参数开始地址,参数个数,CRC
CALL ReceiveSub
JNB bReceiveEr,SIOR_P2
CLR bReceiveEr
JMP SIOEND
SIOR_P2: mov a, #6
call CheckCRC ; CRC 检验
jbc bCRCOK, SIORBOK
JMP SIOEND ; CRC check error
;--------------------------------------------
; CRC 检验正确后处理
;--------------------------------------------
SIORBOK: MOV R0, #ComBufferAd+2 ; point to para start address hi
MOV A, @R0
;============================================
cjne a,#06h, RSysAlr1
MOV R0, #ComBufferAd+3 ; point to para start address Lo
MOV A, @R0
mov r5, a
MOV R0, #ComBufferAd+5 ; point to para count Lo
MOV A, @R0
add a, r5
cjne a, #8,RSysAlr0
RSysAlr0:
jnc ReadParaErEnd
mov r5, #iCyad
jmp RSysAlr2
RSysAlr1:cjne a,#05h, ReadParaErEnd
MOV R0, #ComBufferAd+3 ; point to para start address Lo
MOV A, @R0
mov r5, a
MOV R0, #ComBufferAd+5 ; point to para count Lo
MOV A, @R0
add a, r5
cjne a, #5,RSysAlr10
RSysAlr10:
jnc ReadParaErEnd
mov r5, #iObjad
RSysAlr2:call ReadSysAlrPara ; 读系统参数 报警参数
mov a, r4
mov r3, a
;--------------------------------------------
ReadParaEnd:
call WriteReadOkAnswer ; 发送ComBufferAd中应答信息
JMP SIOEND
;
ReadParaErEnd:
call ErrorAnswer
JMP SIOEND
;**************************************************************************************************
; function 04h 读测量值
;--------------------------------------------------------------------------------------------------
SIORC: cjne a,#04h, SIORD
;
SioReadData:
mov r3, #6
call ReceiveSub ; 接收参数开始地址,参数个数和CRC
jnb bReceiveEr,SIOR_P5
clr bReceiveEr
JMP SIOEND
SIOR_P5: mov a, #6
call CheckCRC ; CRC 检验
jbc bCRCOK, ReadData
JMP SIOEND ; CRC check error
;--------------------------------------------
; CRC 检验正确后处理
;--------------------------------------------
ReadData:
MOV R0, #ComBufferAd+2 ; point to data start address hi
MOV A, @R0
jnz ReadDataErEnd
inc r0 ; point to data start address Lo
mov a, @r0
mov r5, a
MOV R0, #ComBufferAd+5 ; point to data count Lo
MOV A, @R0
add a, r5
cjne a, #04,ReadData2
ReadData2:
jnc ReadDataErEnd
;
call ReadTestingData ; 读当前A/D测量数据或显示数据
jmp sioend
ReadDataErEnd:
call ErrorAnswer
;**************************************************************************************************
SIORD:
CJNE A,#02H,SIOEND
Readstate:
mov r3, #6
call ReceiveSub ; 接收参数开始地址,参数个数和CRC
jnb bReceiveEr,Readstate1
clr bReceiveEr
JMP SIOEND
Readstate1:
mov a, #6
call CheckCRC ; CRC 检验
jbc bCRCOK, Readstate2
Readstate2:
mov r0, #ComBufferAd+2
mov a, @r0
jnz ReadstateErEnd
inc r0
mov a, @r0
jnz ReadstateErEnd
mov r1, #iState
mov a, @r1
mov @r0, a
dec r0
mov a, #01h
mov @r0, a
mov r3, #4
call WriteReadOkAnswer
JMP SIOEND
ReadstateErEnd:
call ErrorAnswer
SIOEND:
CLR SioTxRx
SETB REN
SETB ES
SETB EA
POP DPL
POP DPH
POP ACC
POP PSW
RETI
;**************************************************************************************************
;--------------------------------------------------------------------------------------------------
; sub
;--------------------------------------------------------------------------------------------------
;**************************************************************************************************
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; 读测量数据或显示数据
;-------------------------------------------
ReadTestingData:
mov r0, #ComBufferAd+5 ;计算字节数
mov a, @r0
clr c ;
rlc a
mov r3, a ;暂存A中数据到R3
mov r0, #ComBufferAd+3
mov a, @r0
jnz RTD0a ;当起始地址为00时数据字节数为(数据个数*2-1)
dec r3
mov a, r3
RTD0a:
mov r0, #ComBufferAd+2
mov @r0, a
mov r7, a
add a, #3
mov r3, a
mov r0, #ComBufferAd+3 ;计算数据存储地址
mov a, @r0
jnz RTD0b
mov r1, #istate
inc r1
mov a, @r1
mov @r0, a
inc r0
dec r7
inc r1
sjmp RTD1
RTD0b:
clr c
rlc a
mov r1, #iState
add a, r1
mov r1, a
RTD1:
mov a, r7
jz RTD2
inc r1
mov a, @r1 ; 送Hi
mov @r0, a
inc r0
dec r1
dec r7
mov a, @r1 ; 送Lo
mov @r0, a
inc r0
inc r1
inc r1
dec r7
ajmp RTD1
;
RTD2:
call WriteReadOkAnswer ; 发送commbuffer中应答信息
ret
;===========================================
; 读系统参数 报警参数
; input :r5 point to para address
; output:r4 = answer byte num.
; using r0,r1,r3,r4,r5
;-------------------------------------------
ReadSysAlrPara:
mov r0, #ComBufferAd+3 ; 指向起始地址 Lo
mov a, @r0 ; 计算数据的起始地址
clr c
rlc a
add a, r5
mov r5, a
mov r0, #ComBufferAd+5 ; 指向参数个数 Lo
mov a, @r0 ; 参数个数
mov r3, a
clr c
rlc a
mov r0, #ComBufferAd+2
mov @r0, a ; 参数字节数
add a, #3
mov r4, a ; 应答字节数
inc r0 ; 指向参数
mov a, r5
mov r1, a
RSAP1: inc r1 ; 指向Hi
mov a, @r1
mov @r0, a
dec r1 ; 指向Lo
inc r0
mov a, @r1
mov @r0, a
inc r0
inc r1
inc r1 ; 指向下一个参数
djnz r3, RSAP1
ret
;===========================================
; 设PID参数 报警参数
; input :r5 point to para eeprom address
; using r0,r4,r5,r6,r7
;-------------------------------------------
SetPara: clr es
jbc bSetPidPara,SetP1
jbc bSetAlrPara,SetP2
jmp SetPEnd
SetP1: mov r5, #eCyad
mov r0, #ComBufferAd+3
mov a, @r0
clr c
rlc a
add a, r5
mov r5, a
mov r0, #ComBufferAd+5
mov a, @r0
mov r4, a
jmp SetP3
SetP2: mov r5, #eObad
mov r0, #ComBufferAd+3
mov a, @r0
clr c
rlc a
add a, r5
mov r5, a
mov r0, #ComBufferAd+5
mov a, @r0
mov r4, a
;
SetP3: setb xwp
call WREN_CMD
MOV R6, #SR_SETP ; protect 100--1ffh ee
call WRSR_CMD
CLR EWOK
mov r0, #ComBufferAd+7
SetP4: mov a, @r0
mov r7, a
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -