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

📄 sg16.asm

📁 the practice of proteus and avr
💻 ASM
字号:
.device AT90S8535
.equ    SREG	=$3F
.equ    sph    	=$3E
.equ    spl    	=$3D
.equ    ACSR  	=$08
.equ	PORTB	=$18
.equ	DDRB	=$17
.equ    PINB    =$16
.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	$000
	rjmp	reset
	.org	$010
	rjmp	ana_cp
	
reset:	ldi	r16,$02			;栈指针置初值
	out	sph,r16
	ldi	r16,$5f
	out	spl,r16
	ldi	r16,$00			;定义PB为输入口
	out	DDRB,r16
	out	PORTB,r16
	ldi	r16,$ff			;定义PD、PC为输出口
	out	DDRC,r16
	out	DDRD,r16
	cbi	ACSR,7
wt_e1:	sbic	ACSR,5			;等待输入信号(AIN0)<(AIN1)
	rjmp	wt_e1
wel_1:	sbis	ACSR,5			;等待输入信号(AIN0)>(AIN1)
	rjmp	wel_1
	
;说明:AIN0穿越AIN1时,模拟比较器输出(AC0)就改变一次,程序可检测此标志

wt_e2:	sbi	ACSR,0			;选择模拟比较器中断模式为上升沿
	sbi	ACSR,1
	sbi	ACSR,4			;清模拟比较器中断标志ACI
wel_2:	sbis	ACSR,4			;等待模拟比较器中断标志变1
	rjmp	wel_2
	
;说明:模拟比较器中断标志(ACI)按ACIS1和ACIS0所规定的模式置位,程序可检测此标志

ana_i:	ldi	r16,$13			;清模拟比较器中断标志ACI,选上升沿触发
	out	ACSR,r16
	clr	r17			;清计数寄存器的高、低字节
	clr	r18
	sei				;开中断
	sbi	ACSR,3			;使能模拟比较器中断
	rcall	btd			;调二转十子程序
bb:	rcall	smiao			;调动态扫描子程序
	rjmp	bb

ana_cp:	in	r1,SREG			;保护标志寄存器
	subi	r17,low(-1)		;计数器加1
	sbci	r18,high(-1)
	push	r17
	push	r18
	rcall	btd			;调二转十子程序
	mov	r25,r21			;将BCD码送r18~r22
	mov	r22,r20
	mov	r21,r19
	mov	r20,r18
	mov	r19,r17
	out	SREG,r1			;恢复标志寄存器
	pop	r18
	pop	r17
	reti
	
;说明:在模拟比较器中断使能位(ACIE)置1和全局中断使能后,就进入模拟比较器中断

btd:	ser	r21			;r21先送-1
btd_1:	inc	r21			;r21增1
	subi	r17,low(10000)		;(r18:r17)-10000
	sbci	r18,high(10000)
	brcc	btd_1			;够减则返回btd_1
	subi	r17,low(-10000)		;不够减+10000,恢复余数
	sbci	r18,high(-10000)
	ser	r20			;r20先送-1
btd_2:	inc	r20			;r20增1
	subi	r17,low(1000)		;(r17:r16)-1000
	sbci	r18,high(1000)
	brcc	btd_2			;够减则返回btd_2
	subi	r17,low(-1000)		;不够减+1000,恢复余数
	sbci	r18,high(-1000)
	ser	r19			;r19先送-1
btd_3:	inc	r19			;r19增1
	subi	r17,low(100)		;(r18:r17)-100
	sbci	r18,high(100)
	brcc	btd_3			;够减则返回btd_3
	subi	r17,low(-100)		;不够减+100,恢复余数
	sbci	r18,high(-100)
	ser	r18			;r18先送-1
btd_4:	inc	r18			;r18增1
	subi	r17,10			;(r18:r17)-10
	brcc	btd_4			;够减则返回btd_4
	subi	r17,-10			;不够减+10,恢复余数
	ret
	
smiao:	ldi	r16,$fe			;送个位位线
	out	PORTD,r16
	mov	r23,r19			;将个位的BCD码送r23
	rcall	cqb			;查7段码,送B口输出
	rcall	t1ms			;延时1ms
	ldi	r16,$fd			;送十位位线
	out	PORTD,r16
	mov	r23,r20			;将十位的BCD码送r23
	rcall	cqb			;查7段码,送B口输出
	rcall	t1ms			;延时1ms
	ldi	r16,$fb			;送百位位线
	out	PORTD,r16
	mov	r23,r21			;将百位的BCD码送r23
	rcall	cqb			;查7段码,送B口输出
	rcall	t1ms			;延时1ms
	ldi	r16,$f7			;送千位位线
	out	PORTD,r16
	mov	r23,r22			;将千位的BCD码送r23
	rcall	cqb			;查7段码,送B口输出
	rcall	t1ms			;延时1ms
	ldi	r16,$ef			;送万位位线
	out	PORTD,r16
	mov	r23,r25			;将万位的BCD码送r23
	rcall	cqb			;查7段码,送B口输出
	rcall	t1ms			;延时1ms
	ret
	
cqb:	ldi	ZH,high(tab*2)		;7段码的首址给Z
	ldi	ZL,low(tab*2)
	add	ZL,r23			;首地址+偏移量
	lpm				;查表送B口输出
	out	PORTC,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

tab:	.db	$3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f

⌨️ 快捷键说明

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