终于写出来了,用串口助手从PC送字串给单片机UART2,接收后放进缓冲,然后再送回UART2,由PC接收,对照一下没有错码,应该是OK了吧。
LED:
DJNZ 3AH, LED1 ;THIS IS FOR LEDSHOWDELAY
DJNZ 3BH, LED1
MOV P2, 3CH
DJNZ 3CH, LED1
JNB 39H, LEDA
CLR 39H
CPL P1.5 ;INDICATE LED LIGHTUP
MOV 3CH, #1
JMP LED1
LEDA:
SETB 39H
CPL P1.5
MOV 3CH, #2
LED1:
MOV A, R0
XRL A, R1
JZ LED
MOV A, @R0
MOV R4, A
LCALL SENTONEBYTE2
LCALL NEXTBUFFER0
JMP LED
NEXTBUFFER0:
CJNE R0, #LASTBUFFER, NEXTBUFFER0A
MOV R0, #FIRSTBUFFER
JMP NEXTBUFFER0EXIT
NEXTBUFFER0A:
INC R0 ;POINT TO NEXT BYTE
NEXTBUFFER0EXIT:
RET
NEXTBUFFER1:
CJNE R1, #LASTBUFFER, NEXTBUFFER1A
MOV R1, #FIRSTBUFFER
JMP NEXTBUFFER1EXIT
NEXTBUFFER1A:
INC R1 ;POINT TO NEXT BUFFER
NEXTBUFFER1EXIT:
RET
SENTONEBYTE2: ;SENT OUT DATA IN R4
PUSH ACC
PUSH PSW
CHECKTI:
MOV A, S2CON ;READ AND CHECK S2TI
ANL A, #00000010B ;MASK EXCEPT BIT1(S2TI)
JZ CHECKTI
MOV A, S2CON
ANL A, #11111101B ;CLEAR SECONDARY UART TRANSIMIT INTERRUPT FLAG
MOV S2CON, A
MOV S2BUF, R4
POP PSW
POP ACC
RET
UART2: ;THIS RECEIVED DATA AND STORE TO BUFFER FOR SENTOUT
;/*----------------------------
;UART2 INTERRUPT SERVICE ROUTINE
;----------------------------*/
PUSH ACC
PUSH PSW
MOV A, S2CON ;READ UART2 CONTROL REGISTER
ANL A, #00000001B ;ANL, IF S2RI=0 THEN 0
JZ UART2CHECKTI
MOV A, S2BUF
MOV @R1, A
LCALL NEXTBUFFER1
MOV A, S2CON ;READ UART2 CONTROL REGISTER AGAIN
ANL A, #11111110B ;CLEAR S2RI BIT
MOV S2CON, A ;SAVE BACK S2CON
JMP UART2EXIT
UART2CHECKTI: ;NOT USE
; --------DO NOTHING
UART2EXIT:
POP PSW
POP ACC
RETI
INITIAL_UART2: ;USE FOR CLOCK OUT MIDI DATA; USE BRT
MOV S2CON, #01010010B ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK, MUST SET S2TI TO 1 FOR TRANSMIT START
MOV BRT, #BRTLOAD ;RELOAD 1152000
ORL AUXR, #10H ;BRT START RUN
MOV IE2, #01H ;ENABLE UART2 INTERRUPT
RET
|