8(495)909-90-01
8(964)644-46-00
pro@sio.su
Главная
Системы видеонаблюдения
Охранная сигнализация
Пожарная сигнализация
Система пожаротушения
Система контроля удаленного доступа
Оповещение и эвакуация
Контроль периметра
Система домофонии
Парковочные системы
Проектирование слаботочных сетей
Аварийный
контроль
Раздел: Документация

0 ... 3 4 5 6 7 8 9 ... 105

Базовые адреса портов LPT1 и LPT2 следующие:

LPT1: 956 (3BCh) или 888 (378h) LPT2: 632 (278h)

Базовый адрес для LPT1 зависит от конфигурации оборудования компьютера. Существует два способа получения базового адреса: проверка конфигурации оборудования вашего компьютера или нахождение адреса непосредственно из пользовательских программ с помощью средств, предлагаемых базовой системой ввода/вывода (BIOS) компьютера. При включении или перезагрузке компьютера BIOS проверяет наличие параллельных портов. Если они обнаруживаются, их базовые адреса (двухбайтовые слова) помещаются в определенные ячейки памяти ОЗУ. Для LPT1 это ячейки OOOOh: 0408h и OOOOh: 0409h. Первая содержит младший, вторая - старший байт адреса. Базовый адрес LPT1 можно получить, считав содержимое этих ячеек. Ячейки памяти для портов LPT1 - LPT4 приведены ниже:

LPT1: 0000:0408h - 0000:0409h LPT2: 0000:040Ah - 0000:040Bh LPT3: 0000:040Ch - 0000:040Dh LPT4: 0000:040Eh - 0000:040Fh

Кроме того, используется еще одна ячейка памяти: 0000:4011 h. Она содержит сведения об общем количестве параллельных портов, установленных на компьютере. Эта информация хранится в битах 6 и 7:

бит 7

= 0, бит 6 =

0

параллельные порты не установлены

бит 7

= 0, бит 6 =

1

установлен один параллельный порт

бит 7

= 1, бит 6 =

0

установлено два параллельных порта

бит 7

= 1, бит 6 =

1

установлено три параллельных порта

1.1.3. Программное управление

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

Получение базового адреса параллельного порта

Следующая программа написана на языке QBASIC. Она выводит общее количество параллельных портов и их базовые адреса от LPT1 до LPT3. Строка 20 считывает байт, находящийся в ячейке памяти 0000:04llh, используя команду РЕЕК(). Биты 7 и 6 выделяются с помощью маски AND (128 + 64) . Затем результат сдвигается на 6 бит по направлению к младшему разряду с помощью деления на 64. Строка 30 считывает два байта из двух ячеек памяти, содержащих младший и старший байты базового адреса LPT1. Строки 40 и 50 делают то же самое для LPT2 и LPT3.


10 DEF SEG = 0

20 PRINT "Number of Centronic ports:

(PEEK(&H411) AND (128 + 64))/64

30 PRINT "Address ofLPT1

40 PRINT "Address ofLPT2

50 PRINT "Address ofLPT3 60 INPUT x

PEEK(&H408)+256*PEEK(&H409) PEEK(&H40A)+256*PEEK(&H40B) PEEK(&H40C)+256*PEEK(&H40D)

Следующая процедура на языке ТР6 определяет количество установленных параллельных портов и присваивает полученное значение переменной Number of LPT. Затем она считывает их базовые адреса из ячеек памяти, где хранятся адреса портов LPT1 - LPT4. Далее программа предлагает указать тот LPT-порт, к которому будет присоединено внешнее устройство. И наконец, она присваивает выбранный базовый адрес переменной Cent ronic add ress. В Turbo Pascal 6 для считывания содержимого ячеек памяти используются функции mem(основание: смещение) и теш(основание: смещение). Функция mem(...) считывает байт из ячейки памяти, a memw(...) - двухбайтовое слово из указанной ячейки памяти и одной ячейки выше.

(♦-Библиотека ресурсов № А1 (определение базовых адресов LPT-портов)-.*) Procedure Centronic Address

:$0408 содержит базовый адрес для LPT1, :$040А содержит базовый адрес для LPT2, :$040С содержит базовый адрес для LPT3, :$040е содержит базовый адрес для LPT4, :$0411 содержит количество параллельных портов.*)

(

$000 $000 $000 $000

lpt:array[l..4] of integer; number of lpt, LPT number, code:integer kbchar.char; begin

clrscr;

LPT number:=1;

number of lpt:=mem($0000:$0411);

(*Для установки принтера no умолчанию.*) («Считывает количество установленных параллельных портов.*) number of lpt:=(number of lpt and (128+64)) shr 6;(*Манипуляции с битами.*)

lpt[1] lpt[2] lpt[3] lpt[4]

=memw($0000 =memw($0000 =memw($0000 =memw($0000

$040A) $040C) $040e)

(•Процедура считывания из памяти.*)

textbackground(blue); clrscr;

textcolor(yellow); textbackground(red); window(10,22,70,24) writeln(Number of LPT installed:,number of lpt:2); writeln(Addresses for LPT1 to LPT4: , lpt[l]:3, ,lpt[2]:3, write(Select LPT to be used(1, 2,3,4): ); delay(lOOO);

if number of lpt>1 then {Выбор порта begin repeat

kbchar:=readkey; val(kbchar,LPT number,code); until (LPT number>=1) and (LPT number<=4) and (lpt[LPT number]<>0);

end; clrscr;

P address:=lpt[LPT JJumber]:

clrscr;

,lpt[3]:3, Mpt[4]:3);

если установлено несколько портов.

(«Считывание значения нажатой клавиш (•Преобразование символа в число.*)


writeln(Your selected printer interface: LPT,LPT number:1);

write(LPT address: ,P address:3);

delay(1000);

textbackground(black); window(1,1,80, 25); clrscr;

end;

Функция centronic(x) написана на языке Turbo Pascal для Windows. Она может быть вызвана программой, написанной на другом языке программирования для Windows, например Visual Basic или Visual С, если ее. оформить в виде библиотеки динамической компоновки DLL. Centronic(O) возвращает количество установленных LPT-портов, Centronic(l) - базовый адрес LPT1, Centronic(2) - базовый адрес LPT2 и т.д.

Function Centronic(x:integer):integer; export; (*

$000 $000

содержит базовый адрес для LPT1, $040А содержит базовый адрес для LPT2, $040С содержит базовый адрес для LPT3, $040е содержит базовый адрес для LPT4, $0411 содержит количество параллельных портов

var

number of LPT,LPT1,LPT2,LPT3,LPT4:integer; Ipt1,lpt2,lpt3,lpt4: integer; begin

number of LPT number of LPT lpt1:=0; lpt2 lpt1:=memw($40 lpt2:=memw($40 lpt3:=memw($40 lpt4:=memw($40 case x of

:=mem($40:$11): («Считывает количество LPT-портов.* :=( number of LPT and (128+64)) shr 6; :=0; lpt3:=0; lpt4:=0;

(«Процедура считывания из памяти.*)

$0А) $0С) $0е)

centronic:=Number of LPT; Centronlc:=lptl; Centronic:=lpt2; Centronic:=lpt3; Centronic:=lpt4;

end;

end;

Ввод/вывод данных через параллельный порт

Существует несколько способов записи информации в параллельный порт. Команды принтера и процедуры прерываний BIOS

В QBASIC команда вывода на печать - PRINT, в ТР6 - writeln(lst). Другой способ управления принтером заключается в использовании прерывания BIOS - INT 17h. Временные диаграммы вывода данных через параллельный порт показаны на рис. 1.5.

Сначала компьютер проверяет, готов ли принтер к приему новых данных. Для этого необходимо проконтролировать состояние линии BUSY. Когда на ней низкий уровень («не занят»), ПК записывает данные в регистр данных. Через 500 не компьютер переводит сигнал STROBE в низкий уровень, который, в свою очередь,



0 ... 3 4 5 6 7 8 9 ... 105