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

308 Микроконтроллеры AVR от азов программирования... пару X и две вспомогательные регистровые пары: codH, codL (описаны в строках 10,11) и drebH, drebL (описаны в строках 3,4). Главная задача данной процедуры — получить код состояния клавиа ­ туры, используя алгоритм многократного считывания для борьбы с анти ­ дребезгом. Кроме того, процедура выполняет еще одну, вспомогательную функцию. Она сравнивает полученный описанным выше способом код состояния клавиатуры с другим кодом, который хранится в паре реги ­ стров codH — codL. Такое сравнение используется в основной программе для оценки значения кода состояния. Таким образом, процедура incod по окончании своей работы возвра ­ щает два разных значения. Во-первых, код состояния клавиатуры (в реги ­ стровой паре X), а, во-вторых, результат сравнения кода с контрольным значением (используя флаг нулевого результата Z). Рассмотрим работу процедуры подробнее. Подпрограмма исполь ­ зует традиционное сохранение и восстановление содержимого реги ­ стров в стеке. На этот раз сохранению подлежит всего один регистр — регистр count. В строке 120 его значение сохраняется, а в строке 139 — восстанавливается. Основной же текст подпрограммы состоит из двух частей: ♦ в первой части (строки 121 — 133) реализуется алгоритм ввода кода и борьбы с антидребезгом; ♦ во второй части (строки 134 — 138) производится сравнение полу ­ ченного кода с числом в буфере codH-codL. Начнем с процедуры ввода кода и борьбы с антидребезгом. Эта про ­ цедура представляет собой бесконечный цикл, который при каждом про ­ ходе производит формирование кода состояния клавиатуры и при этом подсчитывает, сколько раз подряд полученный код будет иметь оди ­ наковое значение. Для подсчета используется регистр count. Причем в начале в count записывается константа kandr, и каждый раз, когда новый код равен предыдущему, содержимое count уменьшается на еди ­ ницу (используется обратный счет). Если при очередном проходе код состояния изменит свое значение, то в регистр count снова записывается константа kandr, и подсчет начи ­ нается сначала. Заканчивается цикл считывания кодов лишь тогда, когда значение count достигнет нуля. Новое значение кода состояния клавиа ­ туры формируется в регистровой паре X. Для того, чтобы новое значение можно было сравнивать со старым, старое записывается в буфер drebH — drebL. Теперь текст описанной выше программы рассмотрим по порядку. Все начинается с подготовки регистровой пары X к принятию нового зна ­ чения кода. В строках 121,122 содержимое X обнуляется. Бесконечный цикл многократного считывания занимает строки 123 — 135.

RkJQdWJsaXNoZXIy MTExODQxMg==