Ассемблер - Работа со светодиодами
У меня проблема с небольшим заданием, условие (МК AVR):
Начать работу когда нажимается кнопка К - PB2 - зажжется светодиод на выходе PD3 и после задержки (2с) PD4. При нажатии кнопки PB3 светодиоды погаснут и программа возвращается в исходное состояние. Реализация на ассемблере)
Я не очень силен в ассемблере, прошу хотя бы направить на меня на путь истинный, как это должно быть реализовано.
Ответы (1 шт):
Теперь перейдем к решению.
Для начала:
cbi ddrb, 2 // сбросить бит и подготовить PB2 к вводу
sbi portb, 2
cbi ddrb, 3 // сбросить бит и подготовить PB3 к вводу
sbi portb, 3
sbi DDRb, 3 // порт PD3 на выход
sbi DDRb, 4 // порт PD4 на выход
На самом деле первым делом нужно декомпозировать задачу. Сначала мы решим то, что ожидания начала(нажатия кнопки) и зажжения светодиодов нам нужно вынести в отдельный цикл. Он будет выглядеть следующим образом:
loop1:
sbic pinb, 2 // ожидания нажатия
rjmp loop1
sbi PORTD,3 // записать 1 в порт PD3 на выход
call Delay
call Delay
sbi PORTD,4 // Записать 1 в порт PD4 на выход
rjmp loop2
Как мы видим наш цикл заканчивается "rjmp loop2" благодаря чему мы переходим в другой цикл, в котором мы соответственно ожидаем нажатия для погасания светодиодов и возвращение в исходную позицию(на начало первого цикла):
loop2:
sbic pinb, 3 // ожидания нажатия
rjmp loop2
cbi PORTD, 3
cbi PORTD, 4
rjmp loop1
Так же мы можем заметить что у нас стоит условие задержки, это я реализовал в таком виде:
Delay: // Задержка
ldi b, 255
ldi c, 255
ldi d, 10
PDelay:
dec b // Перейти в PDelay если b не = 0
brne PDelay
dec c
brne PDelay
dec c
brne PDelay
ret // Выйти с Delay