📄 serio2a.a51
字号:
$nomod51 symbols debug nolist
$INCLUDE(\i\rg51fb.pdf)
$INCLUDE(charname.a51)
$list
;
; CONSOLE I/O ROUTINES AND DRIVERS:
; ======= === ======== === =======
; S_INIT - Initializes Serial port.
;
; C_IN - waits for character from serial port. Returns it in A.
; C_OUT - sends character in A.
; C_STS - console status. if char RXD, C=1, A=char, else C=0.
; STROUT - Sends in-line character string to console. String is terminated
; by last character's MSB set. Hence, can only handle 7 bit ASCII.
;
;********************************************
;
; Automatically sets baud rate, using TIMER 2
;
;********************************************
;
CODE_SEG segment code
public S_init,C_IN,C_OUT,STROUT
;
rseg CODE_SEG
;
S_INIT:
CLR TR1
MOV SCON,#01011010B ;TI set indicates transmitter ready.
; mode 1,REN,
MOV T2CON,#00110000B; Set to RCLK, TCLK
; ; wait for <space> from console, measure its
; ; speed, and set baud rate in Timer 2 accordingly.
Bauddet:
;
BG1: CLR A ;DO BAUD RATE
MOV R3,A
MOV R1,A
MOV R0,#4
JB RXD,$ ;LOOP UNTIL A CHARACTER IS RECEIVED
;
BG2: DJNZ R0,$ ;Waste 8 clocks initially, 6 in loop
CLR C ;1 clock
MOV A,R1 ;1
SUBB A,#1 ;1 dec(R3:R1)
MOV R1,A ;1
MOV A,R3 ;1
SUBB A,#00H ;1
MOV R3,A ;1
MOV R0,#3 ;1
JNB RXD,BG2 ;2 CLOCKS, LOOP UNTIL DONE
JB RXD,$ ;WAIT FOR SPACE TO END
JNB RXD,$ ; WAIT FOR STOP BIT
MOV RCAP2H,R3 ; LOAD THE TIMER2 REGISTER.
MOV RCAP2L,R1
SETB TR2 ; turn it on
;
ret
;
;=======
;
C_IN:
; Console character input routine.
; Waits for next input from console device and returns with character
; code in accumulator.
;
JNB RI,$ ;Wait until character received.
MOV A,SBUF ;Read input character.
CLR RI ;Clear reception flag.
ret ;
;
;=======
;
C_OUT:
; Console character output routine.
; Outputs character received in accumulator to console output device.
;
JNB TI,$ ;Wait until transmission completed.
CLR TI ;Clear interrupt flag.
MOV SBUF,A ;Write out character.
RET
;
;=======
;
;Console Status
;
; Returns C=0 if no character is ready
; if character ready, returns C=1 and character in A
; Note: Serial input status can be checked by RI bit, also.
;
C_STS: MOV C,RI
JNC CNTRET ;Poll whether character has been typed.
CALL C_IN
CNTRET: RET
;
;=======
;
;STROUT
; Copy in-line character string to console output device.
; uses: DPTR,ACC
;
STROUT: POP DPH ;get in-line string address from stack
POP DPL
STRO_1: CLR A
MOVC A,@A+DPTR ;Read next byte.
INC DPTR ;Bump pointer.
JBC ACC.7,STRO_2 ;Escape after last character.
CALL C_OUT ;Output character.
SJMP STRO_1 ;Loop until done.
;
STRO_2: CALL C_OUT ;Output character.
CLR A
JMP @A+DPTR ;Return to program.
;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -