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

Шаг 5. Переходим непосредственно к разработке устройств и программ 329 значаются разряды, значение кото- рых не определено. Разряды, значе ­ ние которых зависит от той либо иной кнопки клавиатуры, обо ­ значается названием этой кнопки. Остальные разряды равны либо «О», либо «1». Итак, в результате выполнения описанных выше операций пере ­ менная codl содержит новое зна ­ чение кода состояния клавиатуры. В строке 23 этот код сравнивается со старым значением, которое хранится в переменной codO. Если коды не равны, то выполня ­ ются команды перезапуска цикла (строки 24, 25). В строке 24 пере ­ менной к (параметру цикла) при ­ сваивается нулевое значение. В строке 25 значение переменной codl записывается в переменную codO. Теперь новое, только что полученное значение кода стано ­ вится старым. Рис. 5.18. Формирование кода состояния клавиатуры В строках 27 — 33 расположена функция формирования задержки. Алгоритм работы и этой функции повторяет алгоритм работы аналогич ­ ной процедуры на Ассемблере. Функция не возвращает никаких значе ­ ний, но зато имеет входной параметр: код вида задержки. Как и процедура на Ассемблере, функция wait () формирует три вида задержки. Параметр, определяющий номер задержки, имеет имя kodz и тип unsigned char. Работа функции начинается с определения значе ­ ния маски прерываний. Для этого в строках 28,29 оценивается значение переменной kodz. Если значение kodz равно 1, то в регистр маски пре ­ рываний TIMSK записывается код 0x40. Этот код разрешает прерывание по совпадению в канале А. Если kodz не равен единице, то регистру TIMSK присваивается зна ­ чение 0x80 (прерывание по переполнению). Таким образом, в режиме 1 будет работать прерывание по совпадению в канале А. При этом фор ­ мируется задержка длительностью 48 мс. В остальных режимах (2, 3) используется прерывание по переполнению таймера. В этом случае фор ­ мируется задержка длительностью в одну секунду.

RkJQdWJsaXNoZXIy MTExODQxMg==