Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств

210 Микроконтроллеры AVR от азов программирования... 17 main . in temp, PIND ; Читаем содержимое порта PD 18 sbrc temp, 0 ; Проверка младшего разряда 19 20 SSfi main wait , Если не ноль, переходим в начало , Вызов подпрограммы задержки --- Переключение светодиода 21 in temp, PINB , Читаем содержимое порта РВ 22 sbrc temp, 0 , Проверка младшего разряда 23 nmp ml 24 SDl PORTB, 0 , Установка выход РВО в единицу 25 rimp m2 26 ml . CD1 PORTB, 0 , Сброс РВО в ноль I I М 1/ П DWMflQLJMQ АТП\/Р I/O U МО І/иЛПі/І/І ------ ЦкІІхЛ U /КиЩапиІЛ V 1 1 іуиіхсіпкіл IxnUlllxKl 27 m2 in temp, PIND ; Читаем содержимое порта PD 28 sbrs temp, 0 ; Проверка младшего разряда 29 rjmp m2 , Продолжить ожидание отпускания кнопки 30 rcall wait ; Вызов подпрограммы задержки 31 rjmp main ; К началу цикла - --------- — Подпрограмма задержки 32 wait: push loop , Сохраняем содержимое регистра loop 33 Idi loop, 200 , Помещаем в loop константу задержки wt 1. loop , Цикл задержки 34 dec ; Уменьшаем значение регистра loop 35 brne Wt1 , Если не ноль, продолжаем цикл 36 pop loop ; Восстанавливаем значение регистра loop 37 ret , Выход из подпрограммы Описание программы (листинг 5.5) Новый вариант программы является полной копией старой (см. листинг 5.3), в которую добавлены новые элементы, обеспечивающие антидребезговую задержку. Так как задержка нужна в двух разных местах программы, она оформлена в виде подпрограммы. Для форми ­ рования задержки используется один дополнительный регистр общего назначения. Поэтому в начале нашей новой программы (строка 4) добавлена команда описания регистра. Регистру г 17 и присваивается имя loop. По-английски слово loop означает цикл. Таким именем принято назы ­ вать переменные, применяемые для организации циклов. Не удивляй ­ тесь, что я употребил тут термин «переменная». В языке Ассемблер тоже используется понятие «переменные». Так наш регистр loop можно счи ­ тать переменной с именем loop. Запись значения в этот регистр эквивалентна присвоению значения переменной. Также можно интерпретировать и другие операции с реги ­ стром. Сложение содержимого двух регистров можно считать сложением переменных, вычитание — вычитанием, и так далее. Подпрограмма задержки расположена в строках 32 — 37. Первой строке подпрограммы присвоена метка wait. Именно по этой метке и будет вызываться подпрограмма. Опустим пока назначение команд hush и pop (строки 32 и 36). Собственно процедура задержки расположена в стро ­ ках 33 — 35. Формирование задержки производится путем многократного

RkJQdWJsaXNoZXIy MTExODQxMg==