📄 zh11.asm
字号:
.device AT90S8535
.equ sph =$3E
.equ spl =$3D
.equ PORTA =$1B
.equ DDRA =$1A
.equ PINA =$19
.equ PORTD =$12
.equ DDRD =$11
.equ PIND =$10
.def ZH =r31
.def ZL =r30
.org $0000
rjmp reset
reset: ldi r16,$02 ;栈指针置初值
out sph,r16
ldi r16,$5f
out spl,r16
ldi r16,$00
out DDRA,r16
ldi r16,$ff
out DDRD,r16
out PORTA,r16
ldi r17,$03
ldi r18,$00
;**********************************************************
wait: out PORTD,r17 ;初始角度,0度
in r16,PINA
sbrc r16,0
rjmp a0
rjmp pos
a0: sbrc r16,1
rjmp wait
rjmp neg
;**********************************************************
pos: ldi ZH,high(tab*2)
ldi ZL,low(tab*2)
inc ZL,r18
lpm
out PORTD,r0
rcall delay
inc r18
rjmp key
;**********************************************************
neg: ldi ZH,high(tab*2)
ldi ZL,low(tab*2)
ldi r18,$06 ;反转9度
add ZL,r18
lpm
out PORTD,r0
rcall delay
rjmp key
;**********************************************************
key: in r16,PINA ;读键盘情况
sbrs r16,0
rjmp a1
rjmp fz1
a1: cpi r18,$08
brne loopz ;是结束标志
ldi r18,$00
;**********************************************************
loopz: ldi ZH,high(tab*2)
ldi ZL,low(tab*2)
add ZL,r18
lpm
out PORTD,r0 ;输出控制脉冲
rcall delay ;程序延时
inc r18 ;地址加1
rjmp key
;**********************************************************
fz1: sbrs r16,1
rjmp a2
rjmp key
a2: dec r18
cpi r18,$ff
brne loopf
ldi r18,$07
;**********************************************************
loopf: ldi ZH,high(tab*2)
ldi ZL,low(tab*2)
add ZL,r18
lpm
out PORTD,r0 ;输出控制脉冲
rcall delay ;程序延时
rjmp key
;**********************************************************
;延时100ms
delay: ldi r16,114
push r16 ;进栈需2t
de0: push r16 ;进栈需2t
de1: push r16 ;进栈需2t
de2: dec r16 ;-1需1t
brne de2 ;不为0转,为0顺序执行,需1t/2t
pop r16 ;出栈需2t
dec r16 ;-1需1t
brne de1 ;不为0转,为0顺序执行,需1t/2t
pop r16 ;出栈需2t
dec r16 ;-1需1t
brne de0 ;不为0转,为0顺序执行,需1t/2t
pop r16 ;出栈需2t
ret
;**********************************************************
;正转模型
tab: .db $02,$06,$04,$0C,$08,$09,$01,$03
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -