?? 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低字節(jié)
MOV A,B
LCALL INT_CHKSUM
MOV A,B
LCALL HEX
ADD A,REG_H_BYTE
RC2_REAL: CJNE A,#CMD2_REAL,RC2_PARA ;判斷是否為取實(shí)時(shí)數(shù)據(jù)命令
MOV CMD_STATE,#CMD2_REAL
AJMP RC2_RIGHT
RC2_PARA: CJNE A,#CMD2_PARA,RC2_SETUP ;判斷是否為取實(shí)參數(shù)據(jù)命令
MOV CMD_STATE,#CMD2_PARA
AJMP RC2_RIGHT
RC2_SETUP: CJNE A,#CMD2_SETUP,RC2_OTHER ;判斷是否為取設(shè)置命令
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 ;接收長度校驗(yàn)低字節(jié)
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 ;接收長度校驗(yàn)高字節(jié)
MOV A,B
LCALL INT_CHKSUM
MOV communicate_state,#STATE_LENM ;命令的長度比較短,最長只有10個(gè)字節(jié),這個(gè)字節(jié)為0
LJMP INT_RETURN
RECE_LENM: CJNE A,#STATE_LENM,RECE_LENL ;命令的長度比較短,最長只有10個(gè)字節(jié),這個(gè)字節(jié)為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 ;接收數(shù)據(jù)
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;接收數(shù)據(jù)
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校驗(yàn)低字節(jié)
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校驗(yàn)高字節(jié)
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校驗(yàn)低字節(jié)
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校驗(yàn)高字節(jié)
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 ;接收結(jié)束字符0D
MOV A,B
CJNE A,#0DH,RECE_OTHER
SETB RECE_PC_OK_FLAG
MOV DPTR,#fcr ;FIFO控制寄存器地址 ;清零FIFO
MOV A,#07H ;FIFO允許,接收,發(fā)送FIFO復(fù)位,1字節(jié)的觸發(fā)電平
MOVX @DPTR,A
MOV DPTR,#ier ;關(guān)接收,發(fā)送中斷
MOV A,#0
MOVX @DPTR,A
RECE_OTHER: MOV communicate_state,#STATE_SOI
LJMP INT_RETURN
INT_RETURN: POP PSW ;恢復(fù)現(xiàn)場寄存器
POP DPH
POP DPL
POP B
POP A
RETI
;================================================================
;發(fā)送給上位機(jī)采用查詢的方法發(fā)送
;=================================================================
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 ;線狀態(tài)控制寄存器地址
MOVX A,@DPTR
JNB ACC.6,SEND_OVER ;查詢是否為空
MOV T1M,#20
MOV DPTR,#ier ;關(guān)發(fā)送中斷
MOV A,#01H
MOVX @DPTR,A
MOV DPTR,#fcr ;FIFO控制寄存器地址 ;此處清 FIFO
MOV A,#07H ;FIFO允許,接收,發(fā)送FIFO復(fù)位,1字節(jié)的觸發(fā)電平
MOVX @DPTR,A
CLR ctrl_485 ;發(fā)完則接收有效,主要用于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 ;形成和校驗(yàn)
MOV REG_CHK2L,A
MOV A,REG_CHK2H
ADDC A,#0
MOV REG_CHK2H,A
RET
;==========================================================
;將數(shù)據(jù)處理好,將數(shù)據(jù)整理成電總協(xié)議的格式,
;==========================================================
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 ;設(shè)備斷線,只用了底字節(jié)
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 ;前面的形成校驗(yàn)
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 ;關(guān)接收,開發(fā)送中斷
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 ;前面的形成校驗(yàn)
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 ;關(guān)接收,開發(fā)送中斷
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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -