📄 pcm16c550.asm
字号:
LCALL INT_CHKSUM
MOV A,B
LCALL HEX
SWAP A
MOV REG_H_BYTE,A
MOV communicate_state,#STATE_CMD2L
LJMP INT_RETURN
RECE_CMD2L:CJNE A,#STATE_CMD2L,RECE_LENCHK ;接收命令2低字节
MOV A,B
LCALL INT_CHKSUM
MOV A,B
LCALL HEX
ADD A,REG_H_BYTE
RC2_REAL: CJNE A,#CMD2_REAL,RC2_PARA ;判断是否为取实时数据命令
MOV CMD_STATE,#CMD2_REAL
AJMP RC2_RIGHT
RC2_PARA: CJNE A,#CMD2_PARA,RC2_SETUP ;判断是否为取实参数据命令
MOV CMD_STATE,#CMD2_PARA
AJMP RC2_RIGHT
RC2_SETUP: CJNE A,#CMD2_SETUP,RC2_OTHER ;判断是否为取设置命令
MOV CMD_STATE,#CMD2_SETUP
AJMP RC2_RIGHT
RC2_OTHER: MOV CMD_STATE,#CMD2_OTHER
MOV communicate_state,#STATE_SOI
LJMP INT_RETURN
RC2_RIGHT: MOV communicate_state,#STATE_LENCHK
LJMP INT_RETURN
RECE_LENCHK:CJNE A,#STATE_LENCHK,RECE_LENH ;接收长度校验低字节
MOV A,B
LCALL INT_CHKSUM
MOV A,B
LCALL HEX
MOV REG_H_BYTE,A
MOV communicate_state,#STATE_LENH
LJMP INT_RETURN
RECE_LENH: CJNE A,#STATE_LENH,RECE_LENM ;接收长度校验高字节
MOV A,B
LCALL INT_CHKSUM
MOV communicate_state,#STATE_LENM ;命令的长度比较短,最长只有10个字节,这个字节为0
LJMP INT_RETURN
RECE_LENM: CJNE A,#STATE_LENM,RECE_LENL ;命令的长度比较短,最长只有10个字节,这个字节为0
MOV A,B
LCALL INT_CHKSUM
MOV communicate_state,#STATE_LENL
LJMP INT_RETURN
RECE_LENL: CJNE A,#STATE_LENL,RECE_DATAH
MOV A,B
LCALL INT_CHKSUM
MOV A,B
LCALL HEX
mov b,a
RR A
MOV LENGTH,A
MOV A,B
CPL A
ADD A,#1
XRL A,REG_H_BYTE
ANL A,#0FH
JZ RL_RIGHT
MOV communicate_state,#STATE_SOI
LJMP INT_RETURN
RL_RIGHT: MOV A,LENGTH
JNZ RL_SETUP
MOV communicate_state,#STATE_CHKSUM1H
LJMP INT_RETURN
RL_SETUP: MOV communicate_state,#STATE_DATAH
LJMP INT_RETURN
RECE_DATAH: CJNE A,#STATE_DATAH,RECE_DATAL ;接收数据
MOV A,B
LCALL INT_CHKSUM
MOV A,B
LCALL HEX
SWAP A
MOV REG_H_BYTE,A
MOV COMMUNICATE_STATE,#STATE_DATAL
LJMP INT_RETURN
RECE_DATAL: CJNE A,#STATE_DATAL,RECE_CHKSUM1H;接收数据
MOV A,B
LCALL INT_CHKSUM
MOV A,B
LCALL HEX
ADD A,REG_H_BYTE
MOV DPL,POINTL
MOV DPH,POINTH
MOVX @DPTR,A
INC DPTR
MOV POINTL,DPL
MOV POINTH,DPH
DJNZ LENGTH,RD1
MOV communicate_state,#STATE_CHKSUM1H
LJMP INT_RETURN
RD1: MOV communicate_state,#STATE_DATAH
LJMP INT_RETURN
RECE_CHKSUM1H: CJNE A,#STATE_CHKSUM1H,RECE_CHKSUM1L接收和1校验低字节
MOV A,B
LCALL HEX
SWAP A
MOV REG_H_BYTE,A
MOV communicate_state,#STATE_CHKSUM1L
LJMP INT_RETURN
RECE_CHKSUM1L: CJNE A,#STATE_CHKSUM1L,RECE_CHKSUM2H接收和1校验高字节
MOV A,B
LCALL HEX
ADD A,REG_H_BYTE
MOV LENGTH,A
MOV communicate_state,#STATE_CHKSUM2H
LJMP INT_RETURN
RECE_CHKSUM2H: CJNE A,#STATE_CHKSUM2H,RECE_CHKSUM2L接收和2校验低字节
MOV A,B
LCALL HEX
SWAP A
MOV REG_H_BYTE,A
MOV communicate_state,#STATE_CHKSUM2L
LJMP INT_RETURN
RECE_CHKSUM2L: CJNE A,#STATE_CHKSUM2L,RECE_EOI接收和2校验高字节
MOV A,B
LCALL HEX
ADD A,REG_H_BYTE
MOV REG_H_BYTE,A
CLR C
MOV A,REG_CHK2L
CPL A
ADD A,#1
MOV REG_CHK2L,A
MOV A,REG_CHK2H
CPL A
ADDC A,#0
XRL A,LENGTH
JNZ RC_ERROR
MOV A,REG_CHK2L
XRL A,REG_H_BYTE
JNZ RC_ERROR
MOV communicate_state,#STATE_EOI
LJMP INT_RETURN
RC_ERROR: MOV communicate_state,#STATE_SOI
LJMP INT_RETURN
RECE_EOI: CJNE A,#STATE_EOI,RECE_OTHER ;接收结束字符0D
MOV A,B
CJNE A,#0DH,RECE_OTHER
SETB RECE_PC_OK_FLAG
MOV DPTR,#fcr ;FIFO控制寄存器地址 ;清零FIFO
MOV A,#07H ;FIFO允许,接收,发送FIFO复位,1字节的触发电平
MOVX @DPTR,A
MOV DPTR,#ier ;关接收,发送中断
MOV A,#0
MOVX @DPTR,A
RECE_OTHER: MOV communicate_state,#STATE_SOI
LJMP INT_RETURN
INT_RETURN: POP PSW ;恢复现场寄存器
POP DPH
POP DPL
POP B
POP A
RETI
;================================================================
;发送给上位机采用查询的方法发送
;=================================================================
INT_SEND: MOV DPTR,#LSR
MOVX A,@DPTR
JB ACC.5,IS0
INT_LSR_ERROR1:SETB RESET_ACE
CLR CTRL_485 ;
LCALL ACE_INIT
LJMP INT_RETURN
IS0: MOV A,COMMUNICATE_STATE
CJNE A,#STATE_SEND,SEND_OVER
MOV FIFO_LEN,#16
LCALL SEND_PC
LJMP INT_RETURN
SEND_OVER: MOV communicate_state,#STATE_SOI
MOV DPTR,#lsr ;线状态控制寄存器地址
MOVX A,@DPTR
JNB ACC.6,SEND_OVER ;查询是否为空
MOV T1M,#20
MOV DPTR,#ier ;关发送中断
MOV A,#01H
MOVX @DPTR,A
MOV DPTR,#fcr ;FIFO控制寄存器地址 ;此处清 FIFO
MOV A,#07H ;FIFO允许,接收,发送FIFO复位,1字节的触发电平
MOVX @DPTR,A
CLR ctrl_485 ;发完则接收有效,主要用于485总线
LJMP INT_RETURN
;=========================================================
SEND_PC: MOV DPTR,#FCR
MOV A,#7
MOVX @DPTR,A
SEND_PC0: MOV DPL,POINTL
MOV DPH,POINTH
MOVX A,@DPTR
INC DPTR
MOV POINTL,DPL
MOV POINTH,DPH
MOV DPTR,#ace_port
nop
MOVX @DPTR,A
CJNE A,#0DH,S_FIFO
MOV COMMUNICATE_state,#state_send_over
RET
S_FIFO: DJNZ FIFO_LEN,SEND_PC0
RET
INT_CHKSUM: CLR C
ADD A,REG_CHK2L ;形成和校验
MOV REG_CHK2L,A
MOV A,REG_CHK2H
ADDC A,#0
MOV REG_CHK2H,A
RET
;==========================================================
;将数据处理好,将数据整理成电总协议的格式,
;==========================================================
MAINLOOPPCDATA: JBC RECE_PC_OK_FLAG,PDP
RET
PDP: MOV A,CMD_STATE
CJNE A,#CMD2_REAL,PDA_PARA
PDA_REAL: MOV COMMUNICATE_STATE,#STATE_SEND
MOV A,PCM_STATE
ANL A,#0FH
LCALL ASCII ;设备断线,只用了底字节
MOV DPTR,#HEAD_REAL+16
MOVX @DPTR,A
MOV REG_CHK2L,#0
MOV REG_CHK2H,#0
MOV DPTR,#HEAD_REAL+1
MOV LENGTH,#20
PDAR: MOVX A,@DPTR ;前面的形成校验
LCALL INT_CHKSUM
INC DPTR
DJNZ LENGTH,PDAR
MOV R0,#LOW(ADDR_REAL)
MOV R1,#HIGH(ADDR_REAL)
MOV R6,#LOW(HEAD_REAL+21)
MOV R7,#HIGH(HEAD_REAL+21)
MOV DPTR,#LEN_REAL
INC DPH
MOV R4,DPL
MOV R5,DPH
LCALL WAHAHA
MOV DPTR,#HEAD_REAL
MOV POINTL,DPL
MOV POINTH,DPH
setb ctrl_485
nop
MOV DPTR,#ier ;关接收,开发送中断
MOV A,#2
MOVX @DPTR,A
;MOV DPTR,#ACE_PORT
;mov a,#0aah
;MOVX @DPTR,A
RET
PDA_PARA: CJNE A,#CMD2_PARA,PDA_SETUP
MOV COMMUNICATE_STATE,#STATE_SEND
MOV A,PCM_STATE
ANL A,#0FH
LCALL ASCII
MOV DPTR,#HEAD_PARA+16
MOVX @DPTR,A
SETB BREAK_FLAG
MOV REG_CHK2L,#0
MOV REG_CHK2H,#0
MOV DPTR,#HEAD_PARA+1
MOV LENGTH,#20
PDAP: MOVX A,@DPTR ;前面的形成校验
LCALL INT_CHKSUM
INC DPTR
DJNZ LENGTH,PDAP
MOV R0,#LOW(ADDR_PARA)
MOV R1,#HIGH(ADDR_PARA)
MOV R6,#LOW(HEAD_PARA+21)
MOV R7,#HIGH(HEAD_PARA+21)
MOV DPTR,#LEN_PARA
INC DPH
MOV R4,DPL
MOV R5,DPH
LCALL WAHAHA
MOV DPTR,#HEAD_PARA
MOV POINTL,DPL
MOV POINTH,DPH
setb ctrl_485
nop
MOV DPTR,#ier ;关接收,开发送中断
MOV A,#2
MOVX @DPTR,A
;MOV DPTR,#ACE_PORT
;clr a
;MOVX @DPTR,A
RET
PDA_SETUP: CJNE A,#CMD2_SETUP,PDA_OTHER
MOV COMMUNICATE_STATE,#STATE_SEND
SETB SETUP_FLAG
MOV A,PCM_STATE
ANL A,#0FH
LCALL ASCII
MOV DPTR,#HEAD_SETUP+16
MOVX @DPTR,A
MOV REG_CHK2L,#0
MOV REG_CHK2H,#0
MOV DPTR,#HEAD_SETUP+1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -