?? s10.asm
字號:
;PROGRAM NAME S10.ASM
;SERIAL RECEIVE/TRANSMITE DEMO PROGRAM 1
;DEFINE
BUFFER EQU 30H ;RECEIVE BUFFER
BUF_CNT EQU 40H ;BUFFER COUNT
CR EQU 0DH ;CARRIAGE RETURN CODE
LF EQU 0AH ;LINE FEED CODE
;
BUZZER REG P3.4
LED REG P3.7
;
ORG 0000H
RESET MOV R0,#00H
DJNZ R0,$
CLR LED
CLR BUZZER
;
MOV SP,#60H
START LCALL INIT_SIO ;SIO,TIMER INIT
LCALL CLR_BUF ;CLEAR RECEIVE BUFFER
MOV 20H,#00H
CLR 20H.0 ;TEST FLAG=0
MOV P1,#00H
SETB REN
SETB PS
SETB ES
CLR RI
CLR TI
LCALL DELAY
MOV DPTR,#MSG_SRT
LCALL MESSAGE ;SEND OUT MESSAGE
;
SETB EA ;ENABLE INTERRUPT
;
MAIN LCALL DELAY ;MAIN ROUTINE
JB 20H.0,STOP ;IF F0=1 THEN EXIT
SJMP MAIN
;
STOP CLR EA ;DISABLE INTERRUPT
SJMP START ;RESTART
;
SYNTAX CLR EA
LCALL CHK_CMD1
JC SYN_END
LCALL CHK_CMD2
JC SYN_END
LCALL CHK_CMD3
JC SYN_END
ERROR MOV DPTR,#MSG_ERR
LCALL MESSAGE
SYN_END LCALL CLR_BUF ;CLEAR BUFFER MEMORY
SETB EA
RET
;
;COMMAND LIST
CMD1 DB 'HI'
CMD2 DB 'HOW ARE YOU'
CMD3 DB 'END'
;MESSAGE LIST
MSG_SRT DB 'PRESS <ESC> TO START',0DH,0AH,'$'
MS1 DB 'HELLO !!',0DH,0AH,'$'
MS2 DB 'I AM FINE',0DH,0AH,'$'
MS3 DB 'DEMO TEST END,PRESS <ESC> BACK TO MONITOR',0DH,0AH,'$'
MSG_ERR DB 'INPUT ERROR !',0DH,0AH,'$'
;
CHK_CMD1
MOV A,BUF_CNT
MOV R7,A ;R7=BUF_CNT-1
MOV R5,#00H
CMD1_NXT:
MOV A,#BUFFER
ADD A,R5
MOV R0,A
MOV A,@R0 ;GET RECEIVE BYTE
PUSH A
MOV DPTR,#CMD1
LCALL GETCODE ;CODE IN B
POP A
CJNE A,B,NO_CMD1
INC R5
DJNZ R7,CMD1_NXT
LCALL DELAY
MOV DPTR,#MS1
LCALL MESSAGE ;ECHO MESSAGE 1
SETB C ;COMMAND 1 TRUE
SJMP CMD1_E ;END
NO_CMD1 CLR C
CMD1_E RET
;
CHK_CMD2
MOV A,BUF_CNT
MOV R7,A ;R7=BUF_CNT
MOV R5,#00H
CMD2_NXT:
MOV A,#BUFFER
ADD A,R5
MOV R0,A ;BUFFER+BUF_CNT
MOV A,@R0 ;GET RECEIVE BYTE
PUSH A
MOV DPTR,#CMD2
LCALL GETCODE ;CODE IN B
POP A
CJNE A,B,NO_CMD2
INC R5
DJNZ R7,CMD2_NXT
LCALL DELAY
MOV DPTR,#MS2
LCALL MESSAGE ;ECHO MESSAGE 2
SETB C ;COMMAND 2 TRUE
SJMP CMD2_E ;END
NO_CMD2 CLR C
CMD2_E RET
;
CHK_CMD3
MOV A,BUF_CNT
MOV R7,A ;R7=BUF_CNT
MOV R5,#00H
CMD3_NXT:
MOV A,#BUFFER
ADD A,R5
MOV R0,A ;BUFFER+BUF_CNT
MOV A,@R0 ;GET RECEIVE BYTE
PUSH A
MOV DPTR,#CMD3
LCALL GETCODE ;CODE IN B
POP A
CJNE A,B,NO_CMD3
INC R5
INC R6
DJNZ R7,CMD3_NXT
LCALL DELAY
MOV DPTR,#MS3
LCALL MESSAGE ;ECHO MESSAGE 3
SETB C ;COMMAND 3 TRUE
SETB 20H.0 ;TEST FLAG
SJMP CMD3_E ;END
NO_CMD3 CLR C
CMD3_E RET
;
MESSAGE CLR A
MOVC A,@A+DPTR
CJNE A,#'$',S_OUT
SJMP S_END
S_OUT CLR TI ;CLEAR TRANSMIT INTERRUPT
MOV SBUF,A
WAIT JNB TI,WAIT
INC DPTR
LCALL SIO_DELAY
SJMP MESSAGE
S_END RET
;
GETCODE MOV A,R5
ADD A,DPL
MOV DPL,A
MOV A,DPH
ADDC A,#00H
MOV DPH,A
MOVC A,@A+DPTR
MOV B,A ;SAVE IN B
RET
;
SIOISR CLR EA
PUSH A
PUSH B
PUSH PSW
PUSH DPH
PUSH DPL
PUSH 00H
PUSH 01H
PUSH 02H
PUSH 03H
PUSH 04H
PUSH 05H
PUSH 06H
PUSH 07H
JNB RI,ISREND
MOV A,SBUF ;READ 1 BYTE
PUSH A
MOV A,BUF_CNT ;GET BUFFER CNT
MOV R0,#BUFFER
ADD A,R0 ;A=A+R0
MOV R0,A ;R0=A
POP A
MOV @R0,A ;(BUFFER+BUF_CNT)=SBUF
CJNE A,#CR,NO_TERM
LCALL SYNTAX
MOV BUF_CNT,#00H ;CLEAR BUFFER
SJMP ISREND
NO_TERM INC BUF_CNT
ISREND CLR RI
CLR TI
POP 07H
POP 06H
POP 05H
POP 04H
POP 03H
POP 02H
POP 01H
POP 00H
POP DPL
POP DPH
POP PSW
POP B
POP A
SETB EA
RETI
;
CLR_BUF MOV R0,#BUFFER+10H
CLR_NXT MOV A,#00H
MOV @R0,A
DJNZ R0,CLR_NXT
MOV R0,#BUF_CNT
MOV A,#00H
MOV @R0,A ;CLEAR BUFFER COUNT
RET
;
INIT_SIO
MOV TMOD,#00100000B
MOV TH1,#FDH ;BAUD RATE=9600 BPS
SETB TR1 ;START TIMER 1
MOV SCON,#01010000B ;T/R,1 START BIT,8 DATA BIT,1 STOP BIT
RET
;
SIO_DELAY
MOV R0,#00H
DJNZ R0,$
RET
;
DELAY MOV R0,#00H ;WAIT A WHILE
MOV R1,#00H
DLY1 DJNZ R0,$
DJNZ R1,DLY1
RET
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -