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