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