📄 gps68.asm
字号:
;=============================================
;GPS MODE: EB6801
;2005-5-27
;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,when DLAB=0, TBR ORBR;when DLAB=1 IS DLL
ADDR2 EQU 0CFA9H ;When DLAB=0,IER;When DLAB=1 IS DLH
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
TIME EQU 30H
DPHR EQU 31H ;存放ASCII码的高位地址
DPLR EQU 32H ;存放ASCII码的底位地址
ADRX EQU 33H ;ASCII X轴坐标
ADRY EQU 34H ;ASCII Y轴坐标
CNTB EQU 35H
BUF EQU 36H ;临时存放显示的ASCII码,以判断是否为可显示字符
;=============================================
RIF EQU 00H ;STSF BIT
TIF EQU 04H
;=============================================
ORG 4000H
LJMP START
;=============================================
ORG 4100H
START: MOV DPTR,#LCR ;通过设置LCR.7位,来确定DLABD的状态。
MOV A,#80H ;访问MSB或LSB
MOVX @DPTR,A
MOV DPTR,#ADDR1 ;首先要对DLAB进行置位或清零,以决定是访问那个寄存器.,LSB
MOV A,#18H ;set the baudrate is 4800
MOVX @DPTR,A
MOV DPTR,#ADDR2 ;MSB
MOV A,#0
MOVX @DPTR,A
MOV DPTR,#LCR
MOV A,#3 ;no pe, 8 bit, 1 stop--????
MOVX @DPTR,A
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 DPTR,#5000H
MOV A,#0
MOV R1,#02H
CLEAR_E: ;清除5000h到51ffh中的内容
MOVX @DPTR,A
INC DPTR
MOV R0,DPL
CJNE R0,#0,CLEAR_E
DJNZ R1,CLEAR_E
MAIN:
MOV DPHR,#50H
MOV DPLR,#00H
REC0: MOV DPTR,#LSR
TSTST: MOVX A,@DPTR
MOV STSF,A
JBC RIF,TSTOK
AJMP TSTST
TSTOK: MOV DPTR,#ADDR1
MOVX A,@DPTR
CJNE A,#24H,REC0 ;$ start
MOV DPH,DPHR
MOV DPL,DPLR
MOVX @DPTR,A ;Save the datat to 5000h
INC DPLR
JNZ RXACK
INC DPHR ;adjust the saving address
RXACK: MOV DPTR,#LSR ;wait for the next recevie data;
RACK: MOVX A,@DPTR
MOV STSF,A
JBC RIF,REC1 ;接收呼叫信号
SJMP RACK
REC1: MOV DPTR,#ADDR1
MOVX A,@DPTR
MOV DPL,DPLR
MOV DPH,DPHR
MOVX @DPTR,A ;Save the datat to Datat_address;
INC DPLR
MOV A,DPLR ;判断地址地位是否溢出.
JNZ REC2
INC DPHR ;adjust the saving high address
REC2: MOVX A,@DPTR
CJNE A,#10,RXACK ;judge if <LF>,the ASSCII OF <LF> IS 0X0A,换行,当为换行时表示
;接受完一条语句.
;================================================
DIS:
mov DPLR,#0
mov DPHR,#50h
MOV DPTR,#PCTR ;the display address;
MOV A,#88H
MOVX @DPTR,A ;置PA口输出,PC口高4位输入,低4位输出
MOV DPTR,#PCTR
MOV A,#STOBE0
MOVX @DPTR,A
MOV A,#0F4H ;the clear display command
ACALL WRTB ;清屏
WRT0: MOV ADRX,#0
MOV ADRY,#0
MOV DPH,DPHR
MOV DPL,DPLR
MOVX A,@DPTR
CLR C
SUBB A,#'$'
JZ WRITE ;if the assci is '$',start display the string;
INC DPLR ;adjust the saving_data_address,search the '$' chare.
MOV A,DPLR
JNZ WRT0 ;判读地址低位是否溢出。
INC DPHR ;溢出则调整高位地址。
AJMP WRT0
WRITE: MOV CNTB,#40H ;
MOV DPH,DPHR
MOV DPL,DPLR
MOVX A,@DPTR
CLR C
SUBB A,#0DH ;if the <CR>. the asscii of <CR> is 0x0D;回车.
JZ WRTOK ;如果是回车,表示完成了一条语句的显示.
CALL WRT1
NEXT: MOV A,ADRX
ANL A,#0FH
JNZ WRITE
MOV ADRX,#0
MOV A,ADRY
ADD A,#8
MOV ADRY,A
CJNE A,#20H,WRITE ;调整显示坐标
WRTWT: MOV R3,#2h ;20->2
WT1: LCALL DELAY
DJNZ R3,WT1 ;延时32个delay;
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
ACALL WRTB
MOV ADRX,#0
MOV ADRY,#0
AJMP WRITE ;当显示满屏的时候,先进行清屏,然后调整显示坐标.再从起始位置开始显示
WRTOK:
LJMP MAIN
;=============================================
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
;=============================================
;WRT1,具体的液晶显示子程序
;=============================================
WRT1: ACALL BUSY
MOV A,#0F1H
ACALL WRTB
ACALL BUSY
MOV A,ADRX
ACALL WRTB
INC ADRX
ACALL BUSY
MOV A,ADRY
ACALL WRTB
ACALL BUSY
MOV DPH,DPHR
MOV DPL,DPLR
INC DPLR
MOVX A,@DPTR
ACALL WRTB
RET
;=============================================
;液晶忙判断子程序
;=============================================
BUSY: MOV DPTR,#P55C
MOVX A,@DPTR
JB ACC.7,BUSY
RET
;=============================================
;延时子程序
;=============================================
DELAY: MOV R4,#60
MOV R5,#60
DLY: DJNZ R4,DLY
DJNZ R5,DLY
RET
;=============================================
;往液晶显示接口输数
;=============================================
WRTB: MOV DPTR, #P55A
MOVX @DPTR, A
MOV DPTR, #PCTR
MOV A, #STOBE1
MOVX @DPTR, A
WAIT: MOV DPTR, #P55C
MOVX A, @DPTR
JNB ACC.7, WAIT
MOV DPTR, #PCTR
MOV A, #STOBE0
MOVX @DPTR, A
RET
;=============================================
;回车换行
;=============================================
SCRLF: MOV A,#0DH
ACALL SEND
MOV A,#0AH
ACALL SEND
RET
END
;===============================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -