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

324 Микроконтроллеры AVR от азов программирования... ♦ функция формирования задержки (строки 27 — 33); ♦ главная функция программы (строки 34 — 67). Рассмотрение программы удобно начинать с главной функции main. Функция main начинается с описания локальных переменных (строки 35 — 37). Кроме переменной cods, предназначенной для временного хра ­ нения кода состояния клавиатуры, здесь определяются еще две вспомо ­ гательные переменные с именами i и ii. После описания переменных начинается блок инициализации (строки 38 — 46). Блок инициализации данной программы по выполняемым действиям полностью повторяет аналогичный блок в программе на Ассемблере. Эти действия сводятся к настройке портов ввода-вывода, таймера и ком ­ паратора. При настройке таймера не только выбирается его режим работы, но и обнуляется значение счетного регистра TCNT1 (строка 44), а в регистр совпадения OCR1A записывается код задержки kzad (строка 45). Основной цикл программы занимает строки 47 — 67. Рассмотрим подробнее его работу. В строке 48 находится цикл ожидания отпуска ­ ния кнопок. Он представляет собой пустой цикл while. Тело цикла пол ­ ностью отсутствует. За ненадобностью не поставлены даже фигурные скобки. Весь цикл состоит лишь из оператора while и выражения в кру ­ глых скобках, определяющего условие продолжения этого цикла. Условие простое: цикл выполняется все время, пока код состояния клавиатуры и константа klfree не равны между собой. Значение кон ­ станты равно коду состояния клавиатуры при всех отпущенных кноп ­ ках. Для определения кода состояния клавиатуры используется функ ­ ция incod (). Функция incod () выполняет те же самые действия, что одноименная процедура из программы на Ассемблере. То есть считывает состояние портов, накладывает маски и применяет при этом антидре- безговый алгоритм. Подробнее работу функции мы рассмотрим в конце этого раздела. Как только все кнопки будут отпущены, цикл в строке 48 заверша ­ ется, и программа переходит к строке 49, в которой находится цикл ожи ­ дания нажатия любой кнопки. Этот цикл очень похож на предыдущий. Изменилось только условие. Знак ! = (не равно) заменен на == (равно). Как только будет нажата любая кнопка, цикл в строке 49 заканчивается, и управление переходит к строке 50. Теперь пора начинать цикл ввода ключевой кодовой комбинации. Но сначала нужно обнулить переменную ii, которая будет использоваться как счетчик принятых кодов и указатель текущего элемента в буфере buf г. Обнуление выполняется в строке 50. Цикл ввода кодовой комби ­ нации занимает строки 51 — 58. Начинается цикл с глобального запрета всех прерываний (строка 51). Затем формируется защитная пауза. Для формирования паузы используется функция wait ().

RkJQdWJsaXNoZXIy MTExODQxMg==