📄 hex.asm
字号:
;和校验(HEX格式)检错码模拟通讯程序
SADDR EQU 2000H ;原始数据区首址。
BADDR EQU 3000H ;模拟发送缓冲区首址。
NUMBH DATA 30H ;数据个数存放单元(高字节)。
NUMBL DATA 31H ;数据个数存放单元(低字节)。
ERR BIT 00H ;出错标志。
ORG 0000H
LJMP TEST
ORG 100H ;测试程序。
TEST: MOV NUMBH,#1 ;原始数据有0126H字节。
MOV NUMBL,#26H ;
MOV R2,NUMBH
MOV R3,NUMBL
MOV DPTR,#DATS
MOV P2,#HIGH(SADDR) ;片外RAM中数据存放首址。
MOV R0,#LOW(SADDR)
MOV A,R3
JZ COPY
INC R2
COPY: CLR A
MOVC A,@A+DPTR ;将测试数据存放到片外RAM中。
MOVX @R0,A
INC DPTR
INC R0
CJNE R0,#0,COPY1
INC P2
COPY1: DJNZ R3,COPY
DJNZ R2,COPY
MOV DPTR,#SADDR ;原始数据首址。
MOV P2,#HIGH(BADDR) ;模拟发送缓冲区首址。
MOV R0,#LOW(BADDR)
LCALL TRANS ;模拟发送。
LCALL CLEAR ;将原始数据清除。
MOV P2,#HIGH(BADDR) ;模拟发送缓冲区首址。
MOV R0,#LOW(BADDR)
LCALL RECEV ;模拟接收。
NOP ;原始数据应该无误恢复。
NOP
NOP
MOV P2,#HIGH(BADDR) ;在模拟通讯缓冲区制造一个差错。
MOV R0,#LOW(BADDR)+5
MOV R0,#5
MOVX A,@R0
XRL A,#40H
MOVX @R0,A
LCALL CLEAR ;再将原始数据清除。
MOV P2,#HIGH(BADDR) ;再接收一次,应该能够发现差错(ERR=1)。
MOV R0,#LOW(BADDR)
LCALL RECEV
STOP: LJMP STOP
CLEAR: MOV DPTR,#2000H
MOV R2,#2
MOV R3,#0
MOV A,#0FFH
CL: MOVX @DPTR,A
INC DPTR
DJNZ R3,CL
DJNZ R2,CL
RET
TRANS: MOV R2,#10H ;预定一组为16个字节。
MOV A, NUMBH
JNZ TRNS1 ;尚未传送的数据超过256字节。
MOV A,NUMBL
ANL A,#0F0H
JNZ TRNS1 ;尚未传送的数据超过16字节。
MOV R2,NUMBL ;传送最后不足16字节的数据。
TRNS1: CLR C ;计算这次传送后将剩下的字节数。
MOV A,NUMBL
SUBB A,R2
MOV NUMBL,A
JNC TRNS2
DEC NUMBH
TRNS2: MOV A,#3AH ;发送冒号,开始一组传送过程。
LCALL OUT1
MOV R3,#0 ;累加和初始化。
MOV A,R2 ;取本组发送数据量。
JZ TREND ;如为零,发送结束组。
LCALL OUTB ;发送本组数据字节数。
MOV A,DPH ;发送起始地址。
LCALL OUTB
MOV A,DPL
LCALL OUTB
MOV A,#00H ;发送数据标识。
LCALL OUTB
TRNS3: MOVX A,@DPTR ;发送本组数据。
LCALL OUTB
INC DPTR ;调整数据指针。
DJNZ R2,TRNS3 ;发送完本组全部数据。
MOV A,R3 ;取累加和。
CPL A ;取补。
INC A
LCALL OUTB ;发送校验字。
MOV A,#0DH ;发送回车换行符。
LCALL OUT1
MOV A,#0AH
LCALL OUT1
SJMP TRANS ;继续处理剩余数据。
TREND: MOV A,#00H ;发送结束组,数据字节数为零。
LCALL OUTB
MOV A,#00H ;地址为0000H。
LCALL OUTB
MOV A,#00H
LCALL OUTB
MOV A,#01H ;标识符为01H。
LCALL OUTB
MOV A,#0FFH ;校验字节为0FFH。
LCALL OUTB
MOV A,#0DH ;发送回车换行符。
LCALL OUT1
MOV A,#0AH
LCALL OUT1
RET ;数据全部发送完毕。
OUTB: MOV B,A ;发送一个字节,暂存该字节内容。
ADD A,R3 ;累加。
MOV R3,A
MOV A,B ;取该字节内容。
SWAP A ;先处理高四位。
LCALL OUT ;发送出去。
MOV A,B ;再发送低四位。
OUT: ANL A,#0FH ;将十六进制数转换成ASCII码。
ADD A,#90H
DA A
ADDC A,#40H
DA A
OUT1: MOVX @R0,A ;输出到模拟发送缓冲区。
INC R0
CJNE R0,#0,OUTE
INC P2
OUTE: RET
RECEV: CLR ERR ;出错标志初始化。
RECV: LCALL READB ;等待串行口接收到数据。
CJNE A,#3AH,RECV ;等待分组开始的冒号。
MOV R3,#0 ;本组“累加和”初始化。
LCALL INBY ;从串行口输入一个字节数据。
MOV R2,A ;本组数据字节数。
LCALL INBY ;从串行口输入一个字节数据。
MOV DPH,A ;本组数据存放地址的高字节。
LCALL INBY ;从串行口输入一个字节数据。
MOV DPL,A ;本组数据存放地址的低字节。
LCALL INBY ;从串行口输入一个字节数据。
MOV R4,A ;本组标识码。
MOV A,R2
JZ REC4
REC1: LCALL INBY ;从串行口输入一个字节数据。
MOVX @DPTR,A ;存入数据区。
INC DPTR ;调整储存指针。
DJNZ R2,REC1 ;数据部分接收完毕否?
REC4: LCALL INBY ;从串行口输入一个字节数据。
MOV A,R3 ;取校验结果。
JZ REC5 ;校验出错否?
SETB ERR ;校验出错,设立出错标志。
REC5: MOV A,R4 ;本组标识判断。
JZ RECV ;非结束组,继续接收下一组数据。
RET ;全部数据接收完毕。
INBY: LCALL INB ;先从串行口输入四位信息。
SWAP A ;高四位。
MOV B,A ;暂存。
LCALL INB ;再从串行口输入四位信息。
ORL A,B ;低四位与高四位拼接成一个字节。
XCH A,R3 ;计算累加和。
ADD A,R3
XCH A,R3
RET
INB: LCALL READB ;
ANL A,#7FH ;除去偶校验位,恢复原ASCII码。
CLR C ;将ASCII码转换为十六进制数。
SUBB A,#30H
JNB ACC.4,INE
SUBB A,#7
INE: RET
READB: MOVX A,@R0
INC R0
CJNE R0,#0,REND
INC P2
REND: RET
DATS: DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 08H,09H,0AH,0BH,0CH,0DH,0EH,0FH
DB 10H,11H,12H,13H,14H,15H,16H,17H
DB 18H,19H,1AH,1BH,1CH,1DH,1EH,1FH
DB 20H,21H,22H,23H,24H,25H,26H,27H
DB 28H,29H,2AH,2BH,2CH,2DH,2EH,2FH
DB 30H,31H,32H,33H,34H,35H,36H,37H
DB 38H,39H,3AH,3BH,3CH,3DH,3EH,3FH
DB 40H,41H,42H,43H,44H,45H,46H,47H
DB 48H,49H,4AH,4BH,4CH,4DH,4EH,4FH
DB 50H,51H,52H,53H,54H,55H,56H,57H
DB 58H,59H,5AH,5BH,5CH,5DH,5EH,5FH
DB 60H,61H,62H,63H,64H,65H,66H,67H
DB 68H,69H,6AH,6BH,6CH,6DH,6EH,6FH
DB 70H,71H,72H,73H,74H,75H,76H,77H
DB 78H,79H,7AH,7BH,7CH,7DH,7EH,7FH
DB 80H,81H,82H,83H,84H,85H,86H,87H
DB 88H,89H,8AH,8BH,8CH,8DH,8EH,8FH
DB 90H,91H,92H,93H,94H,95H,96H,97H
DB 98H,99H,9AH,9BH,9CH,9DH,9EH,9FH
DB 0A0H,0A1H,0A2H,0A3H,0A4H,0A5H,0A6H,0A7H
DB 0A8H,0A9H,0AAH,0ABH,0ACH,0ADH,0AEH,0AFH
DB 0B0H,0B1H,0B2H,0B3H,0B4H,0B5H,0B6H,0B7H
DB 0B8H,0B9H,0BAH,0BBH,0BCH,0BDH,0BEH,0BFH
DB 0C0H,0C1H,0C2H,0C3H,0C4H,0C5H,0C6H,0C7H
DB 0C8H,0C9H,0CAH,0CBH,0CCH,0CDH,0CEH,0CFH
DB 0D0H,0D1H,0D2H,0D3H,0D4H,0D5H,0D6H,0D7H
DB 0D8H,0D9H,0DAH,0DBH,0DCH,0DDH,0DEH,0DFH
DB 0E0H,0E1H,0E2H,0E3H,0E4H,0E5H,0E6H,0E7H
DB 0E8H,0E9H,0EAH,0EBH,0ECH,0EDH,0EEH,0EFH
DB 0F0H,0F1H,0F2H,0F3H,0F4H,0F5H,0F6H,0F7H
DB 0F8H,0F9H,0FAH,0FBH,0FCH,0FDH,0FEH,0FFH
DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 08H,09H,0AH,0BH,0CH,0DH,0EH,0FH
DB 10H,11H,12H,13H,14H,15H,16H,17H
DB 18H,19H,1AH,1BH,1CH,1DH,1EH,1FH
DB 20H,21H,22H,23H,24H,25H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -