📄 main.asm
字号:
SETB P1.7
SJMP LP_RDBIN
MAIN_3X: SETB P1.6
MOV A,ADDR_HIGH
MOV C,ACC.7
MOV P1.7,C
CLR ACC.7
MOV DPH,A
;-------------
LP_RDBIN: MOVX A,@DPTR
MOV @R1,A
INC DPTR
INC R1
DJNZ R2,LP_RDBIN
NOP
NOP
;R1为字符串指针;R3为字节数,结果存放在CRC_VALUE中
MOV R1,#BUFFER_TX
MOV R3,#20H
MOV CRC_VALUE,#00H
MOV DPTR,#TAB_CRC
LP_GCRC: MOV A,@R1
XRL A,CRC_VALUE
MOVC A,@A+DPTR
MOV CRC_VALUE,A
INC R1
DJNZ R3,LP_GCRC
MOV @R1,A
MOV SYS_STATUS,#0A4H
LJMP MAIN
NOP
NOP
LJMP ERROR
;--------------------------------------------------------------------------
MAIN_4: ; 将数据及CRC校验字节发向上位机
MOV RX_CHAR,#55H
MOV R0,#BUFFER_RX
MOV R2,#01H ;准备好接收上位机的回应
MOV R1,#BUFFER_TX
MOV R3,#21H
CLR EA
LP_TXBIN: CLR TI
MOV A,@R1
MOV SBUF,A
INC R1
DJNZ R3,W_TXBIN
SETB REN
SJMP WAIT_ACK_BIN
W_TXBIN: NOP
JNB TI,W_TXBIN
SJMP LP_TXBIN
; 以上程序段将数据发往上位机
WAIT_ACK_BIN: SETB REN
CLR ES
MOV IP,#01H
MOV IE,#91H
CLR TR0
MOV TH0,#0B8H
MOV TL0,#00H
MOV OVER_TIME,#OVER_TIME0
CLR SIGN_OVER
SETB TR0
MOV SYS_STATUS,#0A5H
LJMP MAIN
NOP
NOP
LJMP ERROR
;--------------------------------------------------------------------------
MAIN_5: ; 上位回应的处理
JNB SIGN_OVER,MAIN_5A ;未超时则转
;超时处理
CLR TR0
MOV SYS_STATUS,#0A4H
LJMP MAIN
MAIN_5A: MOV A,#0AAH
XRL A,RX_CHAR
JNZ MAIN_5
MOV A,#0AAH
XRL A,BUFFER_RX
JZ MAIN_5B
MOV SYS_STATUS,#0A4H
LJMP MAIN
NOP
NOP
LJMP ERROR
MAIN_5B: ;回应数据正确
MOV A,#20H
ADD A,ADDR_LOW
MOV ADDR_LOW,A
CLR A
ADDC A,ADDR_HIGH
MOV ADDR_HIGH,A
CLR A
ADDC A,ADDR_BLOCK
MOV ADDR_BLOCK,A ;地址更新
DJNZ LINE_L,MAIN_5C
DJNZ LINE_H,MAIN_5C
;数据发完128K字节则退出此任务
CLR TR0
MOV SYS_STATUS,#0A0H
LJMP MAIN
NOP
NOP
LJMP ERROR
MAIN_5C: MOV SYS_STATUS,#0A3H ;未发完64K,则发下一个16B数据
LJMP MAIN
NOP
NOP
LJMP ERROR
;-------------------------------------------------------------------------
MAIN_6: ; 下载代码到下位机
MOV ADDR_BLOCK,#00H
MOV ADDR_HIGH,#00H
MOV ADDR_LOW,#00H
MOV LINE_H,#10H
MOV LINE_L,#00H
MOV SYS_STATUS,#0A7H
LJMP MAIN
NOP
NOP
LJMP ERROR
;--------------------------------------------------------------------------
MAIN_7: ; 接收上位机发来的16字节二进制数据及CRC校验码
MOV R0,#BUFFER_RX
MOV R2,#21H
SETB REN
MOV RX_CHAR,#55H
SETB TR1
CLR RI
MOV IE,#92H
MOV OVER_TIME,#040H
SETB TR0
LP_RXBIN: JNB SIGN_OVER,PPPP
MOV SYS_STATUS,#0A0H
LJMP MAIN
PPPP: CLR TI
NOP
NOP
MOV A,#0AAH
XRL A,RX_CHAR
JNZ LP_RXBIN
; 己收到21H字节数
MOV R0,#BUFFER_RX
MOV R2,#21H
MOV CRC_VALUE,#00H
MOV DPTR,#TAB_CRC
LP_CHK_CRC: MOV A,@R0
XRL A,CRC_VALUE
MOVC A,@A+DPTR
MOV CRC_VALUE,A
INC R0
DJNZ R2,LP_CHK_CRC
MOV A,CRC_VALUE
JZ MAIN_7A
CLR TI
MOV A,#55H
MOV SBUF,A
LP_WAIT_ERR: NOP
NOP
JNB TI,LP_WAIT_ERR
SJMP MAIN_7 ; CRC检查错误,则向上位机发出错误回应
;本批数据重新接收
;-------------------------------------------------------------
MAIN_7A: ; CRC校验正确,向片外存储器写入32字节
MOV R2,#20H
MOV R0,#BUFFER_RX ; 设二进制数据地址指针(上位机送来的数据)
MOV DPL,ADDR_LOW
MOV DPH,ADDR_HIGH
;这时添加片选及区块寻址代码
MOV A,ADDR_BLOCK
JNZ MAIN_7X
CLR P1.6
SETB P1.7
SJMP LP_WRBIN
MAIN_7X: SETB P1.6
MOV A,ADDR_HIGH
MOV C,ACC.7
MOV P1.7,C
CLR ACC.7
MOV DPH,A
;---------------
LP_WRBIN: MOV A,@R0
MOVX @DPTR,A
MOVX @DPTR,A
MOVX @DPTR,A
nop
MOVX A,@DPTR
XRL A,@R0
JNZ LP_WRBIN
INC R0 ; 数据指针更新
INC DPTR ; 地址指针更新
DJNZ R2,LP_WRBIN
;地址更新处理
MOV A,#20H
ADD A,ADDR_LOW
MOV ADDR_LOW,A
CLR A
ADDC A,ADDR_HIGH
MOV ADDR_HIGH,A
CLR A
ADDC A,ADDR_BLOCK
MOV ADDR_BLOCK,A
DJNZ LINE_L,MAIN_7B
DJNZ LINE_H,MAIN_7B
MOV A,#0AAH
CLR TI
SETB TR1
MOV SBUF,A
LP_WAIT_RT: NOP
NOP
JNB TI,LP_WAIT_RT
MOV SYS_STATUS,#0A0H
LJMP MAIN
NOP
NOP
LJMP ERROR
;--------------------------------
MAIN_7B: CLR TI
SETB TR1
MOV A,#0AAH
MOV SBUF,A
LP_WAIT_RT0: NOP
NOP
JNB TI,LP_WAIT_RT0
MOV SYS_STATUS,#0A7H
LJMP MAIN
NOP
NOP
LJMP ERROR
;-------------------------------------------------------------------------
TAB_CRC: ; CRC校验数据表
DB 000,094,188,226,097,063,221,131
DB 194,156,126,032,163,253,031,065
DB 157,195,033,127,252,162,064,030
DB 095,001,227,189,062,096,130,220
DB 035,125,159,193,066,028,254,160
DB 225,191,093,003,128,222,060,098
DB 190,224,002,092,223,129,099,061
DB 124,034,192,158,029,067,161,255
DB 070,024,250,164,039,121,155,197
DB 132,218,056,102,229,187,089,007
DB 219,133,103,057,186,228,006,088
DB 025,071,165,251,120,038,196,154
DB 101,059,217,135,004,090,184,230
DB 167,249,027,069,198,152,122,036
DB 248,166,068,026,153,199,037,123
DB 058,100,134,216,091,005,231,185
DB 140,210,048,110,237,179,081,015
DB 078,016,242,172,047,113,147,205
DB 017,079,173,243,112,046,204,146
DB 211,141,111,049,178,236,014,080
DB 175,241,019,077,206,144,114,044
DB 109,051,209,143,012,082,176,238
DB 050,108,142,208,083,013,239,177
DB 240,174,076,018,145,207,045,115
DB 202,148,118,040,171,245,023,073
DB 008,086,180,234,105,055,213,139
DB 087,009,235,181,054,104,138,212
DB 149,203,041,119,244,170,072,022
DB 233,183,085,011,136,214,052,106
DB 043,117,151,201,074,020,246,168
DB 116,042,200,150,021,075,169,247
DB 182,232,010,084,215,137,107,053
NOP
NOP
LJMP ERROR
;-------------------------------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -