Вставьте коды программы в базовую, выполните ее компиляцию и проверьте работу в пошаговом режиме, наблюдая за изменением содержимого регистров.
В МК 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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.