?? s11.asm
字號:
;PROGRAM NAME S11.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 DPTR,#BUF_CNT
MOVX A,@DPTR
NOP
MOV R7,A ;R7=BUF_CNT-1
MOV R6,#00H
MOV R5,#00H
CMD1_NXT:
MOV DPTR,#BUFFER
MOV A,R6
ADD A,DPL
MOV DPL,A
MOV A,DPH
ADDC A,#00H
MOV DPH,A ;BUFFER+BUF_CNT
MOVX A,@DPTR ;GET RECEIVE BYTE
PUSH A
MOV DPTR,#CMD1
LCALL GETCODE ;CODE IN B
POP A
CJNE A,B,NO_CMD1
INC R5
INC R6
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 DPTR,#BUF_CNT
MOVX A,@DPTR
MOV R7,A ;R7=BUF_CNT
MOV R6,#00H
MOV R5,#00H
CMD2_NXT:
MOV DPTR,#BUFFER
MOV A,R6
ADD A,DPL
MOV DPL,A
MOV A,DPH
ADDC A,#00H
MOV DPH,A ;BUFFER+BUF_CNT
MOVX A,@DPTR ;GET RECEIVE BYTE
PUSH A
MOV DPTR,#CMD2
LCALL GETCODE ;CODE IN B
POP A
CJNE A,B,NO_CMD2
INC R5
INC R6
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 DPTR,#BUF_CNT
MOVX A,@DPTR
MOV R7,A ;R7=BUF_CNT
MOV R6,#00H
MOV R5,#00H
CMD3_NXT:
MOV DPTR,#BUFFER
MOV A,R6
ADD A,DPL
MOV DPL,A
MOV A,DPH
ADDC A,#00H
MOV DPH,A ;BUFFER+BUF_CNT
MOVX A,@DPTR ;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 MOVX 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
MOVX 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
MOV P1,A ;OUTPUT TO P1 PORT
PUSH A
MOV DPTR,#BUF_CNT
MOVX A,@DPTR ;GET BUFFER CNT
MOV DPTR,#BUFFER
ADD A,DPL ;A=A+DPL
MOV DPL,A ;DPL=A
POP A
MOVX @DPTR,A ;(DPTR)=SBUF
CJNE A,#CR,NO_TERM
LCALL SYNTAX
MOV DPTR,#BUF_CNT
MOV A,#00H
MOVX @DPTR,A ;CLEAR BUFFER
SJMP ISREND
NO_TERM MOV DPTR,#BUF_CNT
MOVX A,@DPTR ;GET BUFFER CNT
INC A
MOVX @DPTR,A ;SAVE BUFFER 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
MOVX @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
LCALL INIT_PIO
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 + -