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

314 Микроконтроллеры AVR от азов программирования... Теперь перейдем к основной части программы. Как уже говорилось, она занимает строки 62 — 119. И первое, что выполняет основная про ­ грамма, — цикл ожидания отпускания кнопок. В цикле используется описанная выше подпрограмма incod. Она будет не только считывать код состояния клавиатуры, но и сразу же производить его сравнение. Если вы не забыли, код состояния клавиатуры при полностью отпу ­ щенных кнопках равен 0x7F, 0x07. В строках 62,63 этот код записывается во вспомогательный буфер codL+codH. Цикл ожидания отпускания кно ­ пок расположен в строках 64, 65. В строке 64 вызывается подпрограмма incod. Она определяет код состояния клавиатуры и сравнивает получен ­ ный код с числом, записанным в буфере codL+codH. Если код состояния клавиатуры равен коду в буфере, то после выхода из подпрограммы флаг Z будет установлен. В противном случае — сбро ­ шен. Равенство кодов означает, что кнопки отпущены. Поэтому оператор условного перехода в строке 65 проверяет значение флага Z. Пока коды разные, управление передается по метке т0, и цикл ожидания продолжа ­ ется. Как только коды окажутся равными, цикл прерывается, и управле ­ ние переходит к строке 66. В строке 66 начинается цикл ожидания нажатия кнопки. Цикл зани ­ мает строки 66, 67 и выглядит почти так же, как цикл ожидания отпу ­ скания. Различие состоит в операторе условного перехода. Вместо Ьгпе (переход по условию «не равно») применяется оператор breq (переход по условию «равно»). В буфере codL+codH по-прежнему находится код состояния клавиа ­ туры при полностью отпущенных кнопках. Поэтому выход из данного цикла произойдет тогда, когда будет нажата любая из кнопок (S1 — S10). Как только нажатие будет обнаружено, программа переходит в следу ­ ющую стадию. Полученный код состояния клавиатуры должен стать пер ­ вым кодом ключевой комбинации. Но прежде чем начинать цикл ввода этой комбинации, программа выполняет две очень важные операции. В строках 68,69 в регистровую пару Z записывается адрес начала буфера в ОЗУ, куда будет помещаться вводимая комбинация. Регистр Z будет хра ­ нить текущий указатель этого буфера. Вторая важная операция производится в строке 70. Тут обнуляется счетчик байтов, записанных в буфер. После этого начинается цикл ввода кодовой комбинации. Цикл занимает строки 71 — 88. Начинается работа цикла с формирования защитной задержки. Почему начинается с задержки, если мы только что получили первое нажатие кнопки? А согласно алгоритму, после нажатия положено формировать задержку. Для формирования защитной задержки используется подпрограмма wait, работающая в режиме 1. Сначала в строке 72 в регистр data записывается номер режима. Затем в строке 73 вызывается подпрограмма wait.

RkJQdWJsaXNoZXIy MTExODQxMg==