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

📄 zh1.asm

📁 基于PROTERUS仿真的AVR例子
💻 ASM
字号:
.device AT90S8535
.equ    sph     =$3E
.equ    spl     =$3D
.equ    TIMSK   =$39
.equ    OCR1AH  =$2B
.equ    OCR1AL  =$2A
.equ    TCCR1B  =$2E
.equ    SREG	=$3F
.equ    TCNT1H	=$2D
.equ    TCNT1L	=$2C
.equ	PORTA	=$1B 		
.equ	DDRA	=$1A 		
.equ    PINA    =$19
.equ	PORTC	=$15 		
.equ	DDRC	=$14 		
.equ    PINC    =$13
.equ	PORTD	=$12 		
.equ	DDRD	=$11 		
.equ    PIND    =$10
.def 	ZL     	=r30
.def 	ZH     	=r31

	.org	$0000
	rjmp	main
	.org	$006
	rjmp	t1_cp
	
tab1:	.db	$3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f,$77,$7c,$39,$5e,$79,$71
tab2:	.db 	$05,$eb,$05,$99,$04,$fc,$04,$70,$03,$f4,$03,$bc,$03,$54,$02,$f7,$02,$cc,$02,$7e,$02,$38,$01,$fa,$01,$df,$01,$aa,$01,$7b,$01,$66

main:	ldi	r16,$02			;栈指针置初值
	out	sph,r16
	ldi	r16,$5f
	out	spl,r16
	ldi	r16,$ff			;PA口定义为输出口
	out	DDRA,r16
	ldi	r16,$01			;PD0口定义为输出口
	out	DDRD,r16
	ldi	r16,$10			;允许T1比较匹配A中断
	out	TIMSK,r16
	clr	r16			;置TCNT1初值为0
	out	TCNT1L,r16
	out	TCNT1H,r16
	ldi	r16,$0a			;设置T/C1频率
	out	TCCR1B,r16
	
lscan:	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
	mov	r20,r17
	lsl	r20
	ldi	ZH,high(tab2*2)
	ldi	ZL,low(tab2*2)
	add	ZL,r20
	lpm
	out	OCR1AH,r0
	inc	ZL
	lpm
	out	OCR1AL,r0
	sei
	rcall	cqb
w0:	ldi	r16,$f0			;等待按键释放
	out	PORTC,r16
w1:	in	r16,PINC
	andi	r16,$ff
	cpi	r16,$f0
	brne	w2
	cli
	ldi	r16,$00
	out	PORTA,r16
	rjmp	lscan
w2:	rjmp	w0

cqb:	ldi	ZH,high(tab1*2)		;7段码的首址给Z
	ldi	ZL,low(tab1*2)
	add	ZL,r17			;首地址+偏移量
	lpm				;查表送B口输出
	out	PORTA,r0
	ret
	
t1_cp:	in	r1,sreg			;保护标志
	in	r2,PORTD		;PD口取反
	com	r2
	out	PORTD,r2
	out	sreg,r1			;标志恢复
	reti

t1ms:	ldi	r24,6			;延时子程序
	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 + -