контактів, на яких ми можемо встановити напругу 0 або +5 В (логічна 0 і 1) з програми або це може зробити зовнішній пристрій зовні. Давайте розберемося, якими контактами ми можемо оперувати, а якими ні. У цьому нам допоможе рис. нижче (його малювати не я, автор мені невідомий. Але він аж надто хороший, я і сам їм постійно користуюся)
В
З рис. видно, що висновки порту можна розділити на чотири групи: це 'земляні' висновки (НЕ зрозуміло чим керувалися розробники інтерфейсу LPT, зробивши цих висновків аж 8 штук). Вони позначені чорним кольором (контакти 18-25). Всі вони з'єднані між собою, тому для своїх розробок в якості землі можна використовувати будь-який з них.
Червоним кольором позначені висновки так званого регістра Data ​​b> (контакти 2-9). Під регістром будемо розуміти (на побутовому рівні) об'єднання групи контактів LPT порту. У регістрі Data їх 8 штук. Це самий тлумачний регістр - він дозволяє нам як з програми, так і з зовнішнього пристрою встановити на його контактах логічну 0 або 1, тобто він двонаправлений. Саме його ми і використовували в нашій першій програмі Port.exe - підключали світлодіод до 2-го висновку порту (як тепер зрозуміло, цей висновок належить регістру Data, є його нульовим бітом) і 25 висновку (Земля), і за допомогою програми управляли подачею напруги на висновок 2 щодо землі. Щоб звертатися до цього регістру, треба знати його адресу: 0x378 - В 16-річної системі або 888 в десяткового (на рис. Написано & H378 - це теж саме що і 0x378, просто перша позначення притаманне мові Pasсal і йому подібним, ми ж пишемо на Сі).
Знову згадуючи програму Port.exe, зауважимо, що зверталися ми до регістру за допомогою наступної функції _ outp (Address, 0); де мінлива Address була попередньо визначена як 888. Тепер зрозуміло, що цим ми вказували функції _outp, що ми хочемо працювати саме з регістром Data.
Продовжимо розгляд порту. Залишилося ще два регістри. Наступним буде регістр Status (Контакти 10-13, 15). Це односпрямований регістр. Керувати ним можна тільки з зовні, через зовнішній пристрій (мається на увазі змінювати дані на ньому, читати можна з будь-якого регістра в будь-яку строну). Він має адресу 0x379 - в 16-річної системі або 889 в десяткового. І регістр Control (Контакти 1, 14, 16-17). Він має всього 4 контакта і може управлятися тільки програмою. Його адреса: 890 в десяткового системі. p> У результаті ми отримали:
8 двонаправленими контактів (регістр Data) - дані туди може записати і програма і зовнішнє пристрій
5 однонапрямлених контактів (регістр Status) - дані туди може записати тільки зовнішнє пристрій
4 однонапрямлених контакту (регістр Control) - дані туди може записати тільки програма
Висновок: у нас є 17 висновків якими ми можемо керувати на свій розсуд.
Тепер розглянемо, а як відбувається запис і читання даних в регістри LPT порту, тобто як нам встановити на потрібних висновках 0 або 1.
Запис/читання даних в регістр Data ​​b>
Отже, розглянемо відразу практичну задачу. Хочу щоб на виведенні регістра Data під номером 3 (3 - це номери виведення LPT порту) була встановлена ​​логічна 1 (тобто щоб між ним і землею було +5 В) і на інших висновках цього регістра (2,4-9 висновки порту) були нулі. Пишемо код:
int Address = 888;
int data = 2;
Out32 (Address, data);
Я використав функцію Out32 бібліотеки inpout32.dll, будемо звикати до неї, тому що подальші приклади будемо розбирати саме на цій бібліотеці. Якщо цей код виконати, то вийде що на виведення порту 3 є +5 В, а на 2,4-9 висить нуль. Як це вийшло? p> Почнемо розбиратися: першим параметром функції Out32 ми передаємо число 888. Як Ви вже знаєте, це адреса регістра Data LPT порту. Тепер функція знає куди їй писати дані. Далі другим параметром ми передаємо число 2. Прошу звернути увагу, що двійка в десяткового системі числення. Що далі робить функція? Їй треба цю двійку запхнути в регістр Data, але от проблема: регістр зовсім не розуміє що таке 2. Він знає 0 або 1. Більше нічого. Тоді функція як би "переводить цю двійку в двійкову систему числення "(це не зовсім вірно, але для пояснення на пальцях згодиться) і кожен розряд двійкового числа справа на ліво записує по порядку в регістр починаючи з молодшого розряду D0 (висновок 2 порту) і закінчуючи старшим D7 (висновок 9). Якщо Ви переведете число 2 з десяткової в двійкову систему числення то отримаєте 10 . Функція бере перший розряд двійкового числа - це 0 (саму праву) і пише її в D0, далі бере 1 і пише її в D1. Т.к. регістр 8-ми розрядний (у нього є 8 контактів), функція продовжує брати дані справа на ліво і писати в наступний біт регістра. Т.к. наше число закінчилося, то функція як би дописує нулями наше двійковечисло ліворуч, щоб во...