📄 rtu.asm
字号:
;已实现功能:块写触摸屏
;The last recompose: 2.7 pm
ADDRESS EQU 20H
COMMAND EQU 21H
CH EQU 22H
CL EQU 23H
CRC_H EQU 24H
CRC_L EQU 25H
CRC16_L EQU 26H
CRC16_H EQU 27H
SAVE_L EQU 28H
SAVE_H EQU 29H
COUNTER EQU 2AH
TRANS_FLAG EQU 2BH
DATA_COUNTER EQU 2CH
START_ADDRESS_D EQU 2DH
ANSWER_ADDRESS EQU 2EH
ERROR_FLAG BIT F0
;======================================================================
ORG 000H
JMP MAIN
;----------------------------------------------------------------------
ORG 0025H
MAIN: MOV SP,#70H
CLR ERROR_FLAG
MOV ADDRESS,#0CH
MOV START_ADDRESS_D,#30H ;THE START ADDRESS OF SEND DATA
MOV ANSWER_ADDRESS,#60H ;THE START ADDRESS OF RECEVICE DATA
CALL UART_SET
CALL GET_DATA
CALL CRC_CHECK
RE_SEND:
CALL SEND_DATA
CALL ANSWER_SEND
LCALL DELAY
LCALL DELAY
CPL P1.4
JBC ERROR_FLAG,RE_SEND
SETB P1.4
LCALL DELAY
JMP MAIN
;----------------------------------------------------------------------
GET_DATA:
MOV R0,START_ADDRESS_D ;读取数据到从30H开始的数据单元
MOV DATA_COUNTER,#27H
MOV R7,DATA_COUNTER
MOV DPTR,#TAB
GET_LOOP:
MOV A,#00H
MOVC A,@A+DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R7,GET_LOOP
RET
;----------------------------------------------------------------------
CRC_CHECK: ;CRC校验子程序
MOV R0,START_ADDRESS_D
MOV COUNTER,DATA_COUNTER
MOV CL,#01H
MOV CH,#0A0H
MOV CRC16_L,#0FFH
MOV CRC16_H,#0FFH
MOV SAVE_H,#00H
MOV SAVE_L,#00H
CHECK_LOOP:
MOV A,@R0
XRL CRC16_L,A
MOV R7,#08H
CHECK_B:
MOV SAVE_H,CRC16_H
MOV SAVE_L,CRC16_L
MOV A,CRC16_H
CLR C
RRC A
MOV CRC16_H,A
MOV A,CRC16_L
CLR C
RRC A
MOV CRC16_L,A
JNB SAVE_H.0,COMPARE_L
MOV A,CRC16_L
ORL A,#80H
MOV CRC16_L,A
COMPARE_L:
JNB SAVE_L.0,NEXT_BIT
MOV A,CRC16_H
XRL A,CH
MOV CRC16_H,A
MOV A,CRC16_L
XRL A,CL
MOV CRC16_L,A
NEXT_BIT:
DJNZ R7,CHECK_B
INC R0
DJNZ COUNTER,CHECK_LOOP
MOV @R0,CRC16_L ;发送的数据将CRC校验码添加到数据包中
INC R0
MOV @R0,CRC16_H
MOV DPH,CRC16_H
MOV DPL,CRC16_L
RET
;----------------------------------------------------
UART_SET:
MOV SCON,#0D0H
CLR EA
ORL PCON,#80H
MOV TMOD,#20H
MOV TL1,#0F3H ;4800BPS AT 12MHz Fosc
MOV TH1,#0F3H
SETB TR1
RET
;----------------------------------------------------
ANSWER_SEND:
CLR RI
MOV R0,ANSWER_ADDRESS
MOV COUNTER,#08H
MOV A,#00H
RECEVE_DATA:
JNB RI,$
MOV A,SBUF
MOV @R0,A
CLR RI
INC R0
DJNZ COUNTER,RECEVE_DATA
MOV R1,START_ADDRESS_D
MOV R0,ANSWER_ADDRESS
MOV COUNTER,#06H
COMPARE_DATA:
MOV A,@R0
MOV B,@R1
CJNE A,B,ERROR
INC R0
INC R1
DJNZ COUNTER,COMPARE_DATA
SJMP EXIT_ANSWER
ERROR:
SETB ERROR_FLAG
RETI
EXIT_ANSWER:
SETB P1.4
RET
;---------------------------------------------------
SEND_DATA:
MOV R0,START_ADDRESS_D
MOV COUNTER,DATA_COUNTER
CLR TI
SEND_LOOP:
MOV A,@R0
INC R0
MOV SBUF,A
JNB TI ,$
CLR TI
DJNZ COUNTER,SEND_LOOP ;SEND DATA
MOV A,@R0 ;SEND CRC
INC R0
MOV SBUF,A
JNB TI ,$
CLR TI
MOV A,@R0
MOV SBUF,A
JNB TI,$
CLR TI
RET
;------------------------------------------------------------
DELAY: MOV R7,#0FFH
DEL1: MOV R6,#0FFH
DJNZ R6,$
DJNZ R7,DEL1
RET
TAB: DB 0cH, 10H, 00H, 0aH, 00H, 10H, 20H, 00H, 01H, 00H, 02H, 00H, 03H, 00H, 04H, 00H
DB 05H, 00H, 06H, 00H, 07H, 00H, 08H, 00H, 09H, 00H, 0aH, 00H, 0bH, 00H, 0cH, 00H
DB 0dH, 00H, 0eH, 00H, 0fH, 00H, 10H,0aaH,0edH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -