?? rect.asm
字號:
;矩形碼模擬通訊程序
SADDR EQU 2000H ;原始數據區首址。
DADDR EQU 2100H ;模擬接收數據區首址。
BUF EQU 2200H ;模擬發送緩沖區首址。
NUMB DATA 30H ;數據個數存放單元。
XCHG DATA 31H ;“行”校驗字節。
YCHG EQU 40H ;“列”校驗字節存放首址。
ERR BIT 00H ;出錯標志。
ORG 0000H
LJMP TEST
ORG 100H
TEST: MOV NUMB,#80H ;原始數據個數。
MOV R3,#80H
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 R3,COPY
MOV DPTR,#SADDR ;原始數據首址。
MOV P2,#HIGH(BUF) ;模擬發送緩沖區首址。
MOV R1,#LOW(BUF)
LCALL TRANS ;模擬發送。
MOV DPTR,#DADDR ;模擬接收數據保存區首址。
MOV P2,#HIGH(BUF) ;模擬發送緩沖區首址。
MOV R1,#LOW(BUF)
LCALL RECEV ;模擬接收,數據應該正確。
MOV P2,#HIGH(BUF) ;在模擬通訊緩沖區子制造一個差錯。
MOV R1,#LOW(BUF)+5 ;
MOVX A,@R1 ;
XRL A,#02H ;
MOVX @R1,A ;
MOV DPTR,#DADDR ;模擬接收數據保存區首址。
MOV P2,#HIGH(BUF) ;模擬發送緩沖區首址。
MOV R1,#LOW(BUF)
LCALL RECEV ;再接收一次,應該能夠糾正這個差錯。
STOP: LJMP STOP ;
TRANS: CLR A
MOV XCHG,A ;“行”校驗字節初始化。
MOV R2,#10H ;16個“列”校驗字節初始化。
MOV R0,#YCHG
CLEAR: MOV @R0,A
INC R0
DJNZ R2,CLEAR
MOV R2,#8 ;發送8行。
LOOP: MOV R3,#10H ;每行16個字節。
MOV R0,#YCHG ;“列”校驗位置初始化。
CLR F0 ;“行”校驗位初始化。
LOOP1: MOVX A,@DPTR ;讀取一字節數據。
JNB PSW.0,LOOP2 ;本字節偶校驗。
CPL F0 ;累加到“行”校驗位上。
LOOP2: MOV R4,A ;暫存數據內容。
XRL A,@R0 ;進行“列”校驗。
MOV @R0,A
MOV A,R4 ;將本字節數據發送出去。
LCALL OUT
INC DPTR ;調整數據指針。
INC R0 ;調整“列”校驗指針。
DJNZ R3,LOOP1 ;處理完一行。
MOV A,XCHG ;取“行”校驗字節。
MOV C,F0 ;將本行偶校驗位拼入“行”校驗字節。
RRC A
MOV XCHG,A
DJNZ R2,LOOP ;發送完8行數據信息。
MOV R0,#YCHG ;發送16個字節的“列”校驗信息。
MOV R2,#10H
LOOP3: MOV A,@R0
LCALL OUT
INC R0
DJNZ R2,LOOP3
MOV A,XCHG ;發送一個字節的“行”校驗信息。
LCALL OUT
RET ;發送結束。
OUT: MOVX @R1,A ;發送到通訊緩沖區。
INC R1
RET
RECEV: CLR A ;接收程序。
MOV XCHG,A ;“行”校驗字節初始化。
MOV R2,#10H ;16個“列”校驗字節初始化。
MOV R0,#YCHG
CLE: MOV @R0,A
INC R0
DJNZ R2,CLE
CLR ERR ;出錯標志初始化。
MOV R2,#8 ;接收8行數據。
LP: MOV R3,#10H ;每行16個字節。
MOV R0,#YCHG ;“列”校驗位置初始化。
CLR F0 ;“行”校驗初始化。
LP1: LCALL INBY ;輸入一字節數據。
MOVX @DPTR,A ;存入數據區。
INC DPTR ;調整數據指針。
JNB PSW.0,LP2 ;本字節偶校驗。
CPL F0 ;累加到“行”校驗位上。
LP2: XRL A,@R0 ;進行“列”校驗。
MOV @R0,A
INC R0 ;調整“列”校驗指針。
DJNZ R3,LP1 ;處理完一行。
MOV A,XCHG ;取“行”校驗字節。
MOV C,F0 ;將本行偶校驗位拼入“行”校驗字節。
RRC A
MOV XCHG,A
DJNZ R2,LP ;接收完8行數據信息。
MOV R3,#10H ;準備接收16個字節的“列”校驗信息。
MOV R0,#YCHG ;“列”校驗位置指針初始化。
CLR F0 ;“列”校驗出錯初始化。
LP3: LCALL INBY ;輸入一字節數據。
XRL A,@R0 ;進行“列”校驗核查。
JZ LP4 ;本列未發現差錯。
SETB F0 ;本列校驗出錯。
MOV R5,A ;保存糾錯信息。
MOV A,R0 ;計算列出錯位置。
CLR C
SUBB A,#YCHG
MOV R4,A ;保存差錯所在列字節位置。
LP4: INC R0 ;調整“列”校驗指針。
DJNZ R3,LP3 ;核查完16列字節。
LCALL INBY ;輸入“行”校驗字節。
XRL A,XCHG ;核查“行”校驗字節。
JNZ CHG1 ;“行”校驗出錯。
JNB F0,REND ;未發現差錯,接收成功。
ERROR: SETB ERR ;找不到差錯所在位置,差錯可能不止一個。
REND: RET
CHG1: JNB F0,ERROR ;無法確定差錯所在列。
MOV R3,#0 ;準備判斷差錯所在“行”。
CHG2: RRC A
JC CHG3 ;找到差錯所在行。
INC R3 ;調整到下一行。
SJMP CHG2
CHG3: MOV A,DPL ;將DPTR調整到數據區首址。
CLR C
SUBB A,#80H
MOV DPL,A
JNC CHG4
DEC DPH
CHG4: MOV A,R3 ;計算差錯所在位置。
SWAP A
ADD A,R4
ADD A,DPL
MOV DPL,A
JNC CHG5
INC DPH
CHG5: MOVX A,@DPTR ;糾正差錯。
XRL A,R5
MOVX @DPTR,A
RET
INBY: MOVX A,@R1 ;從緩沖區讀取一個數據。
INC R1
RET
DATS: DB 00H,27H,4BH,05H,06H,07H,08H,4CH
DB 4DH,4EH,4FH,50H,51H,52H,53H,54H
DB 55H,56H,57H,58H,59H,5AH,5BH,5CH
DB 5DH,5EH,5FH,60H,61H,62H,6EH,6FH
DB 70H,02H,03H,01H,24H,25H,26H,04H
DB 09H,0AH,0BH,0CH,0DH,0EH,0FH,10H
DB 11H,12H,13H,17H,18H,19H,1AH,1BH
DB 1CH,1DH,1EH,1FH,20H,21H,22H,23H
DB 71H,75H,76H,77H,78H,79H,28H,29H
DB 2AH,2BH,2CH,63H,64H,65H,66H,67H
DB 68H,69H,6AH,14H,15H,16H,72H,73H
DB 74H,6BH,6CH,6DH,2DH,2EH,2FH,30H
DB 31H,32H,33H,34H,35H,39H,3AH,3BH
DB 3CH,3DH,3EH,3FH,40H,41H,42H,43H
DB 44H,45H,46H,47H,48H,49H,4AH,7AH
DB 36H,37H,38H,7BH,7CH,7DH,7EH,7FH
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -