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

📄 sg7.asm

📁 基于PROTERUS仿真的AVR例子
💻 ASM
字号:
.device AT90S8535
.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    TIMSK   =$39
.equ    TIFR		=$38
.equ    SREG	=$3F
.equ    TCCR0	=$33
.equ    TCNT0 	=$32
.def 	ZH     	=r31
.def 	ZL     	=r30

	.org	$0000
	rjmp	reset
	.org	$009
	rjmp	t0_ovf

reset:	ldi	r16,$02		;栈指针置初值
	out	sph,r16
	ldi	r16,$5f
	out	spl,r16
	ldi	r16,$ff			;定义PB、PD为输出
	out	DDRB,r16
	out	DDRD,r16
	ldi	r17,$ff			;设初值在r17、r16
	ldi	r16,$ff
	rcall	btd				;调二转十子程序
	mov	r23,r16			;查7段码,送给$100~$104
	rcall	cqml
	sts	$100,r0
	mov	r23,r17
	rcall	cqml
	sts	$101,r0
	mov	r23,r18
	rcall	cqml
	sts	$102,r0
	mov	r23,r19
	rcall	cqml
	sts	$103,r0
	mov	r23,r20
	rcall	cqml
	sts	$104,r0
	ldi	r16,$01			;允许T/C0溢出中断
	out	TIMSK,r16
	ldi	r16,$03			;64分频,2ms 1位
	out	TCCR0,R16
	ldi	r16,$00			;T/C0置初值0
	out	TCNT0,r16
	out	TIFR,r16
	ldi	r21,$fe			;位线置初值
	sei
here:	rjmp	here

t0_ovf:	in	r1,SREG		;保存SREG
	cpi	r21,$fe			;该显示个位?
	brne	t21				;否则转t21
	lds	r20,$100			;送个位7段码给字线
	out	PORTB,r20
	out	PORTD,r21		;送个位位线
	ldi	r21,$fd			;修改位线(下次显示十位)
	rjmp	t25
t21:	cpi	r21,$fd			;该显示十位?
	brne	t22				;否则转t22
	lds	r20,$101			;送十位7段码给字线
	out	PORTB,r20
	out	PORTD,r21		;送十位位线
	ldi	r21,$fb			;修改位线(下次显示百位)
	rjmp	t25
t22:	cpi	r21,$fb			;该显示百位?
	brne	t23				;否则转t23
	lds	r20,$102			;送百位7段码给字线
	out	PORTB,r20
	out	PORTD,r21		;送百位位线
	ldi	r21,$f7			;修改位线(下次显示千位)
	rjmp	t25
t23:	cpi	r21,$f7			;该显示千位?
	brne	t24				;否则转t23
	lds	r20,$103			;送千位7段码给字线
	out	PORTB,r20
	out	PORTD,r21		;送千位位线
	ldi	r21,$ef			;修改位线(下次显示万位)
	rjmp	t25
t24:	lds	r20,$104			;送万位7段码给字线
	out	PORTB,r20
	out	PORTD,r21		;送万位位线
	ldi	r21,$fe			;修改位线(下次显示个位)
t25:	out	SREG,r1			;恢复sreg'
	reti

btd:	ser	r20				;r20先送-1
btd_1:	inc	r20			;r20增1
	subi	r16,low(10000)	;(r17:r16)-10000
	sbci	r17,high(10000)
	brcc	btd_1			;够减则返回btd_1
	subi	r16,low(-10000)	;不够减+10000,恢复余数
	sbci	r17,high(-10000)
	ser	r19				;r19先送-1
btd_2:	inc	r19			;r19增1
	subi	r16,low(1000)		;(r17:r16)-1000
	sbci	r17,high(1000)
	brcc	btd_2			;够减则返回btd_2
	subi	r16,low(-1000)	;不够减+1000,恢复余数
	sbci	r17,high(-1000)
	ser	r18				;r18先送-1
btd_3:	inc	r18			;r18增1
	subi	r16,low(100)		;(r17:r16)-100
	sbci	r17,high(100)
	brcc	btd_3			;够减则返回btd_3
	subi	r16,low(-100)		;不够减+100,恢复余数
	sbci	r17,high(-100)
	ser	r17				;r17先送-1
btd_4:	inc	r17			;r17增1
	subi	r16,10			;(r17:r16)-10
	brcc	btd_4			;够减则返回btd_4
	subi	r16,-10			;不够减+10,恢复余数
	ret
	
cqml:	ldi	ZH,high(tab*2)		;查个位7段码
	ldi	ZL,low(tab*2)
	add	ZL,r23
	lpm
	ret
	
tab:	.db	$3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f

⌨️ 快捷键说明

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