Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств
224 Микроконтроллеры AVR от азов программирования... В строке 20 начинается основной цикл программы. И начинается он с чтения содержимого порта PD. Результат помещается в регистр temp. В строке 21 происходит оценка младшего разряда прочитанного числа. Если этот разряд равен единице, то оператор безусловного перехода в строке 22 пропускается, и программа переходит к выполнению проце дуры сдвига вправо (начало процедуры — строка 23). Если младший раз ряд считанного из PD числа равен нулю, то оператор г jmp в строке 22 передает управление по метке m3, и программа переходит к процедуре сдвига влево (начало процедуры — строка 31). Процедура «сдвиг вправо» работает следующим образом. В строке 23 рабочему регистру rab присваивается начальное значение. Для нагляд ности это число записано в двоичном формате. Затем начинается цикл сдвига (строки 24 — 30). Первой операцией цикла сдвига, в соответствии с алгоритмом, должна быть операция вывода содержимого регистра rab в порт РВ. Однако существует одно небольшое препятствие. Если просто вывести содержимое rab в порт РВ, то мы получим кар тину, обратную той, которая нам необходима. Все светодиоды, кроме одного, будут светиться. Это произойдет потому, что ноль на выходе порта зажигает светодиод, а единица тушит. Если мы хотим получить бегущий огонь, а не бегущую тень, нам нужно проинвертировать содер жимое регистра rab перед тем, как вывести в порт РВ. Для инвертирования содержимого регистра rab воспользуемся командой еог («Исключающее ИЛИ»). Операция «Исключающее ИЛИ» обладает способностью инвертирования чисел. Если вы вернетесь назад и посмотрите на таблицу истинности операции «Исключающее ИЛИ» (рис. 5.8), то вы можете заметить эту особенность. Правило. Для всех строк таблицы истинности справедливо правило: если один из операндов равен единице, то результат операции равен инверс ному значению второго операнда. Поэтому, если произвести операцию «Исключающее ИЛИ» между двумя байтами, значение одного из которых будет равно OxFF, то в резуль тате этой операции мы получим инверсное значение второго байта. Для выполнения такой операции используется вспомогательный регистр temp. В строке 24 в регистр temp записывается число OxFF. В строке 25 производится операция «Исключающее ИЛИ» между содержимым реги стров temp и rab. Результат этой операции помещается в temp, так как именно он явля ется первым параметром данной команды. Содержимое регистра rab при этом не изменяется. В строке 26 содержимое регистра temp выво дится в порт РВ.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==