Выбрать главу

... ...; Следующая проверка

В результате операции логическое И между содержимым регистра h’06’ и константой h’11000000’ младшие 6 битов сбрасываются. Результат будет равен нулю, если оба бита 6 и 7 порта В были сброшены перед выполнением команды. При этом будет установлен флаг Z, в результате чего программа перейдет к команде, помеченной меткой FAST_WASH. Не забудьте, что для проверки нулевого значения одного бита регистра данных можно использовать команду btfsc.

∙ andlw

Эта команда выполняет операцию побитового И между содержимым рабочего регистра и однобайтной константой. Например:

В результате операции, показанной на рисунке, старший полубайт содержимого W обнуляется, а младший — остается неизменным.

Операция ИЛИ

Из Рис. 1.3 (стр. 28) можно увидеть следующие соотношения:

• Логическое ИЛИ любого бита с 0 всегда дает в результате исходный бит.

• Логическое ИЛИ любого бита с 1 всегда дает в результате 1.

Используя эти свойства, мы можем устанавливать группы битов в байте данных, выполняя логическое сложение с соответствующей битовой маской.

∙ iorwf

По аналогии с командой andwf, эта команда выполняет операцию побитового ИЛИ между любым регистром данных и содержимым рабочего регистра W. Так, при логическом сложении каждого бита W с соответствующим битом регистра h’26’ и помещении результата обратно в h’26’ имеем

Например, для установки в 1 старших семи битов регистра данных h’36’ мы можем написать:

movlw b’11111110’; Маска

iorwf h’36’,f; Устанавливаем старшие 7 битов, младший бит не изменяется

∙ iorlw

Эта команда выполняет операцию побитового ИЛИ содержимого W с однобайтной константой. Например, для установки младших двух битов рабочего регистра в 1:

Операция Исключающее ИЛИ

Из Рис. 1.4 на стр. 28 можно увидеть следующее:

• В результате операции Исключающее ИЛИ между битом и нулем возвращается исходный бит.

• В результате операции Исключающее ИЛИ между битом и 1 возвращается инвертированное значение исходного бита.

Другим полезным свойством оператора XOR является его использование в качестве логического дифференциатора. При более внимательном рассмотрении таблицы истинности можно заметить, что на выходе элемента Исключающее ИЛИ будет 1, если на его входах присутствуют различные логические уровни, и 0, если эти уровни одинаковы. Соответственно, в результате побитовой операции Исключающее ИЛИ между двумя байтами мы получим байт с 0 в тех позициях, где биты входных переменных были одинаковыми, и с 1 в тех позициях, где они были различными.

∙ xorwf

Эта команда выполняет побитовую операцию Исключающее ИЛИ между любым регистром данных и содержимым рабочего регистра W. Так, при выполнении операции Исключающее ИЛИ между каждым битом W и соответствующим битом регистра h’26’ и записи результата обратно в h’26’ имеем

Например, для переключения состояния старшего бита регистра h’36’ мы можем написать:

movlw Ь'10000000’; Маска

xorwf h'36',f; Переключаем только старший бит регистра

В качестве примера продемонстрируем использование операции Исключающее ИЛИ для определения отличий между двумя группами битов. Рассмотрим процедуру, непрерывно опрашивающую состояние порта В микроконтроллера, к которому подключены восемь переключателей с передней панели стиральной машины. Процедура ожидает изменения состояния переключателей:

START

         movf PORTB,w; Считываем начальное состояние переключателей

         movwf h’20’; Сохраняем его в регистре h’20’

S_LOOP

          movf PORTB,w; Считываем текущее состояние переключателей

          xorwf h’20’,w; Ищем отличия от исходного состояния

          btfsc STATUS,Z; Пропускаем, если результат проверки не равен нулю

              goto S_LOOP; ИНАЧЕ проверяем снова

При этом возможны два варианта:

Результат, получаемый в рабочем регистре, отражает любые изменения состояния передней панели. В первом случае между исходным состоянием переключателей, сохраненным в регистре h’20’, и текущим нет никаких отличий. Во втором случае 4-й переключатель был переключен из 1 в 0. Чтобы определить, какой именно бит изменился, можно сдвигать результат вправо с подсчетом количества сдвигов до тех пор, пока оставшееся значение не будет равно 0 (см. Рис. 5.14). А характер изменения (0 —> 1 или 1 —> 0) можно определить посредством логического умножения итогового байта на байт исходного состояния переключателей, находящийся в регистре h’20’, т. е. с помощью команды andwf h’20’,w. Если 4-й бит результата равен нулю, то исходное значение тоже было равным 0 и, соответственно, состояние бита изменилось с 0 на 1 и наоборот.

полную версию книги