Скачиваний:
30
Добавлен:
03.06.2014
Размер:
7.32 Mб
Скачать

6.7.Организация Портов Ввода

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

Например, следующая операция читает текущее значение Порта 1 и сохраняет значение в ячейке памяти, помеченной P1TEMP:

LDB P1TEMP, ioport1 ; Читать P1 и запомнить в P1TEMP

Некоторые контакты Порта 2 сконфигурированы только для вывода и не содержат никакой схемы для ввода. После чтения порта, каждый бит SFR, отражающий состояние контакта “только для вывода”, должен быть замаскирован до использования этого регистра.

При использовании контакта квази - двунаправленного порта для ввода, сначала необходимо гарантировать отключение сильного низкого драйвера. Этому способствует запись единицы в требуемый контакт порта. Например, код, показанный ниже, конфигурирует использование для ввода младшей половины Порта 1.

LDB IOPORT1,#00001111B ;Записать 1 во входные кон- ;такты Порта 1

6.7.1. Порт 0

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

Адрес 0EH

Только чтение из окна Hwindow0

Порт 0 - порт только для ввода. Контакты Порта 0 отличаются тем,что они могут быть использованы и как цифровые входы(Input Pin P0.x) и как аналоговые входы для АЦП(Analog Channel;ACHx) одновременно(но это не рекомендуется).

Контакт P0.7 может быть также сконфигурирован как вход внешнего прерывания.

В любом случае, если Порт 0 должен использоваться как аналоговый или цифровой вход, необходимо обеспечить напряжение на этом порту через VREF и ANGND контакты.

Aналого-Цифровой Преобразователь чувствителен к шуму, а одним из источников возникновения шума в преобразователе, является чтение Порта 0, поэтому строго рекомендуется не производить чтение из порта, пока не закончится операция А/Ц преобразования.

Порт 0 был разработан так, что защелка выборки не синхронизируется(нет сигнала CLK), если не выполняется чтение порта.

6.8. Организация Портов Вывода

Запись в порт ввода-вывода устанавливает или очищает соответствующую защелку порта. Выход защелки порта затем используется драйвером вывода. Операция записи воздействует на контакты “только для вывода” или на двунаправленные

( квази - двунаправленные или с открытым стоком ) контакты. Запись в контакты “только для ввода” не выполняет никакой операции ( то есть, никакая защелка не устанавливается и не сбрасывается ).

Существует несколько способов записи в порт ввода-вывода. Порт может быть записан непосредственно, используя следующие команды:

; Установить биты 0 и 7, очистить биты 1-6

LDB ioport1,#10000001B

; Или

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 операция содержит единицы для любых двунаправленных контактов, используемых для ввода.

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

Соседние файлы в папке lab96