Организация портов вывода

Запись в порт ввода/вывода устанавливает или очищает соответствующий регистр-защелку порта. Выход регистра-защелки порта затем используется драйвером разряда. Операция записи воздействует на разряды "только для вывода" или на двунаправленные (квазидвунаправленные или с открытым стоком) разряды. Запись в разряды "только для ввода" не выполняет никакой операции (то есть никакая регистр-защелка не устанавливается и не сбрасывается). Существует несколько способов записи в порт ввода/вывода. Порт может быть записан непосредственно с использованием следующих команд:

LDB ioport1, #10000001B; Установить биты 0 и 7, очистить биты 1-6

Или

LDB intrega, #81H ; Значение, которое нужно записать
STB intrega, ioport1 ; Вывод значения в порт

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

Более часто должен устанавливаться, очищаться или переключаться только один разряд. Для того, чтобы выполнить однобитовые операции, выполняется операция "чтение-модификация-запись" (read-modify-write) следующим образом:

LDB AL, ioport1 ; Читать текущее значение порта
ORB AL, #10000001B ; Установить биты 0,7 без воздействия на биты 1-6
LDB ioport1, AL ; Записать новое значение порта

Такая же операция может быть выполнена одной командой:

ORB ioport1, #10000001B ; Читает ioport1, изменяет его и записывает ioport1 обратно

Следующая операция может быть использована для дополнения значения разряда порта:

XORB ioport1, #1000000B ; Дополнение P1.7

Во всех описанных операциях значение порта читается, изменяется и затем записывается обратно. Однако следует помнить о случаях, в которых выполнение описанных операций "чтение-модификация-запись" приводит к неопределенным ситуациям. Например:
- чтение разрядов порта 2 , предназначенных только для вывода;
- обнуление квазидвунаправленных разрядов порта 1, предназначенных для ввода.

Для решения таких проблем в память копируется содержимое порта и операция (установка, очистка, инвертирование) выполняется на этом образе в памяти, который затем непосредственно записывается в порт.

Например, следующая операция используется для инвертирования P1.7:

XORB P1IMAGE, #10000000B
LDB ioport1, P1IMAGE ; Записать новое значение в порт 1

Существуют другие способы избежать проблемы, например, убедиться, что операция OR содержит единицы для любых двунаправленных разрядов, используемых для ввода. Однако важно помнить, что смешивание входов и выходов на одном порте требует особого внимания при изменении значения разряда.

Порт 1

Аббревиатура - IOPORT1

Размер - 1 байт

Находится по адресу 0FH

Использовать для записи/чтения в окне HWindow 0

Все разряды порта 1 - квазидвунаправленные, пока не выбрана их альтернативная функция. Если разряды порта сконфигурированы как выводы для приема и передачи данных, то их можно читать или записывать. Если выбрана альтернативная функция разрядов, их можно только читать. Альтернативная функция разрядов порта выбирается соответствующим управляющим регистром (см. табл. 4.2). Альтернативные функции рассматриваются в описании периферийных модулей микропроцессора.

Порт 2

Порт 2 содержит разряды "только для ввода", "только для вывода" и квазидвунаправленные. Альтернативная функция разрядов порта выбирается соответствующим управляющим регистром (см. табл. 4.2). Альтернативные функции рассматриваются в описании периферийных модулей микропроцессора.

Аббревиатура - IOPORT2

Размер - 1 байт

Находится по адресу 10H

Использовать для записи/чтения в окне HWindow 0

<<< Содержание >>>