?? recm22.asm
字號:
;=============================================
;CS0接CS8255 CS1接CS50 8255PA0-PA7接DB0-DB7
;8255PC0接REQ 8255PC7接BUSY
;=============================================
P55A EQU 0CFA0H ;8255I/O
P55B EQU 0CFA1H
P55C EQU 0CFA2H
PCTR EQU 0CFA3H
STOBE0 EQU 70H ;PC0復位控制字
STOBE1 EQU 71H ;PC0置位控制字
ADDR1 EQU 0CFA8H ;8250
ADDR2 EQU 0CFA9H ;
INTR EQU 0CFAAH ;interrupt enable register
LCR EQU 0CFABH ;line control register
MCR EQU 0CFACH ;modem control register
LSR EQU 0CFADH ;line status register
MSR EQU 0CFAEH ;modem status register
;=============================================
STSF EQU 20H ;
BUF EQU 21H
DPHR EQU 22H ;存放ASCII碼的高位地址
DPLR EQU 23H ;存放ASCII碼的底位地址
ADRX EQU 24H ;ASCII X軸坐標
ADRY EQU 25H ;ASCII Y軸坐標
NOTDIS EQU 26H ;臨時存放顯示的ASCII碼,以判斷是否為可顯示字符
;=============================================
RIF EQU 00H ;STSF BIT
TIF EQU 04H
;=============================================
ORG 4000H
LJMP START
;=============================================
ORG 4010H
START: MOV DPTR,#LCR
MOV A,#80H ;訪問MSB或LSB
MOVX @DPTR,A
MOV DPTR,#ADDR1 ;首先要對DLAB進行置位或清零,以決定是訪問那個寄存器.,LSB
MOV A,#12 ;9600
MOVX @DPTR,A
MOV DPTR,#ADDR2 ;MSB
MOV A,#0
MOVX @DPTR,A
;//===================================
MOV DPTR,#LCR
MOV A,#7
MOVX @DPTR,A ;no pe, 8 bit, 1 stop
MOV DPTR,#ADDR2 ;DLAB=0,訪問中斷使能寄存器
MOV A,#0
MOVX @DPTR,A ;no interupt
MOV DPTR,#LSR
MOVX A,@DPTR ;讀狀態寄存器
MOV DPTR,#ADDR1
MOVX A,@DPTR ;讀輸入寄存器.RECEIVE BUFF
MOV R0,#30H ;
ACALL CLEAR
ACALL CMGF1
ACALL CLEAR_DIS
ACALL DELAY
MAIN: ACALL ATE
ACALL DELAY
ACALL CLEAR_STATUS
SSS: ACALL CMGF1 ;2004-8-26
ACALL DELAY
ACALL CLEAR
ACALL CLEAR_STATUS
CLR P1.0
ACALL DELAY
ACALL CMGL
ACALL RECVB
ACALL CLEAR_STATUS
NOP
SETB P1.0
;==============================================================
DISPLAY:mov DPLR,#00H
mov DPHR,#50h
MOV DPL,DPLR
MOV DPH,DPHR
;==============================================================
MOV DPTR,#PCTR
MOV A,#88H
MOVX @DPTR,A ;置PA口輸出,PC口高4位輸入,低4位輸出
MOV DPTR,#PCTR
MOV A,#STOBE0
MOVX @DPTR,A
MOV A,#0F4H ;F4命令字
ACALL WRTB
CLR P1.2
;ACALL DELAY ;清屏
WRT0: MOV ADRX,#0
MOV ADRY,#0
MOV DPH,DPHR
MOV DPL,DPLR
MOVX A,@DPTR
WRITE: MOV DPH,DPHR
MOV DPL,DPLR
MOVX A,@DPTR
MOV NOTDIS,A
NEXT_WRITE:
MOV A,NOTDIS
CLR C
SUBB A,#0DH ;判斷是否為回車不可顯示
JZ SET_SPACE
MOV A,NOTDIS
CLR C
SUBB A,#0AH ;判斷是否為換行不可顯示
JZ SET_SPACE
MOV A,NOTDIS
JZ WRTOK ;判斷是否為0結束
AJMP DIS_W
;========================================
;判斷是否數據存儲越界
SET_SPACE:
MOV DPH,DPHR
MOV DPL,DPLR
MOV A,#20H
MOVX @DPTR,A
DIS_W:
CLR P1.1
CALL WRT1
ACALL DELAY
;========================================
JUDGE:
INC DPLR
MOV A,DPLR
CJNE A,#0,NEXT
INC DPHR
MOV A,DPHR
CLR C
SUBB A,#52H
JZ WRTOK
;========================================
NEXT: MOV A,ADRX
ANL A,#0FH ;判斷在X方向位置是否到頭了
JNZ WRITE
MOV ADRX,#0
MOV A,ADRY
ADD A,#8 ;換行顯示
MOV ADRY,A
CJNE A,#20H,WRITE ;最多顯示四行.
ACALL CLEAR_DIS ;清屏
MOV ADRX,#00H
MOV ADRY,#00H
AJMP WRITE
WRTOK: NOP
AJMP START
;=============================================
SEND: MOV BUF,A
WTSD: MOV DPTR,#LSR
MOVX A,@DPTR
JBC ACC.5,SDOK ;判斷1450準備好了嗎?
AJMP WTSD
SDOK: MOV DPTR,#ADDR1
MOV A,BUF
MOVX @DPTR,A
RET
;=============================================
CMGF1: MOV A,#'A'
ACALL SEND
MOV A,#'T'
ACALL SEND
MOV A,#'+'
ACALL SEND
MOV A,#'C'
ACALL SEND
MOV A,#'M'
ACALL SEND
MOV A,#'G'
ACALL SEND
MOV A,#'F'
ACALL SEND
MOV A,#'='
ACALL SEND
MOV A,#'1'
ACALL SEND
MOV A,#0DH
ACALL SEND
RET
;=============================================
CMGL: MOV A,#'A' ;A
ACALL SEND
MOV A,#'T' ;T
ACALL SEND
MOV A,#'+' ;+
ACALL SEND
MOV A,#'C' ;C
ACALL SEND
MOV A,#'M' ;M
ACALL SEND
MOV A,#'G' ;G
ACALL SEND
MOV A,#'L' ;L
ACALL SEND
MOV A,#'=' ;=
ACALL SEND
MOV A,#'"' ;"
ACALL SEND
MOV A,#'R' ;R
ACALL SEND
MOV A,#'E' ;E
ACALL SEND
MOV A,#'C' ;C
ACALL SEND
MOV A,#' ' ;
ACALL SEND
MOV A,#'U' ;U
ACALL SEND
MOV A,#'N' ;N
ACALL SEND
MOV A,#'R' ;R
ACALL SEND
MOV A,#'E' ;E
ACALL SEND
MOV A,#'A' ;A
ACALL SEND
MOV A,#'D' ;D
ACALL SEND
MOV A,#'"' ;"
ACALL SEND
MOV A,#0DH ;ENTER
ACALL SEND
RET
;=============================================
RECV: MOV R0,#30H
WTRC0: MOV DPTR,#LSR
MOVX A,@DPTR
JBC ACC.0,RCOK ;1,則接受到
AJMP WTRC0
WTRC: MOV DPTR,#LSR
MOVX A,@DPTR
;MOV STSF,A
JBC ACC.0,RCOK
DJNZ R1,WTRC
RET
RCOK: MOV DPTR,#ADDR1 ;讀RECEIVE BUFF,SURE LCR.7=0
MOVX A,@DPTR
MOV @R0,A
INC R0
MOV R1,#0
AJMP WTRC
;=============================================
RECVB: MOV DPHR,#50H
MOV DPLR,#00H
MOV DPH,DPHR
MOV DPL,DPLR
MOV DPHR,#50H
WTRCB0: MOV DPTR,#LSR
MOVX A,@DPTR
MOV STSF,A
JBC RIF,RCBOK
AJMP WTRCB0
WTRCB: MOV DPTR,#LSR
MOVX A,@DPTR
MOV STSF,A
JBC RIF,RCBOK
DJNZ R1,WTRCB ;WAIT FOR READY
DJNZ R0,WTRCB
MOV A,#00H ;接受完數據后使最后一個數為零。
MOV DPH,DPHR
MOV DPL,DPLR
MOVX @DPTR,A
RET
RCBOK: MOV DPTR,#ADDR1
MOVX A,@DPTR
MOV DPH,DPHR
MOV DPL,DPLR
MOVX @DPTR,A
INC DPLR
MOV A,DPLR
CJNE A,#0,NEXT1
INC DPHR
NEXT1: MOV R1,#0
MOV R0,#0
AJMP WTRCB
;=============================================
;將30H到60H的數據清零
;=============================================
CLEAR: MOV R0,#30h
MOV R1,#30H
CLR1: MOV @R0,#0
INC R0
DJNZ R1,CLR1
MOV DPHR,#50H
MOV DPLR,#00H
CLRB:
MOV DPH,DPHR
MOV DPL,DPLR
MOV A,#0
MOVX @DPTR,A
INC DPLR
MOV A,DPLR
CJNE A,#0,CLRB
INC DPHR
MOV A,DPHR
CJNE A,#52H,CLRB ;將5000H到5200地址的數據清零
RET
;=============================================
ATE: MOV A,#'A'
ACALL SEND
MOV A,#'T'
ACALL SEND
MOV A,#'E'
ACALL SEND
MOV A,#'0'
ACALL SEND
MOV A,#0DH
ACALL SEND
RET
;=============================================
ATCGMI: MOV A,#'A'
ACALL SEND
MOV A,#'T'
ACALL SEND
MOV A,#'+'
ACALL SEND
MOV A,#'C'
ACALL SEND
MOV A,#'G'
ACALL SEND
MOV A,#'M'
ACALL SEND
MOV A,#'I'
ACALL SEND
MOV A,#0DH
ACALL SEND
RET
;===========================================
;顯示ASCII碼的命令F1 XX YY AS
;=============================================
WRT1: ACALL BUSY
SETB P1.1
MOV A,#0F1H
ACALL WRTB
ACALL BUSY
MOV A,ADRX
ACALL WRTB
INC ADRX ;X方向的位置加一.
ACALL BUSY
MOV A,ADRY
ACALL WRTB
ACALL BUSY
MOV DPH,DPHR
MOV DPL,DPLR
;INC DPLR ;存儲地址加一
MOVX A,@DPTR
ACALL WRTB
RET
;=============================================
WRTB: MOV DPTR,#P55A
MOVX @DPTR,A
MOV DPTR,#PCTR
MOV A, #STOBE1 ;置位REQ
MOVX @DPTR,A
WAIT: MOV DPTR,#P55C
MOVX A,@DPTR
JNB ACC.7,WAIT ;BUSY?判斷是否接受到數據
MOV DPTR,#PCTR
MOV A,#STOBE0 ;清零REQ
MOVX @DPTR,A
RET
;=============================================
BUSY: MOV DPTR,#P55C
MOVX A,@DPTR
JB ACC.7,BUSY
RET
;=============================================
CLEAR_STATUS:
MOV DPTR,#LSR
MOVX A,@DPTR
MOV DPTR,#ADDR1
MOVX A,@DPTR
RET
;=============================================
CLEAR_DIS:
MOV DPTR,#PCTR
MOV A,#88H
MOVX @DPTR,A ;置PA口輸出,PC口高4位輸入,低4位輸出
MOV DPTR,#PCTR
MOV A,#STOBE0
MOVX @DPTR,A
MOV A,#0F4H ;F4命令字
ACALL WRTB
RET
;=============================================
DELAY: MOV R4,#0
MOV R5,#0
MOV R6,#1H
DLY: DJNZ R4,DLY
DJNZ R5,DLY
DJNZ R6,DLY
RET
;=============================================
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -