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

📄 sendlcd.asm

📁 GPRS模块驱动程序 此设计采用BENQ的M22GPRS模块和AT89S52
💻 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	
;=============================================
;=============================================
		NUM1	EQU		13H
		NUM2	EQU		12H
		NUM3	EQU		02H
		NUM4	EQU		95H
		NUM5	EQU		07H
		NUM6	EQU		03H		;接收手机号为13120295073,可修改
;=============================================		
        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		
		ACALL	DELAY
		ACALL	CLEAR
		ACALL	CLEAR_STATUS
		ACALL	CMGS
		ACALL	DELAY
		ACALL	CLEAR_STATUS
		ACALL	SEND_STRING
		ACALL	RECVB
		ACALL	DISPLAY
		ACALL	DELAY
		CLR		P1.0
MAIN_OVER:
		NOP
		AJMP MAIN_OVER
;==============================================================
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                  
		RET	
;=============================================		
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				
;=============================================
;=============================================		
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			;WRITE TEH RECEIVE DATA TO 5000H~5200H
		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			;//	Clear the field of 5000~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
;=============================================	
;===========================================
;显示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
;=============================================	
CMGS:	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,#'S'		;S
		ACALL	SEND
		MOV		A,#'='		;=
		ACALL	SEND
		MOV		A,#'"'		;"
		ACALL	SEND
;============================================
;到下一注释处为接收手机号码
		MOV		A,#NUM1
		SWAP	A
		ANL		A,#0FH
		ADD		A,#30H
		ACALL	SEND
		MOV		A,#NUM1
		ANL		A,#0FH
		ADD		A,#30H
		ACALL	SEND
		MOV		A,#NUM2
		SWAP	A
		ANL		A,#0FH
		ADD		A,#30H
		ACALL	SEND
		MOV		A,#NUM2
		ANL		A,#0FH
		ADD		A,#30H
		ACALL	SEND
		MOV		A,#NUM3
		SWAP	A
		ANL		A,#0FH
		ADD		A,#30H
		ACALL	SEND
		MOV		A,#NUM3
		ANL		A,#0FH
		ADD		A,#30H
		ACALL	SEND
		MOV		A,#NUM4
		SWAP	A
		ANL		A,#0FH
		ADD		A,#30H
		ACALL	SEND
		MOV		A,#NUM4
		ANL		A,#0FH
		ADD		A,#30H
		ACALL	SEND
		MOV		A,#NUM5
		SWAP	A
		ANL		A,#0FH
		ADD		A,#30H
		ACALL	SEND
		MOV		A,#NUM5
		ANL		A,#0FH
		ADD		A,#30H
		ACALL	SEND
		MOV		A,#NUM6
		ANL		A,#0FH
		ADD		A,#30H
		ACALL	SEND
;============================================
		MOV     A,#'"'
		ACALL   SEND
		MOV		A,#0DH		;ENTER
		ACALL	SEND
		RET		
;=============================================
;发送的字符为Wellcome to topsun,可以修改。
SEND_STRING:
		MOV		A,#'W'
		ACALL	SEND
		MOV		A,#'e'
		ACALL	SEND
		MOV		A,#'l'
		ACALL	SEND
		MOV		A,#'l'
		ACALL	SEND
		MOV		A,#'c'
		ACALL	SEND
		MOV		A,#'o'
		ACALL	SEND
		MOV		A,#'m'
		ACALL	SEND
		MOV		A,#'e'
		ACALL	SEND
		MOV		A,#' '
		ACALL	SEND
		MOV		A,#'t'
		ACALL	SEND
		MOV		A,#'o'
		ACALL	SEND
		MOV		A,#' '
		ACALL	SEND
		MOV		A,#'T'
		ACALL	SEND
		MOV		A,#'o'
		ACALL	SEND
		MOV		A,#'p'
		ACALL	SEND
		MOV		A,#'s'
		ACALL	SEND
		MOV		A,#'u'
		ACALL	SEND
		MOV		A,#'n'
		ACALL	SEND		;发送Wellcome to Topsun,可修改
		MOV		A,#26		;CTRL+Z	
		ACALL	SEND
		;ACALL	RECV
		NOP
		RET
;=============================================
END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -