Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств
Шаг 5. Переходим непосредственно к разработке устройств и программ 227 Переменная такого типа имеет длину в один байт. Второй однобайто вый тип (char) в данном случае нам не подходит, так как представляет собой число со знаком. У такого числа старший разряд интерпретируется как знак. И лишь семь младших разрядов используются непосредственно для хранения значений. Строки 1 — 9 составляет модуль инициализации программы. В полном соответствии с алгоритмом модуль инициализации новой программы почти полностью повторяет соответствующий модуль из предыдущего примера. Исключение составляет лишь вновь добавленная строка с опи санием переменной (строка 4). Основной цикл программы занимает строки 10 — 22. Телом цикла является оператор сравнения (конструкция if — else), проверяющий состояние бита, связанного с переключателем. Собственно проверка происходит в строке 11. Здесь младший бит порта PD проверяется на равенство единице. Если он равен единице, то выполняется процедура сдвига вправо (строки 12 — 16). В противном случае выполняется про цедура сдвига влево (строки 18 — 22). Каждая из этих процедур выполняет цикл из восьми сдвигов в нуж ном направлении. Так как вся конструкция if — else находится внутри бесконечного цикла, то она многократно повторяется. То есть после про верки происходит восемь сдвигов в нужном направлении. Затем новая проверка, и так далее. Обе процедуры сдвига построены одинаково. Рассмотрим подробнее процедуру сдвига вправо. В строке 12 переменной rab присваивается начальное значение. Затем начинается цикл сдвига. Цикл организован при помощи оператора while (строка 13). Его тело составляют строки 14 — 16, которые реализуют уже знакомый нам алгоритм. Сначала происходит вывод значения всех разрядов переменной rab в порт РВ. Как и в предыдущем слу чае, выводимое значение нам нужно предварительно проинвертировать. Для инвертирования числа мы снова используем прием, который мы применили в программе на Ассемблере. То есть воспользуемся оператором «Исключающее ИЛИ». Обратимся к строке 14 нашей про граммы. В этой строке регистру PORTB присваивается значение выра жения rab^OxFF. Символ « л » в языке СИ как раз и означает операцию «Исключающее ИЛИ». При помощи единственного выражения мы сразу и инвертируем, и присваиваем. В строке 15 производится сдвиг разрядов. Для сдвига используется оператор «»». Результатом выражения rab » 1 является число, полу ченное путем сдвига всех разрядов переменной rab на одну позицию вправо. Число 1 справа от оператора сдвига означает количество разря дов, на которое нужно сдвинуть число. Таким образом, выражение rab = rab » 1;
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==