📄 net.asm
字号:
;串行中断
;
PSI: JBC RI,PS1
RETI
PS1: PUSH A
PUSH PSW
SETB RS1
CLR RS0
JB FREC_OVER,PS7 ;如果一条有效的命令接收完毕,停止响应接收数据直接退出
JNB FREC_COM,PS3 ;接收的第一阶段
MOV REC_COM,SBUF
CLR FREC_COM
SETB FREC_LEN
SJMP PS2
PS3: JNB FREC_LEN,PS4 ;接收的第二阶段
CLR FREC_LEN
MOV A,SBUF
ANL A,#0FH
MOV LEN,A
JZ PS2
MOV R7,A
SETB FREC_DATA
MOV REC_P,#REC_DATA
SJMP PS2
PS4: JNB FREC_DATA,PS6 ;接收的第三阶段
MOV R0,REC_P
MOV @R0,SBUF
INC REC_P
DJNZ R7,PS2
CLR FREC_DATA
SETB FREC_EDC
SJMP PS2
PS6: JNB FREC_EDC,PS2
MOV EDC,SBUF
CLR FREC_EDC
LCALL REC_V
JC PS2
SETB FREC_OVER
SJMP PS7
PS2:
MOV A,SBUF
CJNE A,#0FFH,PS7
SETB FREC_COM
CLR FREC_LEN
CLR FREC_DATA
CLR FREC_EDC
CLR FREC_OVER
PS7: POP PSW
POP A
RETI
;串行命令处理
NET:
JBC FREC_OVER,NET_01
RET
NET_01:
MOV A,REC_COM
CJNE A,#10H,NET_CHANGENO
MOV R0,#REC_DATA
MOV A,@R0
CJNE A,MACNO,NET_RET ;非本机数据则退出
MOV A,LEN
CJNE A,#1,NET_RET
JB FKEYA,NET_02
MOV R0,#REC_DATA
MOV @R0,MACNO
INC R0
MOV @R0,#00H ;无按键时返回值
MOV LEN,#2
LCALL GEDC
LJMP SEND
NET_02:
MOV R0,#REC_DATA
MOV @R0,MACNO
INC R0
MOV @R0,KEYSEND ;
MOV LEN,#2
LCALL GEDC
LCALL SEND
MOV JSQ_LOCAL_LOOP,#100
CLR FLAG2
NET_03:
JBC FREC_OVER,NET_04
JNB FLAG2,NET_03
MOV WDT,#3FH
SJMP NET_03
NET_04:
MOV R0,#REC_DATA
MOV A,@R0
CJNE A,MACNO,NET_RET ;非本机数据则退出
MOV A,REC_COM
CJNE A,#10H,NET_RET
MOV A,LEN
CJNE A,#1,NET_RET
CLR FKEYA
INC NUMDIS
MOV JSQ_SPEAK,#10 ;有按键,发音
SETB WORKLED
CLR SPEAK
NET_RET:
RET
;-------------------------------------------
;更改机号
;本身的物理编号长度为四字节
NET_CHANGENO:
CJNE A,#20H,SENDMAC ;更改机号命令
MOV A,LEN
CJNE A,#05H,NET_RET ;长度
MOV R0,#REC_DATA+1
MOV DPTR,#MAC
MOV R7,#4
NET_CHANGENO_01:
CLR A
MOVC A,@A+DPTR
MOV B,@R0
CJNE A,B,NET_CHANGENO_RET
INC R0
INC DPTR
DJNZ R7,NET_CHANGENO_01
MOV R0,#REC_DATA
MOV MACNO,@R0
LCALL WRITEMAC
LCALL READMAC
MOV @R0,MACNO
MOV LEN,#1
LCALL GEDC
LJMP SEND
NET_CHANGENO_RET:
RET
;----------------------------------------
SENDMAC:
CJNE A,#30H,SENDMAC_RET
MOV A,LEN
CJNE A,#01H,SENDMAC_RET
MOV DPTR,#MAC
MOV R7,#4
MOV R0,#REC_DATA
MOV @R0,MACNO
INC R0
SENDMAC_01:
CLR A
MOVC A,@A+DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R7,SENDMAC_01
MOV LEN,#5
LCALL GEDC
LJMP SEND
SENDMAC_RET:
RET
;校验EDC
REC_V:
CLR A
XRL A,REC_COM
XRL A,LEN
MOV R7,LEN
MOV R0,#REC_DATA
RV1: XRL A,@R0
INC R0
DJNZ R7,RV1
JNB ACC.7,RV3
CPL A
RV3: CJNE A,EDC,RV2
RET
RV2: SETB C
RET
;EDC运算
GEDC:
CLR A
MOV R7,LEN
MOV R0,#REC_DATA
GE1: XRL A,@R0
INC R0
DJNZ R7,GE1
JNB ACC.7,GE2
CPL A
GE2: MOV EDC,A
RET
;串行数据发送子程序
SEND:
CLR TI
MOV R7,LEN
MOV R0,#REC_DATA
SE1: MOV A,@R0
MOV SBUF,A
JNB TI,$
CLR TI
INC R0
DJNZ R7,SE1
MOV SBUF,EDC
JNB TI,$
CLR TI
SE2: RET
;--------------------------------------
;ASCII转换为16进制数
ASCII_HEX:
MOV A,@R0
CJNE A,#3AH,AH1
AH1: JC AH2
SUBB A,#55
SJMP AH3
AH2: ANL A,#0FH
AH3: MOV B,A
INC R0
MOV A,@R0
CJNE A,#3AH,AH4
AH4: JC AH5
SUBB A,#55
SJMP AH6
AH5: ANL A,#0FH
AH6: SWAP A
ORL A,B
INC R0
RET
;---------------------------------------
;HEX转十六进制
HEX_ASCII:
MOV B,A
ANL A,#0FH
CJNE A,#0AH,HA1
HA1: JC HA2
ADD A,#55
SJMP HA3
HA2: ORL A,#30H
HA3: MOV @R0,A
INC R0
MOV A,B
SWAP A
ANL A,#0FH
CJNE A,#0AH,HA4
HA4: JC HA5
ADD A,#55
SJMP HA6
HA5: ORL A,#30H
HA6: MOV @R0,A
INC R0
RET
;-----------------------------------------
;显示错误
DERR:
MOV DIS_BUF+0,#0DH
MOV DIS_BUF+1,#0EH
MOV DIS_BUF+2,#0EH
MOV DIS_BUF+3,#0AH
MOV DIS_BUF+4,#0AH
MOV DIS_BUF+5,A
MOV JSQ_LOCAL_LOOP,#200
CLR FLAG2
DERR_01:
LCALL NET
JNB FLAG2,DERR_01
DERR_RET:
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -