Раздел: Документация
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:
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
|