📄 parity.asm
字号:
;偶校验检错码模拟通讯程序
SADDR EQU 2000H ;数据区首址。
BADDR EQU 2100H ;模拟发送缓冲区首址。
DADDR EQU 2020H ;数据保存区首址。
NUMB DATA 30H ;数据个数存放单元。
ERR BIT 00H ;出错标志。
ORG 0000H
LJMP TEST
ORG 100H ;测试程序。
TEST: MOV NUMB,#20H ;原始数据个数。
MOV R2,#20H
MOV DPTR,#DATS
MOV P2,#HIGH(SADDR) ;片外RAM中数据存放首址。
MOV R0,#LOW(SADDR)
COPY: CLR A
MOVC A,@A+DPTR ;将测试数据存放到片外RAM中。
MOVX @R0,A
INC DPTR
INC R0
DJNZ R2,COPY
MOV NUMB,#20H ;原始数据个数。
MOV DPTR,#SADDR ;原始数据首址。
MOV P2,#HIGH(BADDR) ;模拟发送缓冲区首址。
MOV R0,#LOW(BADDR)
LCALL TRANS ;模拟发送。
MOV DPTR,#DADDR ;模拟接收数据保存区首址。
MOV P2,#HIGH(BADDR) ;模拟发送缓冲区首址。
MOV R0,#LOW(BADDR)
LCALL RECEV ;模拟接收。
NOP ;应该没有差错。
NOP
NOP
MOV P2,#HIGH(BADDR) ;在模拟通讯缓冲区子制造一个差错。
MOV R0,#LOW(BADDR)+5
MOVX A,@R0
XRL A,#40H
MOVX @R0,A
MOV DPTR,#DADDR+32 ;模拟接收数据保存区首址。
MOV R0,#LOW(BADDR)
LCALL RECEV ;再接收一次,应该能够发现差错(ERR=1)。
STOP: LJMP STOP ;
TRANS: MOV A,NUMB ;模拟发送程序,先取数据个数。
MOV R2,A
LCALL OUTB ;发送数据个数。
TRNS: MOVX A,@DPTR ;读取一个数据。
LCALL OUTB ;发送一字节数据。
INC DPTR ;调整数据指针。
DJNZ R2,TRNS ;发送完全部数据。
RET ;发送结束。
OUTB: MOV B,A ;暂存。
SWAP A ;取高四位。
LCALL OUT ;发送出去。
MOV A,B ;取低四位。
OUT: ANL A,#0FH ;将十六进制数转换成ASCII码。
ADD A,#90H
DA A
ADDC A,#40H
DA A
MOV C,PSW.0 ;取偶校验结果。
MOV ACC.7,C ;拼入最高位。
MOVX @R0,A ;发送到模拟缓冲区。
INC R0
RET
RECEV: CLR ERR ;出错标志初始化。
LCALL INBY ;输入一个字节。
MOV NUMB,A ;保存数据长度。
MOV R2,A
RECV: LCALL INBY ;输入一个字节。
MOVX @DPTR,A ;存入数据区。
INC DPTR ;调整数据指针。
DJNZ R2,RECV ;输入全部数据。
RET
INBY: LCALL INB ;输入四位信息。
SWAP A ;高四位。
MOV B,A ;暂存。
LCALL INB ;再输入四位信息。
ORL A,B ;低四位与高四位拼接成一个字节。
RET
INB: MOVX A,@R0 ;从模拟通讯缓冲区读取一个数据。
INC R0
JNB PSW.0,ASC ;偶校验正确否?
SETB ERR ;偶校验出错,设立出错标志。
ASC: ANL A,#7FH ;除去偶校验位,恢复原ASCII码。
CLR C ;将ASCII码转换为十六进制数。
SUBB A,#30H
JNB ACC.4,INE
SUBB A,#7
INE: RET
DATS: DB 1,2,3,4,5,6,7,8
DB 9,10,11,12,13,14,15,16
DB 17,18,19,20,21,22,23,24
DB 25,26,27,28,29,30,31,32
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -