📄 sldiy16-08.asm
字号:
;********************************************
;SL-DIY-08-16 实验八
;I/O端口的进一步应用。
;请你设计SL-DIY08-16主板上4个I/O口
;32个LED灯的变化多样的广告灯程序。
;********************************************
;*ATmega16 8MHz
;*双龙电子 www.sl.com.cn
;* teny 2005.11.12
;********* teny@sl.com.cn **************
;********************************************
.include "m16def.inc"
.def dt = r22
.org $000
rjmp reset8
.org $010
reset8:
ldi r17,$04 ;置栈指针,mega16的内建值为$045f
ldi r16,$5f
out sph,r17
out spl,r16
shiyan8:
ldi r16,$ff
out ddra,r16 ;pa0设置为输出
out porta,r16
out ddrb,r16 ;pb0设置为输出
out portb,r16
out ddrc,r16 ;pc0设置为输出
out portc,r16
out ddrd,r16 ;pd0设置为输出
out portd,r16
start8:
ldi dt,114 ;令dt=144,延时时间定为 200 ms
out porta,r16
out portb,r16
out portc,r16
out portd,r16
ldi r17,$fe ;循环移位初值 (0b 1111 1110)
porta00:
out porta,r17 ;点亮pa口的一盏led灯
rcall delay ;调用延时程序
sec ;置位进位位标志 C
rol r17 ;左移 1 位
cpi r17,$ff ;为 $ff,说明pa7的led已经点亮
brne porta00 ;不等,从pa0到pa7依次点亮
ldi r17,$7f ;循环移位初值 (0b 0111 1111)
out porta,r16
out portb,r16
out portc,r16
out portd,r16
portc00:
out portc,r17 ;点亮pc口的一盏led灯
rcall delay ;调用延时程序
sec ;置位进位位标志 C
ror r17 ;右移 1 位
cpi r17,$ff ;为 $ff,说明pc0的led已经点亮
brne portc00 ;不等,从pc7到pc0依次点亮
ldi r17,$fe ;循环移位初值 (0b 1111 1110)
out porta,r16
out portb,r16
out portc,r16
out portd,r16
portb00:
out portb,r17 ;点亮pb口的一盏led灯
rcall delay ;调用延时程序
sec ;置位进位位标志 C
rol r17 ;左移 1 位
cpi r17,$ff ;为 $ff,说明pb7的led已经点亮
brne portb00 ;不等,从pb0到pb7依次点亮
ldi r17,$fe ;循环移位初值 (0b 1111 1110)
out porta,r16
out portb,r16
out portc,r16
out portd,r16
portd00:
out portd,r17 ;点亮pd口的一盏led灯
rcall delay ;调用延时程序
sec ;置位进位位标志 C
rol r17 ;左移 1 位
cpi r17,$ff ;为 $ff,说明pd7的led已经点亮
brne portd00 ;不等,从pd0到pd7依次点亮
out portd,r16
ldi r18,$04 ;交替闪烁次数
port400:
ldi dt,197 ;令dt=197,延时时间定为 500 ms
clr r17
out porta,r17 ;点亮 pa pd口的led灯
out portb,r16 ;熄灭 pb pc口的led灯
out portc,r16
out portd,r17
rcall delay ;调用延时程序
out porta,r16 ;熄灭 pa pd口的led灯
out portb,r17 ;点亮 pb pc口的led灯
out portc,r17
out portd,r16
rcall delay ;调用延时程序
dec r18 ;闪烁次数减 1
brne port400 ;不为 0 ,继续闪烁
rjmp start8 ;循环
;**********************************
;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 + -