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

📄 zh2.asm

📁 基于PROTERUS仿真的AVR例子
💻 ASM
字号:
.device AT90S8535
.equ    sph     =$3E
.equ    spl     =$3D
.equ    SREG	=$3F
.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

main:	ldi	r16,$02			;栈指针置初值
	out	sph,r16
	ldi	r16,$5f
	out	spl,r16
	ldi	r16,$ff			;PC口定义为输出口
	out	DDRC,r16
	out	PORTD,r16
	ldi	r16,$00			;PD口定义为输入口
	out	DDRD,r16
start1:	ldi	r16,$ff			;定义无输入时无输出
	out	PORTC,r16
start:	in	r16,PIND		;读PC口数据
	andi	r16,$1f			;取用PC口的低五位数据
	cpi	r16,$1f
	brne	shiy
	rjmp	start1
shiy:	mov	r17,r16
	rcall	de			;延时
	in	r16,PIND		;读PC口的数据
	andi	r16,$1f			;取用PC口的低五位数据
	cpi	r16,$1f			;对P3口的低五位数据进行判断
	brne	shiy1
	rjmp	start1			;开关没有动作时无输出
	
shiy1:	cp	r16,r17
	brne	start1
	cpi	r16,$17			;PC3=0时进入左转分支
	brne	next1
	rjmp	left
	
next1:	cpi	r16,$0f			;PC4=0时进入右转分支
	brne	next2
	rjmp	right
	
next2:	cpi	r16,$1d			;PC1=0时进入紧急分支
	brne	next3
	rjmp	earge
	
next3:	cpi	r16,$1e			;PC0=0时进入刹车分支
	brne	next4
	rjmp	brake

next4:	cpi	r16,$16			;PC3=0、PC0=0时进入左转刹车分支
	brne	next5
	rjmp	lebr
	
next5:	cpi	r16,$0e			;PC4=0、PC0=0时进入右转刹车分支
	brne	next6
	rjmp	ribr
	
next6:	cpi	r16,$1c			;PC1=0、PC0=0时进入紧急刹车分支
	brne	next7
	rjmp	brer

next7:	cpi	r16,$14			;PC3=0、PC1=0、PC0=0时进入左转紧急刹车分支
	brne	next8
	rjmp	lbe
	
next8:	cpi	r16,$0c			;PC4=0、PC1=0、PC0=0时进入右转紧急刹车分支
	brne	next9
	rjmp	rbe
	
next9:	cpi	r16,$1b			;PC2=0时进入停靠分支
	brne	next10
	rjmp	stop
	
next10:	rjmp	error			;其他情况进入错误分支

left:	ldi	r16,$6a			;左转分支
	out	PORTC,r16
	rcall	de1s
	ldi	r16,$ff	
	out	PORTC,r16
	rcall	de1s
	rjmp	start
	
right:	ldi	r16,$55			;右转分支
	out	PORTC,r16
	rcall	de1s
	ldi	r16,$ff	
	out	PORTC,r16
	rcall	de1s
	rjmp	start

earge:	ldi	r16,$40			;紧急分支
	out	PORTC,r16
	rcall	de1s
	ldi	r16,$ff	
	out	PORTC,r16
	rcall	de1s
	rjmp	start

brake:	ldi	r16,$4f			;刹车分支
	out	PORTC,r16
	rjmp	start
	
lebr:	ldi	r16,$4a			;左转刹车分支
	out	PORTC,r16
	rcall	de1s
	ldi	r16,$5f	
	out	PORTC,r16
	rcall	de1s
	rjmp	start
	
ribr:	ldi	r16,$45			;右转刹车分支
	out	PORTC,r16
	rcall	de1s
	ldi	r16,$6f	
	out	PORTC,r16
	rcall	de1s
	rjmp	start
	
brer:	ldi	r16,$40			;紧急刹车分支
	out	PORTC,r16
	rcall	de1s
	ldi	r16,$4f	
	out	PORTC,r16
	rcall	de1s
	rjmp	start
	
lbe:	ldi	r16,$40			;左转紧急刹车分支
	out	PORTC,r16
	rcall	de1s
	ldi	r16,$5f	
	out	PORTC,r16
	rcall	de1s
	rjmp	start
	
rbe:	ldi	r16,$40			;右转紧急刹车分支
	out	PORTC,r16
	rcall	de1s
	ldi	r16,$6f	
	out	PORTC,r16
	rcall	de1s
	rjmp	start
	
stop:	ldi	r16,$43			;停靠分支
	out	PORTC,r16
	rcall	de100ms
	ldi	r16,$7f	
	out	PORTC,r16
	rcall	de100ms
	rjmp	start

error:	ldi	r16,$3f			;错误分支
	out	PORTC,r16
	rcall	de1s
	ldi	r16,$ff	
	out	PORTC,r16
	rcall	de1s
	rjmp	start

de:	ldi	r24,6			;延时子程序
	push	r24
del2:	push	r24
del3:	dec	r24
	brne	del3
	pop	r24
	dec	r24
	brne	del2
	pop	r24
	ret
	
de1s:	ldi	r24,249
	push	r24
desl1:	push	r24
desl2:	push	r24
desl3:	dec	r24
	brne	desl3
	pop	r24
	dec	r24
	brne	desl2
	pop	r24
	dec	r24
	brne	desl1
	pop	r24
	ret
	
de100ms:ldi	r24,114
	push	r24
demsl1:	push	r24
demsl2:	push	r24
demsl3:	dec	r24
	brne	demsl3
	pop	r24
	dec	r24
	brne	demsl2
	pop	r24
	dec	r24
	brne	demsl1
	pop	r24
	ret

⌨️ 快捷键说明

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