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

📄 mpc_comm.asm

📁 8051 mp3 very good for using
💻 ASM
字号:
;--------------------------------------;
; Receive a line from HOST
;
; Call: non
; Ret:  LineBuf

read_line:
	ldiw	Y,LineBuf
	ldi	r19,0
rl_lp:	 rcall	receive
	st	Y,r16

	cpi	r16,0x0d	; CR
	brne	PC+2
	rjmp	xmit

	cpi	r16,0x08	; BS
	brne	PC+7
         cpi	r19,0
	breq	rl_lp
	 rcall	xmit
	sbiw	YL,1
	dec	r19
	rjmp	rl_lp

	cpi	r16,' '		; SP
	brcs	rl_lp
	cpi	r19,15
	breq	rl_lp
	rcall	xmit
	adiw	YL,1
	inc	r19
	rjmp	rl_lp

caps:
	cpi	r19,'a'		; CAPS
	brcs	PC+2		; 
	subi	r19,0x20	; /
	ret


;--------------------------------------;
; Display ROM string
;
; Call: Z = top of the string
; Ret:  Z = next string

dp_str:	lpm
	adiw	ZL,1
	tst	r0
	brne	PC+2
	ret
	mov	r16,r0
	 rcall	xmit
	rjmp	PC-7


;--------------------------------------;
; Display decimal string
;
; Call: r18:r16 = 24bit value for display
;       r19 = 0:auto len, 1..:fixed len
; Ret:  r1-r2,r16-r20 = broken

dp_dec1a:clr	r19
dp_dec1:clr	r17
dp_dec2:clr	r18
dp_dec3:clr	r1
	mov	r2,r19
	inc	r1
	ldi	r19,0		; r18:r16 /= 10
	ldi	r20,24		; r19 = r18:r16 % 10
	lsl	r16		; 
	rol	r17		; 
	rol	r18		; 算法 高位有十的倍数-10 
	rol	r19
		                ; 
	cpi	r19,10		; r19存余数 在r16中存结果
	brcs	PC+3		; 
	subi	r19,10		; 
	ori	r16,1		; 
	dec	r20		; 
	brne	PC-9		; /循环 余数*2 +低位 结果*2
	addi	r19,'0'
	push	r19             ;堆栈中存数

	mov	r20,r16
	or	r20,r17
	or	r20,r18          ;直到r18:r16=0

	brne	PC-18
	cp	r1,r2		; Adjust length
	brcc	PC+5		; 
	inc	r1		; 
	ldi	r16,' '		; 
	push	r16		; 
	rjmp	PC-5		; /
	pop	r16		; Transmit string
	 rcall	xmit		; 
	dec	r1		; 
	brne	PC-3		; /
	ret


;--------------------------------------;
; Display HEX string
;
; Call: r16 = byte data for display
; Ret:  r16 = broken

dp_byte:
	swap	r16
	rcall	PC+2
	swap	r16
	push	r16
	andi	r16,0x0f
	cpi	r16,10
	brcs	PC+2
	subi	r16,-7        ;加7是为了调正ACSELL码吗?
	subi	r16,-0x30
	 rcall	xmit
	pop	r16
	ret


;--------------------------------------;
; Get hexdecimal value
;
; Call: Y = string pointer
; Ret:  Y = updated
;       C=1: error
;       Z=1: eol, val=0
;       else: r18:r16 = 24bit value

get_valh:
	clr	r18
	clr	r17
	clr	r16
	ld	r19,Y+
	cpi	r19,' '
	brcs	gv_n
	breq	PC-3
	rjmp	PC+2
gv_l:	ld	r19,Y+
	rcall	caps
	cpi	r19,' '+1
	brcs	gv_e

	subi	r19,'0'
	brcs	gv_x

	cpi	r19,10
	brcs	PC+4  ;?error brcc

	subi	r19,7
	cpi	r19,10
	brcs	gv_x

	cpi	r19,16
	brcc	gv_x

	swap	r19
	ori	r19,0x0f
	lsl	r19
	rol	r16
	rol	r17
	rol	r18
	cpi	r19,0xf0
	brne	PC-5
	rjmp	gv_l
gv_x:	sec
	sez
	ret
gv_e:	sbiw	YL,1
	clc
	clz
	ret
gv_n:	sbiw	YL,1
	clc
	sez
	ret


;--------------------------------------;
; Get decimal value
;
; Call: Y = string pointer
; Ret:  Y = updated
;       C=1: error
;       Z=1: eol, val=0
;       else: r16 = 8bit value

get_vald:
	clr	r16
	ld	r19,Y+
	cpi	r19,' '
	brcs	gv_n
	breq	PC-3
	rjmp	PC+2
gvd_l:	ld	r19,Y+
	cpi	r19,' '+1

	brcs	gv_e
	subi	r19,'0'
	brcs	gv_x
	cpi	r19,10      
	brcc	gv_x

	lsl	r16
	mov	r17,r16
	lsl	r16
	lsl	r16
	add	r16,r17
	add	r16,r19
	rjmp	gvd_l


;--------------------------------------;
; Convert a byte value into packed decimal
;
; Call: r16 = value for converted
; Ret:  r16 = packed decimal value

cv_dec:	
	push	r17
	ldi	r17,-0x10
	subi	r17,-0x10
	subi	r16,10
	brcc	PC-2
	subi	r16,-10
	add	r16,r17
	pop	r17
	ret


;--------------------------------------;
; Diaplay a space

space:
	ldi	r16,' '
	; must be followed by transmit routine

;--------------------------------------;
; Software UART using ISP cable

.equ	BPS	= 33		; 38.4kbps @4MHz

xmit:	; Transmit r16.
	push	r16
	push	r17
	push	r18
	in	_SrgTmp2,SREG	; Stop Interupts
	cli			; /
	com	r16		; 
	sec			; Start bit
	ldi	r18,10		; bit count
	ldi	r17,BPS-1	; Wait for full bit time
	dec	r17		; 
	brne	PC-1		; /
	brcs	PC+2		; MISO = bit for send
	cbi	PORTB,MISO	; 
	brcc	PC+2		; 
	sbi	PORTB,MISO	; /
	lsr	r16		; next bit
	dec	r18		; All sent ?
	brne	PC-9		;  no, coutinue
	out	SREG,_SrgTmp2	; Restart Intrerupts
	pop	r18
	pop	r17
	pop	r16
	ret


receive:; Receive into r16.
	push	r17
	ldi	r16,0x80	; Shift register for receive
	sbic	PINB,MOSI	; Wait for rise edge of MOSI
	rjmp	PC-1		; 
	sbis	PINB,MOSI	; 
	rjmp	PC-1		; /
	ldi	r17,BPS/2	; Wait for half bit time
	dec	r17		; 
	brne	PC-1		; /
	ldi	r17,BPS		; Wait for full bit time
	dec	r17		; 
	brne	PC-1		; /
	lsr	r16		; Next bit
	sbis	PINB,MOSI	; Read MOSI into r16.7
	ori	r16,0x80	; /
	brcc	PC-6		; All bits received?  no, continue
	pop	r17		;                     yes, end
	ret			;


⌨️ 快捷键说明

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