📄 sldiy16-05.asm
字号:
;********************************************
;SL-DIY-08-16 实验五
;用一个I/O端口控制二个I/O端口。
;ATmega16的PB.0端口开关(可用接插线接VCC或GND代替)
;控制PA.0,PA.1两端口LED灯轮流闪烁;
;LED灯轮流闪烁可模拟动物的眼睛闪烁玩具使用。
;如果用ATmega16的PA.0端口开关控制PB.0,PB.1两端口LED灯轮流闪烁,
;你应该怎样来修改程序。
;********************************************
;*ATmega16 8MHz
;*双龙电子 www.sl.com.cn
;* teny 2005.11.12
;********* teny@sl.com.cn **************
;********************************************
.include "m16def.inc"
.def dt = r22
.org $000
rjmp reset5
.org $010
reset5:
ldi r17,$04 ;置栈指针,mega16的内建值为$045f
ldi r16,$5f
out sph,r17
out spl,r16
shiyan5:
ldi r17,$ff
clr r16
out ddra,r17 ;pa0设置为输出
out porta,r17
out ddrb,r16 ;pb0设置为输入,且内部上拉
out portb,r17
ldi dt,197 ;令dt=197,延时时间定为 500 ms
start5:
out porta,r17 ;熄灭pa口的led灯
in r16,pinb ;读取pb口的管脚状态
andi r16,$01 ;保留pinb0的状态值
cpi r16,$00 ;为 0 ,说明pb0开关闭合(按下),实行控制
brne start5 ;不为 0, pb0开关断开,循环检测.
sbi porta,1 ;熄灭pa1所接的led灯
cbi porta,0 ;点亮pa0所接的led灯
rcall delay ;调用延时程序
sbi porta,0 ;熄灭pa0所接的led灯
cbi porta,1 ;点亮pa1所接的led灯
rcall delay ;调用延时程序
rjmp start5 ;循环检测
;**********************************
;fos=8MHz
;dt time dt time dt time
;22 1ms 29 2ms 40 5ms
;51 10ms 65 20ms 90 50ms
;114 100ms 144 200ms 197 500ms
;249 1s
;**********************************
delay:
push dt
del1: push dt
del2: push dt
del3: dec dt
brne del3
pop dt
dec dt
brne del2
pop dt
dec dt
brne del1
pop dt
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -