Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств
Шаг 5. Переходим непосредственно к разработке устройств и программ 327 находится в EEPROM, а второй (buf е) расположен в ОЗУ При первом же несовпадении кодов оператор безусловного перехода передает управление по метке ml. В этом случае цикл проверки досрочно прерывается, и замок не открывается. Если в процессе работы цикла проверки все коды оказа лись одинаковыми, то цикл завершается нормальным образом, и управле ние переходит к строке 65. То есть к процедуре открывания замка. Процедура открывания замка очень проста. Она занимает строки 65 — 67. В строке 65 подается команда, открывающая механизм замка (в четвертый разряд порта РВ записывается единица). Затем вызывается задержка третьего типа (строка 66). По окончании задержки открываю щий сигнал снимается (строка 67). С окончанием процедуры открывания замка заканчивается тело основного цикла программы. Так как основной цикл бесконечный, то управление передается на его начало. То есть на строку 48. Работа программы начинается сначала. Теперь вернемся к вспомогательным функциям программы, которые мы пропустили в начале этого описания. Начнем по порядку. В строках 12, 13 и 14, 15 размещены две разные по названию, но одинаковые по содержанию функции. Первая из них является процедурой обработки прерывания по переполнению таймера/счетчикаі. А вторая — процеду рой обработки прерывания по совпадению в канале А того же таймера. В программе на Ассемблере оба вида прерываний вызывали одну и ту же общую процедуру. Данная версия языка СИ не позволяет использо вать одну и ту же функцию в качестве процедуры обработки двух разных видов прерываний. В теле каждой из функций имеется всего одна строка. В этой строке присваивается единица переменной f 1 z. То же самое делает процедура обработки прерывания в программе на Ассемблере. Строки 16 — 26 занимает функция ввода состояния клавиатуры. Алгоритм работы этой функции немного отличается от алгоритма работы аналогичной процедуры на Ассемблере. Функция incod () в про грамме на языке СИ производит лишь считывание содержимого портов, наложение маски и антидребезговый алгоритм. Операция сравнения в теле данной функции не выполняется. Так как функция incod () должна возвращать код состояния клавиатуры, тип возвращаемого значения определен как unsigned int (см. строку 16). Функция не имеет параметров, на что указывает слово void. Рассмотрим подробнее, как работает функция incod (). В строках 17 — 19 производится описание локальных переменных. Переменные codO и codl используются для хранения промежуточных значений кода состояния клавиатуры. Причем переменная codl используется для хра нения нового значения кода, а переменная codO — для хранения старого значения (не путайте с буфером cods основной программы). При описа нии переменной codO (строка 17) одновременно производится ее ини
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==