⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gps68.asm

📁 GPS全球定位系统的应用 于大家共同分享啊 好好学习啊
💻 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 + -