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

           bsf DISPLAY.LAMP; ИНАЧЕ включаем лампочку

NEXT:

... ...;

Рис. 5.12. Операции сравнения в системе контроля уровня топлива

После каждого вычитания флаг переноса будет равен 1 (т. е. нет заема), если число в рабочем регистре (количество топлива) больше или равно значению константы, с которым оно сравнивается посредством вычитания. Обратите внимание на использование команды bsf для установки соответствующих битов порта А (предполагается, что эти линии уже сконфигурированы как выходы). Точно так же команда bcf используется для выключения светового сигнала и звукового излучателя в самом начале процедуры.

К операциям сравнения можно отнести и операцию проверки, во время которой байт данных проверяется на равенство нулю. Мы уже видели (см. стр. 67), что содержимое любого регистра данных можно проверить на нулевое значение простым копированием его в себя самого, например movf h’36’,f. Если в регистре находится нулевое значение, то флаг Z установится в 1[85]. Аналогичная проверка рабочего регистра может быть выполнена прибавлением к нему нуля, т. е. addlw 0. Эта команда установит флаг Z при нулевом значении в рабочем регистре, не изменяя его содержимого.

Команды логических операций и операций сдвига

Микроконтроллеры PIC могут выполнять все четыре базовые логические операции — НЕ, И, ИЛИ и Исключающее ИЛИ, как показано в Табл. 5.3.

Операция НЕ

Логическая функция НЕ, показанная на Рис. 1.1 (стр. 26), инвертирует (формирует обратный код) логическое состояние входа.

∙ comf

С помошью этой команды можно инвертировать содержимое любого заданного регистра данных. Так, команда comf h’26’,f вычисляет обратный код содержимого регистра h’26’:

Как обычно, результат может быть помещен либо в исходный регистр данных, либо в W (в последнем случае исходное содержимое остается неизменным), например:

В микроконтроллерах PIC отсутствует команда типа comw для инвертирования содержимого рабочего регистра, однако эту операцию можно выполнить за один машинный цикл посредством вычитания W из числа b’11111111’, что дает в результате тот самый обратный код, т. е. sublw h’FF’. Например (см. также стр. 147):

Операция И

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

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

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

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

Операция И между байтом данных и тестовым шаблоном, используемая для сброса всех ненужных битов, может также применяться для проверки на ноль заданной группы битов. Если эти биты равны нулю, то общий результат тоже будет равен нулю, и флаг Z установится в 1.

∙ andwf

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

К примеру, если нам нужно сбросить шесть старших битов регистра h’26’, то мы можем написать следующее:

movlw b’00000011’; Маска

andwf h’26’,f; Логически умножается на содержимое регистра h’26’

Эту же операцию можно было бы выполнить, повторив шесть раз команду bcf.

Чтобы разобраться, как можно использовать функцию И для проверки на ноль группы битов, представим себе контроллер стиральной машины, который считывает состояние восьми переключателей передней панели через порт В, т. е. через регистр h’06’. Нам нужно, чтобы при нулевом значении битов 7 и 6 (одновременно нажаты кнопки «СТАРТ» и «БЫСТРО») включалась программа быстрой стирки. Вот как можно это сделать:

movlw b’11000000’; Маска

andwf h’06’,w; Операция И с регистром PORTB

btfss STATUS,Z; Пропуск, если Z == 0 (т. е. результат не равен 0)

   goto FAST_WASH; ИНАЧЕ перейти к процедуре FAST_WASH

вернуться

85

Во многих микропроцессорах/микроконтроллерах (например, PIC18XXXX) имеется специальная команда проверки на ноль.