
.include "m16def.inc" // Подключаем заголовочный файл
.def temp = r16 // Присваиваем регистрам символические имена
.def razr1 = r17
.def razr2 = r18
.def razr3 = r19
.def sys = r20

.dseg // Сегмент ОЗУ
Dvig1: // Определим под каждый движок свой байт
.byte 1
Dvig2:
.byte 1
Dvig3:
.byte 1

.cseg // Программный сегмент
.org 0 // Адрес вектора Reset
rjmp Reset // Переходим на Reset

Reset: 
ldi temp, 128 // Отключаем JTAG
out MCUCSR, temp
ldi temp, High(RAMEND) // Инициализируем стек
out SPH, temp
ldi temp, Low(RAMEND)
out SPL, temp
ldi temp, 0xff // Порт D и C на выход
out DDRC, temp
out DDRD, temp
out PORTA, temp // На порт A говорим, что подключаем подтягивающие резисторы
ldi temp, 128 // Отключаем JTAG еще раз
out MCUCSR, temp
ldi temp, 0b00001000 // Записываем стартовое значение для всех движков
sts Dvig1, temp
sts Dvig2, temp
sts Dvig3, temp

Proga: // Основная программа
sbis PINA, 0 // Пропускаем следующую строку, если кнопка на PA0 не нажата
rcall Dvig1_Izm // Подпрограмма изменения положения 1 движка, ниже аналогично
sbis PINA, 1
rcall Dvig2_Izm
sbis PINA, 2
rcall Dvig3_Izm
lds temp, Dvig1 // Загружаем значение положения 1 двигателя
swap temp // Меняем тетрады
out PORTC, temp // Выводим в порт C
lds temp, Dvig2 // Загружаем значение положения 2 двигателя
lds razr1, Dvig3 // Загружаем значение положения 3 двигателя
swap razr1 // Меняем тетрады
add temp, razr1 // Суммируем регистры
out PORTD, temp // Выводим в порт D
rcall Delay // Вызываем подпрограмму задержки
rjmp Proga

Dvig1_Izm: // Подпрограмма изменения положения 1 двигателя
lds temp, Dvig1 // Загружаем положение в temp
sbis PINA, 5 // Пропускаем следующую строку, если кнопка на PA5 не нажата
rjmp Dvig1_Izm1 // Перепрыгнем по метке, если кнопка нажата
lsr temp // Логический сдвиг вправо =>
cpi temp, 0b00000000 // Проверяем, не вышли ли за пределы выводов двигателя
brne Dvig1_Izm0 // Если не вышли перейдем по метке
ldi temp, 0b00001000 // Если вышли, тогда установим данное значение
Dvig1_Izm0:
sts Dvig1, temp // Сохраним значение в память 1 двигателя
ret 
Dvig1_Izm1:
lsl temp // Логический сдвиг влево <=
cpi temp, 0b00010000 // Проверяем, не вышли ли за пределы выводов двигателя
brne Dvig1_Izm2 // Если не вышли перейдем по метке
ldi temp, 0b00000001 // Если вышли, тогда установим данное значение
Dvig1_Izm2:
sts Dvig1, temp // Сохраним значение в память 1 двигателя
ret 

Dvig2_Izm: // Подпрограмма изменения положения 2 двигателя
lds temp, Dvig2
sbis PINA, 6
rjmp Dvig2_Izm1
lsr temp
cpi temp, 0b00000000
brne Dvig2_Izm0
ldi temp, 0b00001000
Dvig2_Izm0:
sts Dvig2, temp
ret 
Dvig2_Izm1:
lsl temp
cpi temp, 0b00010000
brne Dvig2_Izm2
ldi temp, 0b00000001
Dvig2_Izm2:
sts Dvig2, temp
ret 

Dvig3_Izm: // Подпрограмма изменения положения 3 двигателя
lds temp, Dvig3
sbis PINA, 7
rjmp Dvig3_Izm1
lsr temp
cpi temp, 0b00000000
brne Dvig3_Izm0
ldi temp, 0b00001000
Dvig3_Izm0:
sts Dvig3, temp
ret 
Dvig3_Izm1:
lsl temp
cpi temp, 0b00010000
brne Dvig3_Izm2
ldi temp, 0b00000001
Dvig3_Izm2:
sts Dvig3, temp
ret 

Delay: // Стандартная задержка
ldi razr1, 255
ldi razr2, 255
ldi razr3, 15
PDelay:
dec razr1
brne PDelay 
dec razr2
brne PDelay
dec razr3
brne PDelay
ret
