?? main_b0.asm
字號:
MOV LINE,#00H
NOP
NOP
LJMP MAIN_INITADDR
;-----------------------------------------------------------------
COMMAND_ERR: ;接收數據出錯處理
MOV SCON, #50H ;串行口工作在方式1,接收允許
MOV TMOD, #20H ;TMR1工作在MODE2(8位自動重裝方式)
;MOV TH1,#0F3H
;MOV TL1,#0F3H ; 波特率為2400
MOV TH1,#0F4H
MOV TL1,#0F4H ; 波特率為2400
MOV PCON,#00H
SETB TR1 ; 啟動T1
MOV SYS_STATUS,#0A0H; 系統設定為接收狀態
MOV RECIEVE_NUM,#06H; 設定從上位機發來的命令字長為6字節
MOV R0,#COMMAND0
NOP
NOP
LJMP MAIN_RRR
;-------------------------------------------------------------------
MAIN_INITADDR: ;先由塊序號和行號求出偏移地址
MOV A,LINE
RL A
SWAP A
ANL A,#0F0H
MOV ADDR_LOW,A
MOV A,BLOCK_NUM
RL A
SWAP A
ANL A,#0F0H
MOV ADDR_HIGH,A
MOV A,LINE
SWAP A
ANL A,#0FH
ADD A,ADDR_HIGH
MOV ADDR_HIGH,A
MOV SYS_STATUS,#0A3H
NOP
NOP
NOP
;-----------------------------------------------------------------
MAIN_RDD: ;讀入一行數據(16字節),并轉化為INTER HEX的數據格式
LCALL READ_BIN
LCALL HEX2ASC
MOV SYS_STATUS,#0A4H
MOV R0,#ADDR_HEX
MOV NUM,#4CH ; 每個記錄為44字節
LP_TTT0: MOV A,@R0
CLR TI
MOV SBUF,A ; 送出一個字節
LP_TTT:
JNB TI,LP_TTT
CLR TI
;發好一個字節的處理
INC R0
DJNZ NUM,LP_TTT0 ;此行記錄未發完則繼續發送
MOV SYS_STATUS,0A5H
; 0A5H---LINE計數及地址刷新處理
INC LINE
MOV A,#20H
ADD A,ADDR_LOW
MOV ADDR_LOW,A
CLR A
ADDC A,ADDR_HIGH
MOV ADDR_HIGH,A
MOV SYS_STATUS,#0A4H
MOV A,LINE
JZ MAIN_ALINE0
NOP
NOP
LJMP MAIN_RDD
;-----------------------------------------------------------------------
MAIN_ALINE0: MOV SYS_STATUS,#0A0H
LJMP COMMAND_ERR
NOP
NOP
LJMP MAIN_RRR
;-----------------------------------------------------------------------
READ_BIN: ;從片外存儲器中讀取16字節數據
MOV CNT,#20H
MOV R0,#ADDR_BIN
MOV DPL,ADDR_LOW
MOV DPH,ADDR_HIGH
MOV A,BLOCK_NUM
MOV C,ACC.3
MOV P1.7,C
LP_RD: MOVX A,@DPTR
MOV @R0,A
INC DPTR
INC R0
DJNZ CNT,LP_RD
RET
NOP
NOP
LJMP ERR
;--------------------------------------------------------------------
TAB_HEX2ASC:
DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
; 0,1,2,3,4,5,6,7,8,9
DB 41H,42H,43H,44H,45H,46H
; A,B,C,D,E,F
; ":"的ASCII碼為:3AH,"CR"(回車)的ASCII為:0DH
NOP
NOP
LJMP ERR
;--------------------------------------------------------------------
HEX2ASC: ; 由十六進制數據生成INTER HEX 格式文件數據的子程序
MOV R0,#ADDR_HEX
MOV TEMP,#00H
; 取INTER HEX 文件數據段首地址作為指針
MOV A,#3AH
MOV @R0,A
INC R0 ; 數據段以":" 打頭
MOV A,#32H
MOV @R0,A
INC R0
MOV A,#30H
MOV @R0,A
INC R0 ; 記錄長度(20H)
MOV A,#20H
ADD A,TEMP
MOV TEMP,A ; 記錄長度加入累加和中
MOV DPTR,#TAB_HEX2ASC
MOV A,ADDR_HIGH
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV @R0,A
INC R0
MOV A,ADDR_HIGH
ANL A,#0FH
MOVC A,@A+DPTR
MOV @R0,A
INC R0 ; 加入偏移地址高字節
MOV A,ADDR_LOW
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV @R0,A
INC R0
MOV A,ADDR_LOW
ANL A,#0FH
MOVC A,@A+DPTR
MOV @R0,A
INC R0 ; 加入偏移地址低字節
MOV A,ADDR_HIGH
ADD A,TEMP
ADD A,ADDR_LOW
MOV TEMP,A ; 偏移地址加入累加和
MOV A,#30H
MOV @R0,A
INC R0
MOV @R0,A
INC R0 ; 此記錄為數據記錄
; 記錄類別為數據(00H),不用加入累加和中
MOV CNT,#20H ; 設定記錄長度為10H
MOV R1,#ADDR_BIN
LP_HEX: MOV A,@R1 ; 讀入一字節數據
ADD A,TEMP
MOV TEMP,A ; 加入累加和中
MOV A,@R1 ; 重讀此字節
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV @R0,A
INC R0
MOV A,@R1
ANL A,#0FH
MOVC A,@A+DPTR
MOV @R0,A
INC R0
INC R1
DJNZ CNT,LP_HEX
;加上校驗和
MOV A,TEMP
CPL A
INC A
MOV TEMP,A
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV @R0,A
INC R0
MOV A,#0FH
ANL A,TEMP
MOVC A,@A+DPTR
MOV @R0,A
INC R0
MOV A,#0AH
MOV @R0,A ;記錄以回車符結束
RET
NOP
NOP
LJMP ERR
;-------------------------------------------------------------------------
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -