Ассемблер - Работа со светодиодами

У меня проблема с небольшим заданием, условие (МК AVR):

Начать работу когда нажимается кнопка К - PB2 - зажжется светодиод на выходе PD3 и после задержки (2с) PD4. При нажатии кнопки PB3 светодиоды погаснут и программа возвращается в исходное состояние. Реализация на ассемблере)

Я не очень силен в ассемблере, прошу хотя бы направить на меня на путь истинный, как это должно быть реализовано.


Ответы (1 шт):

Автор решения: Andrii Sukhetskiy

Теперь перейдем к решению.

Для начала:

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
→ Ссылка