Звук
  Свет
  Радио
  Питание
  PC & GSM
  PIC и AVR
  Разное
  Справка
  Верстак
  Техника


  ФОРУМ

 

 

 

схемы электронных устройств

 

 

все темы форума одной страницей

 

 

DIY Projects

Основы программирования LPT для DOS и Win9x  
Автор: ZPS   Добавлено: 09.09.2002


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", так будет проще понять что происходит. Описаные выше программы можно найти в разделе "Программы".

В следующий раз расскажу немного про остальные выводы порта







Комментарии посетителей:
<dr. NiMnUL>
хорошая статья доходчиво и понятно
<SSV>
Класно это то что я искал
<zero>
огромное спасибо если можно еше объяснение как бы все контакты проверить этого lpt.
<FreeMan>
Этот материал просто супер,как раз то что нужно для начального понятия.Вот еслибы побольше примеров на Delphi
<Glebych>
Cool.. лично я этим не занялся бы, но раз программирование то заинтересовал меня Радист.
<foma>
огромный приогромный, просто очень БИГ СЕНЬКС!!!!
только просьба одна есть, очень бы хотелось, чтобы тема не заглохла!!!
ZPS
<foma>
тема не заглохнет, уже готовлю следущую заметку по электнонной части.

Если есть какие-то идеи или наработки, присылайте, выложу. Даже самая маленькая или глупая идея способна вдохновить на крупные проекты.
<AgentSmith>
штобы проги работали на вын2000 & XP & NT надо скачать http://www.beyondlogic.org/porttalk/porttalk22.zip , заинсталлить и так запускать:

allowio lpt.exe 0x378
<Андрей>
Я вот тоже решил этим заняться и вот собираю потихоньку инфу, относящуюся к этой теме. Предлагаю тем, кто программирует нга Delphi, скатать из инета компонент ZIPortIO, он обязательно должен вам помочь.
<Vaniam>
Я тут тоже сделал прогу по управлению на делфях. Вот какие функции:
1.Ручное управление.
2.Вские разные бегалки(1-4 ламп сразу), магалки, тени.
3.!!! Слежение за входящим трафиком инета до 8кб(как раз для диалапа), можно сделать и для ис/вх трафика одновременно до 4кб хотя можно и больше сделать, а если по какой то причине нет связи так они все мигают.
Правда последнее время лень чёто с ней делать, хотя фантазий хоть отбавляй.Кому интересно могу прислать прогу, пишите VaniaM@mail.ru
В дальнейшем хотелось бы сделать плагин для ВинАмпа, а то тот который есть мне ненравится, но в этом нужна ваша помошь, если кто знает как делать то пишите.
А можно ли сделать так чтобы он ловил все звуки с выхода звуковухи, чтоб независить от винампа, или это сложно очень?
Остальные комментарии(58) можно прочитать на форуме
Добавить комментарий Перейти к обсуждению на форуме


DIY Projects