NB! Материал по LPT был написан мной в самом начале рабты с LPT и вобще с программированием, поэтому стиль статей и термины могут вызывать удивление или даже возмущение. Не смотря на это, материал уже помог нескольким людям начать работу с LPT и собрать собственные схемы. Дополнять материал по LPT я скорее всего уже не буду, на очереди COM и USB, но для них пока не достаточно опыта.
Основы программирования LPT для DOS и Win9x
Предидущие статьи: "Что такое
LPT-порт ?" и "Примеры
схем для LPT"
Как и обещал, попробую рассказать про
программирование LPT порта. Почти все описаные
ниже примеры будут работать только в DOS и Win9x. В
системах WinNT, Win2K и WinXP это работать не будет, тк.
они не разрешают напрямую общаться с портом.
Теоретическая часть одинакова для всех систем.
Теория:
Как я уже говорил, у lpt порта есть 8 основных
выходов - выводы 2-9. Управлять ими не сложно, нужно
просто посылать в порт определенное число:
1 выход - 1
2 выход - 2
3 выход - 4
4 выход - 8
5 выход - 16
6 выход - 32
7 выход - 64
8 выход - 128
Чтобы запитать первый выход, нужно послать в порт
единицу. Чтобы запитать пятый посылаем 16 и тп..
Ноль посланный в порт "погасит" все выходы, а
число 256 запитает все сразу.
Сразу напрашивается вопрос - как запитать
несколько выходов сразу. Ответ - просто сложить
коды выходов: Например, нам нужно запитать выходы
3, 6 и 8, берем и складываем коды этих выводов: 4+32+128=164, посылаем в порт число 164. Так, а
теперь погасим один из выходов... например, 6.
Сейчас на порт у нас послано 164, отнимем от этого
код шестерки(32). Считаем 164-32=132,
посылаем в порт число 132 и 6й выход гаснет.
Сложно? Тогда ещё вариант без вычислений
вобще:
Берем обычный калькулятор из windows(calc.exe), выбираем
инжинерный вариант в меню "вид". Переходим
на двоичную систему (bin). Так, теперь если нам
нужно запитать выходы 3 и 5:
распологаем выходы по порядку от 8 до 1
8-7-6-5-4-3-2-1
теперь заменяем всё, что нужно запитать, на 1, а
что должно быть погашено - на 0.
0-0-0-1-0-1-0-0
вводим в калькулятор полученую комбинацию 00010100 и
переключаемся назад на десятичную систему(Dec),
введеное нами число меняется на 20. Значит, чтобы
запитать выходы 3 и 5 нам нужно послать в порт
число 20.
Практика:
Для того чтобы послать в порт какое-то число,
нужно знать базовый адрес порта. Обычно первый LPT
порт находится по адресу 378.
Адрес знаем, попробуем послать туда что-нибудь.
Для примера возьмем Pascal. Новички, не пугайтесь,
язык очень простой. Профи, не ругайтесь - он ещё не
слишком стар и для доса писать на нем очень
удобно.
Uses Dos;
Var
data:byte; {переменная DATA типа byte}
Begin
Readln(data); {читаем переменную -ввод ентером}
Port[378]:=data; {посылаем в порт}
End.
Если этот код набрать в Pascal 7.0 и скомпилировать,
то получим простейшую программу для управления
портом. В программе нужно ввести нужное число и
нажать Enter. Прога пошлет введеное число в порт и
закрется.
Чтобы узнать какое число сейчас присвоено
порту (что там сейчас лежит) можно использовать
такой код:
Uses Dos;
Var
data:byte; {переменная DATA типа byte}
Begin
data:=Port[378]; {читаем значение порта}
writeln(data); {выводим на экран полученое значение}
End.
Это был пример на Pascal и работать он будет под DOS.
В Win9x программа откроется в окне, в режиме
эмуляции MSDOS.
Если такой вариант не устраивает и знания
позволяют программировать на Delphi, вот пример
управления портом из Delphi.Стандартных функций для
работы с портом я не нашел и использовал вставки
на ассемблере:
asm
MOV DX,0378H
MOV AL,data //data - то, что послать.
OUT DX,AL
end;
Этот код можно вставить в программу
предварительно присвоив переменной data нужное
значение.
Теперь небольшой примерчик для C
#include
#include
#include
main() {
int i;
unsigned char r=1;
outp(0x378,0);
for ( i=0;i<=128;i++) {
outp(0x378,i);
delay(100);
}
outp(0x378,0);
}
Этот код я не проверял...
Для C есть ещё один, более простой,
вариант:
#include
main()
{
FILE *lst2;
lst2 = fopen("LPT1", "w");
fprintf(lst2, "This will go through LPT.\n");
fclose(lst2);
}
Этот пример должен работать на любом виндосе.
По идее, таким же образом можно управлять портом
и в Delphi и в Pascal, только написание там будет другое.
Но в Delphi у меня не получилось - может просто что-то
криво написал.
Думаю, что этого пока хватит. Для экспериментов
советую собрать простую линейку из светодиодов
описаную в статье "Примеры
схем для LPT", так будет проще понять что
происходит. Описаные выше программы можно найти
в разделе "Программы".
В следующий раз расскажу немного про
остальные выводы порта
|