Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

Глава б. Основы программирования МКАVR . macro Delay ; процедура задержки ldi Razrl , @ 0 ; старший байт задержки ldi RаzrО , @ l ;мла.цший байт задержки R suЬ : suЬi Raz r0 , 1 sbci Razrl , O brcc R suЬ . endm . def temp = rl б ; рабочая переменная . def RazrO = r1 7 ; разряды задержки . def Razrl = r 1 8 . def Counter = r20 ; счетчик . org О ; необязательно , просто для ориентировки ; ============ Программ а ============ ldi temp, ObO O O O O l O O ; для второго разряда порта D out PORTD , temp ; подтягивающий резистор на всякий случай ldi temp , OЫl l l l l l l ; порт С все контакты на выход out DDRC , temp clr Counter ; очищаем счетчик Pincykle : ; цикл отслеживания кнопки sЬis PinD , 2 ; пропустить , если не нажата rjmp push_pin rjmp Pincykle ; вернуться обратно , если не нажата push_pin : ; кнопка нажата Delay 0 , $ 1 9 ; задержка 1 0 0 мкс с, N = $ 0 0 1 9 sЬic PinD , 2 ; пропустить , если по-прежнему нажата rjmp Pincykle ; вернуть ся обратно к отслеживанию inc Counter ; точно нажата - увеличиваем счетчик out PORTC , Counter ; выводим счетчик в порт В Delay $СЗ , $ 5 0 ; задержка 0 , 2 с , N = $С350 = 50000 Delay $СЗ , $ 5 0 ; задержка 0 , 2 с , N = $С350 = 50000 r jmp Pincykle ; вернуть ся обратно к отслеживанию 153 Как видите, программа небольшая- в памяти она займет 56 байтов. Здесь сначала дважды с паузой в 1 00 мкс кнопка проверяется на состояние нажатия (на PinD , 2 д ем ол жен быть тогда логичес15ий ноль). Если оба состояния совпадают, то увеличива­ счетчик, выводим его в порт со светодиодами и, сделав длинную паузу, возвра­ щаемся к отслеживанию кнопки. Здесь пришлось ввести две задержки по 0,2 с - это было сделано по результатам практических испытаний, т. к. 0,2 секунды слиш­ ком мало, чтобы успеть снять палец с кнопки, и скажется эффект многократного повтора, который мы тут пытались обойти. Можно избежать двукратного повторе­ ния кода задержки, если добавить еще один регистр. ПОДРОБНОСТИ Разумеется , значения старшего и младшего байта можно не высчитывать вручную - компилятор сделает все за вас, если вы оформите вызов задержки вот так: Delay high ( 50000 ) , low ( 50000 ) ; задержка 0 , 2 с, N = 50000

RkJQdWJsaXNoZXIy MTExODQxMg==