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

📄 zh6.asm

📁 the practice of proteus and avr
💻 ASM
字号:
.device AT90S8535
.equ    sph    	=$3E
.equ    spl    	=$3D
.equ	PORTC	=$15
.equ	DDRC	=$14
.equ    PINC    =$13
.equ	PORTD	=$12
.equ	DDRD	=$11
.equ    PIND    =$10
.def 	ZH     	=r31
.def 	ZL     	=r30

	.org	$0000
	rjmp	start
	
start:	ldi	r16,$02			;栈指针置初值
	out	sph,r16
	ldi	r16,$5f
	out	spl,r16
	ldi	r16,$ff
	out	DDRD,r16		;PD口定义为输出口
	ldi	r19,$00			;清显示数据寄存器寄存器
	ldi	r20,$00
	ldi	r21,$00
	ldi	r22,$00
	ldi	r23,$00
mloop:	rcall	disp			;调显示子程序
wait:	rcall	testk			;判断有无按键
	cpi	r16,$00
	breq	wait
	rcall	getkey			;读键
	inc	r25			;按键个数
	cpi	r16,$3f			;判断是否功能键
	breq	e1
	cpi	r16,$06
	breq	e1
	cpi	r16,$5b
	breq	e1
	cpi	r16,$4f
	breq	e1
	cpi	r16,$66
	breq	e1
	cpi	r16,$6d
	breq	e1
	cpi	r16,$7d
	breq	e1
	cpi	r16,$07
	breq	e1
	cpi	r16,$7f
	breq	e1
	cpi	r16,$6f
	breq	e1
	cpi	r16,$00
	breq	e2
	cpi	r16,$01
	breq	e2
	cpi	r16,$02
	breq	e2
	cpi	r16,$04
	breq	e2
	cpi	r16,$05
	breq	e2
	breq	e3			;判断是否清除键
e1:	cpi	r25,$01
	brne	n1
	rjmp	e11			;为第一个数字
n1:	cpi	r25,$02
	brne	n2
	rjmp	e12			;为第二个数字
n2:	cpi	r25,$03
	brne	n3
	rjmp	e13			;为第三个数字
n3:	rjmp	e3			;第四个数字转溢出
e11:	mov	r4,r16			;输入值暂存R4
	mov	r19,r4			;输入值送显示缓存
	rjmp	mloop			;等待再次输入
e12:	mov	r7,r16			;个位数暂存R7
	
;**********************************************************
					;测试有无按键按下子程序
testk:	ldi	r16,$f0
	out	DDRC,r16
	out	PORTC,r16
	in	r16,PINC
	andi	r16,$ff
	ret
;**********************************************************
					;读键子程序
getkey:	ldi	r16,$f0
	out	DDRC,r16
	out	PORTC,r16
l1:	in	r16,PINC
	cpi	r16,$f1
	brne	l2
	rcall	t1ms
	in	r16,PINC
	cpi	r16,$f1
	brne	l2
	ldi	r17,$00
	rjmp	rscan
l2:	cpi	r16,$f2
	brne	l3
	rcall	t1ms
	cpi	r16,$f2
	brne	l3
	ldi	r17,$01
	rjmp	rscan
l3:	cpi	r16,$f4
	brne	l4
	rcall	t1ms
	cpi	r16,$f4
	brne	l4
	ldi	r17,$02
	rjmp	rscan
l4:	cpi	r16,$f8
	brne	lscan
	rcall	t1ms
	cpi	r16,$f8
	brne	lscan
	ldi	r17,$03
rscan:	ldi	r16,$0f
	out	DDRC,r16
	out	PORTC,r16
c1:	in	r16,PINC
	cpi	r16,$e0
	brne	c2
	ldi	r18,$00
	rjmp	calcu
c2:	cpi	r16,$d0
	brne	c3
	ldi	r18,$01
	rjmp	calcu
c3:	cpi	r16,$b0
	brne	c4
	ldi	r18,$02
	rjmp	calcu
c4:	cpi	r16,$70
	brne	lscan
	ldi	r18,$03

calcu:	cpi	r17,$00			;计算键号
	brne	calcu1
	ldi	r17,$00
	rjmp	cb
calcu1:	cpi	r17,$01
	brne	calcu2
	ldi	r17,$04
	rjmp	cb
calcu2:	cpi	r17,$02
	brne	calcu3
	ldi	r17,$08
	rjmp	cb
calcu3:	ldi	r17,$0C
cb:	add	r17,r18
	rcall	cqb
	ret
;**********************************************************
					;查表子程序
cqb:	ldi	ZH,high(tab1*2)		;7段码的首址给Z
	ldi	ZL,low(tab1*2)
	add	ZL,r17			;首地址+偏移量
	lpm				;查表送B口输出
	mov	r16,r0
	ret	
;**********************************************************
					;显示控制子程序
disp:	ldi	r16,$fe			;送个位位线
	out	PORTD,r16
	out	PORTB,r21		;查7段码,送B口输出
	rcall	t1ms			;延时1ms
	ldi	r16,$fd			;送十位位线
	out	PORTD,r16
	out	PORTB,r22		;查7段码,送B口输出
	rcall	t1ms			;延时1ms
	ldi	r16,$fb			;送百位位线
	out	PORTD,r16
	out	PORTB,r23
	rcall	t1ms
	ldi	r16,$f7			;送千位位线
	out	PORTD,r16
	out	PORTB,r25		;查7段码,送B口输出
	rcall	t1ms			;延时1ms
	ldi	r16,$ef			;送万位位线
	out	PORTD,r16
	out	PORTB,r26		;查7段码,送B口输出
	rcall	t1ms			;延时1ms
	ldi	r16,$df			;送十万位位线
	out	PORTD,r16
	out	PORTB,r27
	rcall	t1ms
	ldi	r16,$bf			;送百万位位线
	out	PORTD,r16
	out	PORTB,r28		;查7段码,送B口输出
	rcall	t1ms			;延时1ms
	ldi	r16,$7f			;送千万位位线
	out	PORTD,r16
	out	PORTB,r29		;查7段码,送B口输出
	rcall	t1ms			;延时1ms
	ret
;**********************************************************
					;延时
t1ms:	ldi	r24,71			;延时1ms子程序
	push	r24
del2:	push	r24
del3:	dec	r24
	brne	del3
	pop	r24
	dec	r24
	brne	del2
	pop	r24
	ret
;**********************************************************
tab1:	.db	$07,$7f,$6f,$00,$66,$6d,$7d,$01,$06,$5b,$4f,$02,$03,$3f,$04,$05

⌨️ 快捷键说明

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