?? 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 + -