Однокристальные PIC-микроконтроллеры. Технология разработки и отладки программ для микроконтроллеров PIC16, страница 9

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

В МК PIC16F84A имеется команда, выполняющая логическую операцию НЕ (инвертирование):

comf   f, d   ; инвертирование регистра f

Эта команда поразрядно инвертирует содержимое любого заданного регистра. При  d = 0 результат заносится в рабочий регистр W, а при  d = 1 результат заносится в регистр f. При получении нулевого результата устанавливается флаг Z = 1.

Задание 1. Запишите в базовую программу коды примера:

movlw   b’01010101’  ; загрузить в регистр W двоичное число 55h

movwf   Temp1           ; переслать содержимое W в регистр Temp1

comf   Temp1, W        ; инвертировать регистр Temp1, результат – в

; регистре W

comf   Temp1, F          ; инвертировать регистр Temp1, результат – в

; регистре Temp1

Выполните компиляцию программы и проверьте ее работу в пошаговом режиме. Наблюдайте за изменением содержимого регистров Temp1 и W при выполнении команд инвертирования. Объясните полученные результаты.

Задание 3 для самостоятельной работы. Разработайте программу, которая записывает в регистр Temp1 число  b’01010101’, а затем преобразует его в дополнительный код. Результат надо сохранить в регистре Temp1.

Примечание. Дополнительный код беззнакового числа – это его обратный код плюс единица. Обратный код числа – это поразрядная инверсия всех его разрядов.

Вставьте полученную программу в базовую и выполните ее компиляцию. Проверьте работу программы в пошаговом режиме.

К логическим командам относится также команда свопинга регистра

swapf  f, d

Эта команда меняет местами тетрады (полубайты) в любом регистре. Как и для других команд, при  d = 0 результат  записывается в рабочий регистр W, а при  d = 1 – остается в регистре. Данная команда не влияет на флаги регистра состояния STATUS. Команду swapf  f, d  можно применять, в частности для хранения двух десятичных цифр в одном регистре, переставляя их в зависимости от того, какую из них надо использовать в данный момент.

Вот простой пример использования этой команды:

movlw  b’00001111’   ; загрузить число  0Fh  регистр W

movwf  PORTB           ; вывести содержимое регистра W в порт В

swapf  PORTB, W       ; поменять тетрады в регистре PORTB,

; результат – в регистре W

swapf  PORTB, F         ; поменять тетрады в регистре PORTB,

; результат – в регистре PORTB

Задание 2. Занесите пример в базовую программу, выполните ее компиляцию и проверьте работу в пошаговом режиме, наблюдая за изменением содержимого регистров W, PORTB, STATUS. Объясните полученные результаты.              

3.10.   Команды  сдвига

В системе команд PIC16 имеется две команды сдвига:

rrf  f, d    ; сдвиг вправо через бит переноса (флаг) C

; содержимого любого регистра

rlf  f, d   ;  сдвиг влево через бит переноса  C содержимого регистра

Как и для других команд, при  d = 0  результат сдвига записывается в регистр  W, а при  d = 1 остается в заданном регистре. Команды сдвига используются для выполнения операций умножения и деления, для последовательной передачи данных и других целей.

Пример применения сдвига вправо:

clrf   STATUS          ; очистить регистр STATUS

movlw   0xFF           ; загрузить число FFh  в регистр W

mowf   PORTB        ; переслать содержимое регистра W в PORTB

rrf   PORTB, F         ; cдвинуть содержимое  PORTB  вправо

rrf  PORTB, F          ; сдвинуть содержимое  PORTB  вправо

rrf  PORTB, F          ; сдвинуть содержимое  PORTB  вправо

Задание 1. Занесите коды примера в базовую программу, выполните ее компилирование и проверьте работу в пошаговом режиме. Выполните проверку сдвигов содержимого регистра  PORTB «вручную» и сравните результаты.

Теперь произведем сдвиг влево:

clrf   STATUS         ; очистить регистр  STATUS