Это уже вернее, но Вы забыли добавить = между именем и регистром.
Вот правильный вариант:
Код: Выделить всё
.def temp = r16
.def temp1 = r17
.def temp2 = r18
А зажечь светодиоды можно так:
Разберём один байт:
0b00001111
Код: Выделить всё
_____
|128| 64| 32| 16| 8| 4| 2| 1|
----------
| 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
----------
Чтобы получить нам например 0b00000011 из 0b00000001
Нам надо прибавить 2 к 0b00000001
Чтобы получить нам например 0b00000111 из 0b00000011
Нам надо прибавить 4 к 0b00000011
Делается это так:
Код: Выделить всё
.include "tn2313def.inc"
;----------
.def temp0 = r16
.def temp1 = r17
;----------
.cseg
.org 0x0000
ldi temp0, Low(ramend) ; Указываем адрес конца ОЗУ
out SPL, temp0 ; Это инициализация стека. Без неё не будет работать команда rcall
ldi temp0, 0b11111111
out DDRB, temp0 ; настроим порт Б на выход.
;----------
LOOP:
ldi temp0, 0b00000001
out PORTB, temp0 ; зажигаем первый светодиод.
ldi temp1, 2
add temp0, temp1 ; прибавим 2 из temp1 к 0b00000001 из temp0
; В итоге в temp0 получится 0b00000011
rcall DELAY ; вызовем подпрограмму задержки на исполнение.
; как она закончится, вернёмся суда.
out PORTB, temp0 ;Отправим после задержки в портб обновлённое значение
; этим мы зажжём следующий светодиод
ldi temp1, 4
add temp0, temp1 ; прибавим 4 из temp1 к 0b00000011 из temp0
; В итоге в temp0 получится 0b00000111
rcall DELAY ; вызовем подпрограмму задержки на исполнение.
; как она закончится, вернёмся суда.
out PORTB, temp0 ;Отправим после задержки в портб обновлённое значение
; этим мы зажжём следующий светодиод
ldi temp1, 8
add temp0, temp1 ; прибавим 8 из temp1 к 0b00000111 из temp0
; В итоге в temp0 получится 0b00001111
rcall DELAY ; вызовем подпрограмму задержки на исполнение.
; как она закончится, вернёмся суда.
out PORTB, temp0 ;Отправим после задержки в портб обновлённое значение
; этим мы зажжём следующий светодиод
ldi temp1, 16
add temp0, temp1 ; прибавим 16 из temp1 к 0b00001111 из temp0
; В итоге в temp0 получится 0b00011111
rcall DELAY ; вызовем подпрограмму задержки на исполнение.
; как она закончится, вернёмся суда.
out PORTB, temp0 ;Отправим после задержки в портб обновлённое значение
; этим мы зажжём следующий светодиод
ldi temp1, 32
add temp0, temp1 ; прибавим 32 из temp1 к 0b00011111 из temp0
; В итоге в temp0 получится 0b00111111
rcall DELAY ; вызовем подпрограмму задержки на исполнение.
; как она закончится, вернёмся суда.
out PORTB, temp0 ;Отправим после задержки в портб обновлённое значение
; этим мы зажжём следующий светодиод
; Дальше продолжи сам c числами 64 и 128
rjmp LOOP
;----------
DELAY: ;это подпрограмма задержки
dec r18
brne DELAY
dec r19
brne DELAY
dec r20
brne DELAY
dec r21
brne DELAY
ret ;Выходим из задержки
Можно сделать и так:
Код: Выделить всё
.include "tn2313def.inc"
;----------
.def temp0 = r16
;----------
.cseg
.org 0x0000
ldi temp0, Low(ramend) ; Указываем адрес конца ОЗУ
out SPL, temp0 ; Это инициализация стека. Без неё не будет работать команда rcall
ldi temp0, 0b11111111
out DDRB, temp0 ; настроим порт Б на выход.
ldi temp0, 0b00000000
out PORTB, temp0 ;Гасим на всякий порт Б
;----------
LOOP:
sbi PORTB, 0 ;зажигаем 1й светодиод
rcall DELAY ; вызовем задержку
sbi PORTB, 1 ;зажигаем 2й светодиод
rcall DELAY ; вызовем задержку
sbi PORTB, 2 ;зажигаем 3й светодиод
rcall DELAY ; вызовем задержку
sbi PORTB, 3 ;зажигаем 4й светодиод
rcall DELAY ; вызовем задержку
sbi PORTB, 4 ;зажигаем 5й светодиод
rcall DELAY ; вызовем задержку
sbi PORTB, 5 ;зажигаем 6й светодиод
rcall DELAY ; вызовем задержку
sbi PORTB, 6 ;зажигаем 7й светодиод
rcall DELAY ; вызовем задержку
sbi PORTB, 7 ;зажигаем 8й светодиод
rcall DELAY ; вызовем задержку
out PORTB, temp0 ;гасим все светодиоды (мы уже кинули в начале 0b00000000 в temp0)
rjmp LOOP ;вернёмся в начало
;----------
DELAY: ;это подпрограмма задержки
dec r18
brne DELAY
dec r19
brne DELAY
dec r20
brne DELAY
dec r21
brne DELAY
ret ;Выходим из задержки
P.S. Если нет AVR Studio, то советую скачать. Неплохая среда разработки.
