www.pudn.com > GSM.rar > SENDLCD.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