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