Кабели, удовлетворяющие этим требованиям, маркируются как "IEEE Std 1284 - 1994 Compliant". Они могут иметь длину до 10 метров.
Работа с параллельным портом на низком уровне (т.е. на уровне прямого обращения к контроллеру порта) применяется при решении различного круга задач по обмену информацией с нестандартными устройствами, для написания драйверов принтеров и ряда других задач. Прямая работа с контроллером позволяет реализовать любой протокол обмена с устройством и использовать линии порта по своему усмотрению.
Контроллер порта расположен в адресном пространстве устройств ввода-вывода и обращение к нему производится посредством команд IN и OUT ассемблера. Или при помощи специальных команд компиляторов программ, написанных на языках высокого уровня. Информацию о портах LPT1 – LPT3 можно получить, прочитав переменные BIOS, приведенные в табл. 5.
BIOS ищет порты по адресам Base: 3BCh, 378h, 278h. Порт LPT4 BIOS найти не может:
– 378h - параллельный адаптер LPT1;
– 278h - параллельный адаптер LPT2;
– 3BCh - параллельный адаптер LPT3;
Таблица 5. Переменные BIOS для LPT портов
Имя порта | Адрес в BIOS | Тип переменной | Описание |
LPT1 | 0040:0008h | Word | Базовый адрес порта LPT1. Если переменная равна 0, то порт LPT1 не найден |
0040:0078h | Byte | Константа, задающая тайм-аут | |
LPT2 | 0040:000Ah | Word | Базовый адрес порта LPT2. Если переменная равна 0, то порт LPT2 не найден |
0040:0079h | Byte | Константа, задающая тайм-аут | |
LPT3 | 0040:000Ch | Word | Базовый адрес порта LPT3. Если переменная равна 0, то порт LPT3 не найден |
0040:007Ah | Byte | Константа, задающая тайм-аут | |
LPT4 | 0040:000Eh | Word | Базовый адрес порта LPT4. Если переменная равна 0, то порт LPT4 не найден |
0040:007Bh | Byte | Константа, задающая тайм-аут |
Стандартный порт имеет три 8-битных регистра, расположенных по соседним адресам, начиная с базового (Base) адреса. Перечень данных регистров приведен в- табл. 6.
Таблица 6. Регистры стандартного LPT порта
Адрес | Название | W-R |
Base+0 | Data Register – регистр данных (DR) | W/R |
Base+1 | Status register – регистр состояния (SR) | R |
Base+2 | Control Register – регистр управления (CR) | W/R |
Примечание. W-R – доступные операции (W – запись, R – чтение, W/R – запись/чтение).
Регистр данных (DR). Записанные в этот регистр данные выводятся на выходные линии интерфейса D0-D7. Результат чтения этого регистра зависит от схемотехники адаптера и соответствуют либо записанным ранее данным, либо сигналам на линиях D0-D7, что не всегда одно и тоже. При стандартном включении справедлив первый вариант - читаемые данные равны ранее записанным.
Регистр состояния (SR). Представляет собой 5-ти битный порт ввода, на который заведены сигналы состояния от внешнего устройства. Допускает только чтение. Назначение битов данного регистра приведены в табл. 7.
Таблица 7. Биты регистра состояния SR
Бит | Вес | Название | Назначение |
7 | 128 | BUSY | Инверсное отображение состояния линии Busy (11). При низком уровне на линии 11 (Busy) – бит равен "1" – ПУ готово к приему очередного байта |
6 | 64 | ACK | Отображение состояния линии ACK# (10). "0" – подтверждение приема, "1" – обычное состояние |
5 | 32 | PE | Отображение состояния линии Paper End (12). "0" – норма, "1" – в ПУ нет бумаги |
4 | 16 | SLCT OUT | Отображение состояния линии Select (13). "0" - ПУ не выбрано, "1" - ПУ выбрано |
3 | 8 | Error (инверсн.) | Отображение состояния линии Error (15). "0" – ошибка ПУ, "1" – обычное состояние |
2 | 4 | PIRQ | Флаг прерывания по ACK# (только PS/2). Обнуляется, если ACK# вызвал аппаратное прерывание. "1" – после сброса или после чтения регистра состояния |
1-0 | 4-1 | -- | Не используются (резерв) |
Регистр управления (CR). Регистр управления представляет собой 4-х битный порт вывода, допускающий чтение и запись. Биты 0, 1, 3 инвертируются, т.е. "1" в данных битах регистра управления соответствует "0" на соответствующих линиях порта. Назначение битов регистра управления приведены в табл. 8. Бит 5 используется только двунаправленными портами.
Программирование интерфейса Для разработки прикладных программ необходимо выбрать язык программирования. Если требуется несложная, быстрая и компактная программа, которая не содержит сложных вычислительных операций, то для ее написания лучше выбирать язык низкого уровня (язык ассемблера). Язык ассемблера относится к группе машинно-ориентированных языков, т.е. каждому семейству микропроцессоров соответствует свой язык.
Таблица 8. Биты регистра управления CR
Бит | Вес | Название | Назначение |
7 | 128 | - | Резерв |
6 | 64 | - | Резерв |
5 | 32 | Direction | Бит управления направлением порта. "1" – режим ввода, "0" – режим вывода |
4 | 16 | AckIntEn | Бит управления генерацией прерывания по ACK# . "1" – разрешить прерывание по спаду ACK# (10) |
3 | 8 | SLCT IN | Управление линией SLCT IN# (17). "1" – работа принтера разрешена. |
2 | 4 | INIT | Управление линией INIT# (16). "1" – обычное состояние, "0" – аппаратный сброс ПУ |
1 | 2 | Auto LF | Управление линией Auto LF# (14). "1" – включить режим "Auto LF", "0" – обычное сост. |
0 | 1 | Strobe | Управление линией Strobe# (1). "1" – стробирование данных, "0" – обычное сост. |
Язык высокого уровня следует выбирать, если необходимо производить сложные вычисления, или в случае, если высокое быстродействие программы не требуется. Объектные коды, полученные в результате трансляции программ, написанных на языке высокого уровня, обычно занимают в памяти ЭВМ намного больше места и исполняются медленнее в сравнении с программами на ассемблере. Часто применяется подход, когда критичные к быстродействию части программы пишутся на ассемблере, а вычислительные процедуры – на языке высокого уровня, например, на Паскале или Си.
Рассмотрим работу с регистрами интерфейса CENTRONICS на языке PASCAL или ассемблере:
Паскаль: | Ассемблер 8086: |
Port[$378]:=x | mov al,x |
Х - число типа "byte" (0..255). Например, при посылке 170 (dec) = 10101010 (bin) на линии d0–d7 единичный сигнал будет присутствовать на выводах d1, d3, d5, d7 (обозначение выводов начинается с d0). Число 170 останется на выводах разъёма до тех пор, пока Вы не перешлёте туда же другое число (это может сделать и другая программа) или не выключите компьютер. Заметьте, что адрес порта в команде задан в шестнадцатиричном (hex) виде, а посылка - в десятичном (dec). Если вместо Паскаль-команды
Port[$378]:=170;
Вы примените
d:=Port[$378];
где d – переменная, то переменная примет значение последнего посланного в порт байта или, при переходе в режим приёма, значение байта, поданного на порт внешним устройством.
Пример чтения статус-регистра на языке Pascal:
d:=Port[$379];
В переменной d после выполнения программы будет отображено состояние порта. Допустим, переменная вернула значение 126 (dec). В двоичном (bin) виде оно выглядит как 01111110. Младшие (правые) три бита (нулевой, первый и второй) не используются, и почти равны 1, 1 и 0. Третий бит – 1, значит на ERROR высокий уровень. Та же ситуация на SELECT, Paper End, ACK и BUSY (не забывайте, что сигнал BUSY является инвертированным).
Приведем пример фрагмента программы, которая считывает байт с линий данных D0-D7:
Port[$37A]:=32; {32 "включает" единицу в пятом}
d:=Port[$378] ; {бите, переводя порт в режим ввода}
Как видно из приведенных примеров, программирование LPT-порта является весьма простой задачей, что позволяет в значительной степени облегчить работу разработчика программного обеспечения устройств с обсуждаемым интерфейсом.