📄 sldiy16-06.asm
字号:
;********************************************
;SL-DIY-08-16 实验六
;用1个I/O端口控制8个I/O端口。
;ATmega16的PB.0端口开关(可用接插线接VCC或GND代替)
;控制PA口8个LED灯闪烁; 可作简单的广告灯使用。
;如果ATmega16的PB.0端口开关要控制PA口,PC口,PD口三个口同时闪烁,
;你应该怎样编程序?
;********************************************
;*ATmega16 8MHz
;*双龙电子 www.sl.com.cn
;* teny 2005.11.11
;********* teny@sl.com.cn **************
;********************************************
.include "m16def.inc"
.def dt = r22
.org $000
rjmp reset6
.org $010
reset6:
ldi r17,$04 ;置栈指针,mega16的内建值为$045f
ldi r16,$5f
out sph,r17
out spl,r16
shiyan6:
ldi r17,$ff ;pb0------pa0~pa7整体闪烁
clr r16
out ddra,r17 ;pa0设置为输出
out porta,r17
out ddrb,r16 ;pb0设置为输入,且内部上拉
out portb,r17
ldi r18,$ff
clr r19
ldi dt,197 ;令dt=197,延时时间定为 500 ms
start6:
in r16,pinb ;读取pb口的管脚状态
andi r16,$01 ;保留pinb0的状态值
cpi r16,$00 ;为 0 ,说明pb0开关闭合(按下),实行控制
brne start6 ;不为 0, pb0开关断开,循环检测.
out porta,r19 ;点亮pa口的led灯
rcall delay ;调用延时程序
out porta,r18 ;熄灭pa口的led灯
rcall delay ;调用延时程序
rjmp start6 ;循环检测
;**********************************
;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 + -