Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств
328 Микроконтроллеры AVR от азов программирования... циализация (присваивается нулевое значение). Этот ноль необходим для правильного начала цикла антидребезга. Для того чтобы при первом сравнении новый код не был равен старому. Еще одна переменная с име нем к используется в качестве параметра цикла антидребезга. Основу функции incod () составляет цикл антидребезга (строки 20 — 25). По сути, тело функции состоит только из этого цикла. Задача цикла — ввести код состояния клавиатуры заданное количество раз (определяется константой kandr). В данном случае используется стан дартный цикл for (см. строку 20). Цикл выполнится полностью (нужное количество раз) в том слу чае, если за время его работы код состояния клавиатуры не изменится. Если в процессе выполнения цикла состояние кнопок изменяется, то специальные команды внутри цикла перезапускают его работу сначала. Вычисление кода состояния производится в строках 21 и 22. Оператор i f (строка 23) сравнивает старое и новое значения кодов. Если эти зна чения не равны, выполняются команды перезапуска цикла (строки 24, 25). По окончании работы цикла антидребезга команда return опреде ляет возвращаемое значение (строка 26). На этом функция завершается. Разберемся с отдельными элементами цикла антидребезга подробнее^ И начнем со строк 21 и 22, где, как уже говорилось, происходит форми рование кода состояния клавиатуры. Суть производимых вычислений наглядно проиллюстрирована на рис. 5.18. Источником информации для этих вычислений является содержимое регистров PINB и PIND, которые, как известно, непосредственно подключены к выводам портов РВ и PD. На содержимое обоих портов накладываются соответствующие маски, а затем все это объединяется в одно шестнадцатиразрядное число и поме щается в регистр codl. Выражение в строке 21 соответствует первому этапу на рис. 5.18. В правой части выражения выполняется операция логического умножения (операция «И») между содержимым порта РВ и маской 0x07. Результат выражения записывается в переменную codl. Выражение в строке 22 объединяет этапы 2 и 3. Правая часть этого выражения представляет собой сумму двух слагаемых. Первое слагае мое представляет собой операцию логического сдвига содержимого пере менной codl на восемь разрядов влево. Этот сдвиг соответствует этапу номер 2 на рисунке. В результате сдвига восемь младших разрядов числа становятся старшими. Второе слагаемое — это еще одна операция логического умножения. На этот раз умножается содержимое порта PD и константа 0х7Ё, представляю щая собой маску для этого порта. Результатом сложения двух этих слагае мых является искомый код состояния клавиатуры, который записывается в переменную codl. Вычисление второго слагаемого и сложение их обоих и соответствует этапу номер 3 на рис. 5.18. Символом «X» на рисунке обо
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==