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

📄 combybin.asm

📁 这是一个调试单片机与计算机通信的ASM汇编程序
💻 ASM
字号:
	; ======================================================= ;
	; READ OR WRITE 93C46 by PC WITH LCD DISPLAY 2000.12.7    ;	
	; ======================================================= ;

; The PCB: MLCD (UPS)	
; USED RAM:	
;	1DH - 1EH		For 93c46
;	1FH		Regi. num of buffer for 93c46
;	20H - 3FH		Display buffer 
;	40H - 5FH		Buffer for 93c46
;	60H - 7FH		SP
; ----------------------------------------------------------------------------------------------
; PORTS:	P2.0 - P2.3		93C46	
;	P2.4 - P2.7		key rountine
;	P3.2		E of LCD	
;	P3.3		RS of LCD	
;	P3.7		R/W of LCD	
; ----------------------------------------------------------------------------------------------
; Define the CPU

$mod52
; ----------------------------------------------------------------------------------------------
; 16*2 LCD Definition

LCD_E	BIT	P3.2		; Low for write in
LCD_RS	BIT	P3.3		; data reg. / ctr reg. = 1 / 0
LCD_RW	BIT	P3.7		; Read / Write = 1 / 0
		
; ----------------------------------------------------------------------------------------------
; Define ports

CLCD_KEY	BIT	P0.0		; Clear the screen
SEND_KEY	BIT	P0.1

; ==================== Code segment ============================================================

	ORG	0000H
	AJMP	INIT
	
	ORG	0023H		; S-Port	
	AJMP	SR	
	
	ORG	0030H
INIT:	MOV	SP,#60H		; 60H -- 7FH for SP

; Set interrupt	
	SETB	EA
	SETB	ES
	SETB	PS
; Set UART
	MOV	SCON,#50H		; MOD1, REN=1, 1 + 8 + 1	
	MOV	PCON,#0
	MOV	TMOD,#21H		; T1 & T2:Timer. T0:M1 ;T1:M2	
	MOV	TL1,#0E8H		; B=1200,TL1=256-11059200/384/B=E8H
	MOV	TH1,#0E8H
	SETB	TR1

; Initialize LCD	
	ACALL	ILCD		; Init. LCD mode
	ACALL	CREAT		; Display "CREAT...."
; ==============================================================================================
; MAIN & Key scan routine
; ==============================================================================================
MAIN:
KEY:	JNB	CLCD_KEY,CLR_LCD
	JNB	SEND_KEY,SEND
	AJMP	MAIN

; ----------------------------------------------------------------------------------------------

CLR_LCD:	ACALL	CLCD
	AJMP	MAIN				

SEND:	ACALL	ST
	JNB	SEND_KEY,$
	ACALL	D20MS
	AJMP	MAIN
; ==============================================================================================
; COM routine with PC	R0: pointe to received or transmited data
; ==============================================================================================
; Receive data routine

SR:	PUSH	ACC
	PUSH	PSW
	PUSH	DPH
	PUSH	DPL
	SETB	RS0
	CLR	ES	

	CLR	RI
	MOV	A,SBUF
	CJNE	A,#52H,SR0		; A <> "R", Jump to write RAM

;	Send data to PC	
	ACALL	ST		; Send to PC
	AJMP	SRE

SR0:	MOV	R0,#40H		; 40H - 4FH: input buffer	
SR1:	MOV	R3,#21		; Delay 500mS for wait for data in
SR2:	MOV	R4,#0	
SR3:	JBC	RI,SR4
	DJNZ	R4,SR3 
	DJNZ	R3,SR2 
	AJMP	SR5
SR4:	MOV	A,SBUF
	MOV	@R0,A	
	INC	R0 
	AJMP	SR1

SR5:	ACALL	DCOM		; Data conveter
	ACALL	DSPLY		; Display received data

SRE:	SETB	ES
	POP	DPL
	POP	DPH
	POP	PSW
	POP	ACC
	RETI	

;	*	*	*
; Send data to manager

ST:	CLR	ES
	MOV	R1,#40H		; Buffer pointer
	MOV	R2,#16		; Send 16 bytes
STX:	MOV	SBUF,@R1
	JNB	TI,$
	CLR	TI
	INC	R1
	DJNZ	R2,STX
	SETB	ES
	RET

; ==============================================================================================
; Display routine: Drive LCD mode 16*2 char.	
; ==============================================================================================
; Init. LCD 
ILCD:	CLR	LCD_E	
	CLR	LCD_RS		; RS = 0 for Control Register
	MOV	DPTR,#INSTR
	MOV	R0,#0
ILCD1:	MOV	A,R0
	MOVC	A,@A+DPTR
	ACALL	WDAT
	ACALL	D1MS
	INC	R0	
	CJNE	R0,#4,ILCD1
	RET

INSTR:	DB	38H,0EH,06H,02H	; 0CH -> 0EH for display cursor
;	*	*	*

; Clear LCD screen
CLCD:	MOV	R0,#32	
	MOV	R1,#20H	
CLC1:	MOV	@R1,#20H
	INC	R1
	DJNZ	R0,CLC1 
	ACALL	DSPLY 
	RET
;	*	*	*

; Display data in disbuffer 20H - 3FH
DSPLY:	MOV	R0,#16		; Write first line
	MOV	R1,#20H
	SETB	LCD_RS	
DS1:	MOV	A,@R1
	ACALL	WDAT	
	INC	R1
	DJNZ	R0,DS1 
	
	CLR	LCD_RS		; Move cursor to head of second line
	MOV	A,#0C0H
	ACALL	WDAT

	MOV	R0,#16		; Write second line
	MOV	R1,#30H
	SETB	LCD_RS	
DS2:	MOV	A,@R1
	ACALL	WDAT	
	INC	R1
	DJNZ	R0,DS2 

	CLR	LCD_RS		; Move cursor to home
	MOV	A,#02H
	ACALL	WDAT
	RET

WDAT:	CLR	LCD_RW		; Write a data in A to LCD
	SETB	LCD_E
	ACALL	D1MS
	MOV	P1,A	
	ACALL	D1MS
	CLR	LCD_E	
	SETB	LCD_RW
	RET
; ----------------------------------------------------------------------------------------------
; Display CRAET & 755-3759085
; ----------------------------------------------------------------------------------------------
CREAT:	MOV	DPTR,#CREAD		; Display "CREAT ELE.DESIGN"
	MOV	R1,#20H
	ACALL	TAB32
	ACALL	DSPLY
	RET

CREAD:	DB	43H,52H,45H,41H,54H,20H,45H,4CH
	DB	45H,2EH,44H,45H,53H,49H,47H,4EH
	DB	54H,45H,4CH,3AH,20H,37H,35H,35H
	DB	2DH,33H,37H,35H,39H,30H,38H,35H

TAB32:	MOV	R0,#0
TA321:	MOV	A,R0		; Tabling for display
	MOVC	A,@A+DPTR
	MOV	@R1,A
	INC	R0
	INC	R1
	CJNE	R0,#32,TA321
	RET
; ==============================================================================================
; General routine: Use R6,R7,R2
; ==============================================================================================
D1MS:	MOV	R7,#0F8H		; Delay 1ms sub
	DJNZ	R7,$
	NOP
	RET

D20MS:	MOV	R6,#20		; Delay 20ms sub
D20M1:	MOV	R7,#0F8H
	DJNZ	R7,$
	DJNZ	R6,D20M1
	RET

DHMS:	MOV	R6,#100		; Delay 20ms sub
DHM1:	MOV	R7,#0F8H
	DJNZ	R7,$
	DJNZ	R6,DHM1 
	RET

D1S:	MOV	R5,#10
D11:	ACALL	DHMS
	DJNZ	R5,D11
	RET

D3S:	MOV	R5,#30
D31:	ACALL	DHMS
	DJNZ	R5,D31
D32:	RET

; ----------------------------------------------------------------------------------------------
; HEX - BCD - ASCII : 40H...4FH -> 20H,21H,.....3EH,3FH -> ASCII
DCOM:	MOV	R2,#16
	MOV	R1,#40H
	MOV	R0,#20H
DC1:	
	MOV	A,@R1
	PUSH	ACC
	SWAP	A
	ANL	A,#0FH
	MOV	@R0,A
	POP	ACC
	ANL	A,#0FH
	INC	R0
	MOV	@R0,A
	INC	R0
	INC	R1
	DJNZ	R2,DC1

; BCD -> ASCII
	MOV	R2,#32
	MOV	R1,#20H
DC2:	MOV	A,@R1
	MOV	DPTR,#NUMB
	MOVC	A,@A+DPTR
	MOV	@R1,A
	INC	R1
	DJNZ	R2,DC2
	
	RET

NUMB:	DB	30H,31H,32H,33H,34H,35H,36H,37H
	DB	38H,39H,41H,42H,43H,44H,45H,46H
; ==============================================================================================
	END

⌨️ 快捷键说明

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