Белов, А.В. Микроконтроллеры 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 выво ­ дится в порт РВ.

RkJQdWJsaXNoZXIy MTExODQxMg==