Интерфейсы периферийных устройств. Параллельный интерфейс ввода-вывода. Принципы построения параллельных портов ввода/вывода микроконтроллеров, страница 4

Здесь все то же само, что и в предыдущем пункте, за исключением того, что  в UART  TTL-логика(транзистор-транзистор):

уровень «0» - меньше 1.2В, уровень «1» - больше 2.8В.

а в СОМ   “0” - -12В, “1” - +12В.

A что касается режимов, то они идентичны UART.

Линии подключения RxD и TxD.


4.3.4. Подключение клавиатуры к параллельному порту микроконтроллера

Пример подключения датчика. Например, контактов кнопки.

Когда контакт разомкнут (кнопка отжата) на ножке U=5 B, уровень логической единицы.

Когда кнопка нажата U Px.x. будет равно 0, мы прочитаем логический 0. Если предварительно в порт записали 0, то читать с этого порта независимо от состояния контакта будем 0.

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

Пример:

#include <ADuC 812>

main ()

{               while (1);

{

P1.0. =1 ;

IF(P1.0= =0)

P1.1. = 1;

else

P1.1. = 0;

}     }               

В приведённой схеме резистор R подаёт единичный потенциал на вход параллельного порта. Применение резистора позволяет закорачивать вход параллельного порта на корпус устройства не вызывая чрезмерного тока через контакт. При замыкании контактов кнопки на вход параллельного порта подаётся потенциал логического нуля. Эти логические уровни могут быть обнаружены при помощи программы, загруженной в микроконтроллер.

Иногда требуется вводить информацию с большого количества кнопок. В этом случае для уменьшения количества линий ввода-вывода используется клавиатура. Для подключения клавиатуры используется два порта: порт ввода и порт вывода. Схема подключения клавиатуры приведена на рисунке 5.

Рисунок 5. Подключение клавиатуры к микропроцессорному устройству.

В этой схеме для подключения шестнадцатикнопочной клавиатуры достаточно восьмибитного параллельного порта ввода-вывода. Собственно говоря, схема подключения не отличается от предыдущей схемы. Принципиальное отличие состоит в том, что корпус на кнопки подается не непосредственно, а через порт вывода.

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

1.1.  Опрос состояния кнопок на языке программирования C

Для того, чтобы не было неоднозначности при определении номера нажатой кнопки, выдадим на выходной порт процессора код опроса клавиатуры. Этот код опроса должен содержать на выходе только один логический ноль. Для записи кода в выходной порт как и в предыдущей лабораторной работе можно воспользоваться оператором присваивания. Например:

Port2 = ~1;

В этом примере в порт записывается константа 111111102, которая формируется оператором инвертирования ‘~’ из константы 000000012. После записи этой константы на всех выводах порта кроме нулевого вывода появляется единичный потенциал. На нулевом выводе этого порта появляется низкий потенциал, который может поступать на входные линии параллельного порта при замыкании контактов кнопок клавиатуры. По считанному с входного порта клавиатуры коду можно будет определить состояние кнопок, подключенных к нулевому выводу порта вывода клавиатуры.

Точно так же можно подать нулевой потенциал на первый вывод выходного порта клавиатуры, что позволит определить состояние кнопок, подключенных к первому выводу порта вывода клавиатуры:

Port2 = ~2;

Коды, которые выдаются в выходной порт клавиатуры называется кодами опроса клавиатуры.

Временная диаграмма напряжений при опросе кнопок на выходах порта клавиатуры приведена на рисунке 6.

Рисунок 6. Временные диаграммы напряжения на выводах порта вывода.

После подачи сигнала опроса клавиатуры можно осуществлять считывание логических уровней на выводах порта ввода. Это можно осуществить операцией сравнения:

   if(Port2 ==~0x11)     //Если нажата кнопка на пересечении нулевой колонки и нулевой строки

       SvDiod=1;              //то зажечь нулево   й светодиод