📄 zh2.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 + -