Белов, А.В. Микроконтроллеры 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.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==