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

📄 sg18.asm

📁 the practice of proteus and avr
💻 ASM
字号:
.device AT90S8535
.equ    SREG	=$3F
.equ    sph    	=$3E
.equ    spl    	=$3D
.equ	PORTB	=$18
.equ	DDRB	=$17
.equ    PINB    =$16
.equ	PORTD	=$12
.equ	DDRD	=$11
.equ    PIND    =$10
.equ    UDR	=$0C
.equ    UCR	=$0A
.equ    UBRR    =$09
.def 	XL     	=r26
.def 	XH     	=r27
.def 	YL     	=r28
.def 	YH     	=r29
.def 	ZH     	=r31
.def 	ZL     	=r30

	.org	$000
	rjmp	reset
	.org	$00b
	rjmp	U_RXC
	.org	$00d
	rjmp	U_TXC
	
tab:	.db	$3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f
	
reset:	ldi	r16,$02			;栈指针置初值
	out	sph,r16
	ldi	r16,$5f
	out	spl,r16
	ldi	r16,$ff			;定义PB口为输出口
	out	DDRB,r16
	ldi	r16,$7f			;定义PD7为带上拉的输入,PD0~PD6口为输出
	out	DDRD,r16
	sbi	PORTD,7			;定义PD7带口上拉输入
	ldi	r16,$98			;定义串收、串发及相应中断
	out	UCR,r16
	ldi	r16,51			;定义波特率为9600
	out	UBRR,r16
	sei
	ldi	r18,0			;4位显示送初值BCD码
	ldi	r19,1
	ldi	r20,2
	ldi	r21,3
	ldi	XL,$10			;发送缓冲区指针X置初值
	ldi	XH,$01
	ldi	YL,$12			;接收缓冲区指针Y置初值
	ldi	YH,$00
	ldi	r16,5			;SRAM$110~$113送5、6、7、8
	sts	$110,r16
	ldi	r16,6
	sts	$111,r16
	ldi	r16,7
	sts	$112,r16
	ldi	r16,8
	sts	$113,r16
aa:	rcall	smiao			;动态扫描
	in	r16,PIND		;读PD7,有键按下就转异步发送
	sbrs	r16,7
	rjmp	bb
	rjmp	aa			;否则,继续动态扫描
bb:	ldi	r17,$04			;共发4个字节
	sbi	UCR,6
cc:	rcall	smiao
	rjmp	cc
	
U_RXC:	in	r1,SREG			;保护标志寄存器
	in	r22,UDR			;读UART数据寄存器
	st	Y+,r22			;送r18~r21中1个寄存器
	out	SREG,r1			;恢复标志寄存器
	reti
	
U_TXC:	in	r1,SREG			;保护标志寄存器
	ld	r16,X+			;串发1个字节
	out	UDR,r16
	dec	r17
	brne	ee			;没发完,中断返回,下次中断再发
	cbi	UCR,6			;发完规定的字节数,清发送中断使能位
ee:	out	SREG,r1			;恢复标志寄存器
	reti

smiao:	ldi	r16,$fb			;选中PD2,先显示个位
	out	PORTD,r16
	mov	r23,r18			;将待显示的数放在r23中
	rcall	cqb			;查7段码送字线
	rcall	t1ms			;延时1ms
	ldi	r16,$f7			;选中PD3,先显示十位
	out	PORTD,r16
	mov	r23,r19			;将待显示的数放在r23中
	rcall	cqb			;查7段码送字线
	rcall	t1ms			;延时1ms
	ldi	r16,$ef			;选中PD4,先显示百位
	out	PORTD,r16
	mov	r23,r20			;将待显示的数放在r23中
	rcall	cqb			;查7段码送字线
	rcall	t1ms			;延时1ms
	ldi	r16,$df			;选中PD5,先显示千位
	out	PORTD,r16
	mov	r23,r21			;将待显示的数放在r23中
	rcall	cqb			;查7段码送字线
	rcall	t1ms			;延时1ms
	ret
	
cqb:	ldi	ZH,high(tab*2)		;7段码的首址给Z
	ldi	ZL,low(tab*2)
	add	ZL,r23			;首地址+偏移量
	lpm				;查表送B口输出
	out	PORTB,r0
	ret
	
t1ms:	ldi	r24,101			;延时1ms子程序
	push	r24
del2:	push	r24
del3:	dec	r24
	brne	del3
	pop	r24
	dec	r24
	brne	del2
	pop	r24
	ret

⌨️ 快捷键说明

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