Подключаем кнопку на языке программирования Assembler, при нажатии кнопки включаем/выключаем светодиод.

Данном уроке мы с Вами рассмотрим условные операторы и подключим кнопку. В качестве реакции на нажатие кнопки у нас подключены два светодиода, которые будут менять свое состояние на противоположное.

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

Макрос имеет следующую структуру:
.macro имя
команды
.endm

Новые команды которые мы с Вами будем использовать:
subi Rd,K8 — вычитание константы Rd = Rd — K8
sbci Rd,K8 — вычитание константы с переносом Rd = Rd — K8 — C (если результат предыдущего вычитания не устанавливает флаг переноса, C=0);

.include «m8def.inc»

.macro Delay;процедура задержки
ldi Razr1, @0;старший бит задержки
ldi Razr0, @1;младший байт задержки
R_sub:
subi Razr0,1
sbci Razr1,0
brcc R_sub
.endm

.def temp = r16; рабочая переменная
.def Razr0 = r17; разряды задержки
.def Razr1 = r18

.CSEG ; начало сегмента кода
.ORG 0x0000 ; начальное значение для адресации

; — инициализация стека —
LDI R16, Low(RAMEND) ; младший байт конечного адреса ОЗУ в R16
OUT SPL, R16 ; установка младшего байта указателя стека
LDI R16, High(RAMEND) ; старший байт конечного адреса ОЗУ в R16
OUT SPH, R16 ; установка старшего байта указателя стека

; — устанавливаем пины PD0 и PD1 порта PORTD (PD) на вывод, остальные на вход.
ldi temp, 0b00000011 ; поместим в регистр R16 число 3 (0x3)
out DDRD, temp ; загрузим значение из регистра R16 в порт DDRD
ldi temp, 0b00000100 ; подтягивающий резистор
out PORTD, temp; подтягивающий резистор
Pincykle: ;цикл отслеживающий кнопку
sbi PORTD, PORTD1 ; подача на пин PD1 высокого уровня
cbi PORTD, PORTD0 ; подача на пин PD0 низкого уровня
sbis PinD, 2 ;пропустить, если нажата
rjmp Pincykle ; вернуться если не нажата

push_pin: ;кнопка нажата
Delay 0, $19; задержка 100мкс N= $0019
sbic PinD,2 ; пропустить если осталась нажата
rjmp Pincykle; вернуться обратно к отслеживанию
sbi PORTD, PORTD0 ; подача на пин PD0 высокого уровня
cbi PORTD, PORTD1 ; подача на пин PD1 низкого уровня
rjmp push_pin ;