📄 sldiy16-07.asm
字号:
;********************************************
;SL-DIY-08-16 实验七
;I/O端口进一步应用。
;用图6的ATmega16的PB.0端口开关(可用接插线接VCC或GND代替)
;控制PA口8个LED灯作跑马灯控制;可作广告灯用。
;请你编写出其它花样的广告灯程序!
;********************************************
;*ATmega16 8MHz
;*双龙电子 www.sl.com.cn
;* teny 2005.11.12
;********* teny@sl.com.cn **************
;********************************************
.include "m16def.inc"
.def dt = r22
.org $000
rjmp reset7
.org $010
reset7:
ldi r17,$02 ;置栈指针,mega16的内建值为$025f
ldi r16,$5f
out sph,r17
out spl,r16
shiyan7: ;pb0-----pa0~pa7跑马灯程序
ldi r17,$ff
clr r16
out ddra,r17 ;pa0设置为输出
out porta,r17
out ddrb,r16 ;pb0设置为输入,且内部上拉
out portb,r17
ldi r18,$ff
start7:
out porta,r18 ;熄灭pa口的led灯
ldi r17,$fe ;循环移位初值 (0b 1111 1110)
in r16,pinb ;读取pb口的管脚状态
andi r16,$01 ;保留pinb0的状态值
cpi r16,$00 ;为 0 ,说明pb0开关闭合(按下),实行控制
brne start7 ;不为 0, pb0开关断开,循环检测.
pmd:
out porta,r17 ;点亮pa口的一盏led灯
ldi dt,144 ;令dt=144,延时时间定为 200 ms
rcall delay ;调用延时程序
sec ;置位进位位标志 C
rol r17 ;左移 1 位
cpi r17,$ff ;为 $ff,说明pa7的led已经点亮
brne pmd ;不等,从pa0到pa7依次点亮
rjmp start7 ;循环检测
;**********************************
;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 + -