У попередній статті я обіцяв розповісти про читання інформації з LPT порту і навести кілька схем датчиків.
Поки просто розповім про програмування і про підключення кнопочок, а далі по ситуації.
Схема підключення кнопок і перемикачів виявилася такий же простий як і схема підключення світлодіодів:

 

Для введення інформації я використав 5 стандартних входів – висновки 10, 11, 12, 13 і 15.
Первинний стан висновків – log1, тобто на них напруга 5V.
Мій тестер сказав, що там не 5, а 4.7V, може тестер не точно показує, може блок живлення в компі слабенький, а може так і треба – не важливо.
Отже, замкнувши висновок порту на землю (висновки 18-25), ми переведемо його в стан Log0. Замикати висновок прямо на землю я не ризикнув і з'єднав його з землею через резистор в 470 му. Можна обійтися і без резистора – все відмінно працює, але краще не ризикувати.
Для подальших експериментів я зібрав собі панельку з 5 кнопочок за наведеною вище схемою і дістав з архівного диска компілятор Turbo Pascal 7.1 (те ж що і Pascal 7.0).

Тим, хто не вміє працювати з портами, раджу прочитати попередню статтю "Основи програмування LPT", тк. зараз я вже не буду детально описувати як і чому.
Як я вже говорив, вважати значення на виходах порту можна одним рядком: data: = port [$ 378], де $ 378 – базовий адресу порту. Це виходи, ними управляти ми вже вміємо. А входи нахотятся за адресою "Базовий +1", ті. $ 379 пробуємо вважати:
 

Uses Dos; Var data: byte; (мінлива DATA типу byte) Begin data: = Port [$ 379]; (читаємо значення порту в data) writeln (data); (виводимо значення на екран) End.

У результаті на екрані залишиться число 120 (у мене так:)). Натискаємо одну з кнопок, запускаємо програму ще раз – число змінилося. Щоб не мучитися із запуском програми та її закриттям, а просто тиснути на кнопки і дивитися, я трохи допрацював програму:

Uses dos, crt; var data: byte; BEGIN clrscr; while not keypressed do (поки не натиснута кнопка на клавіатурі …) begin (повторюємо код від сюди …..} data : = Port [$ 379]; (читаємо значення порту в data) gotoxy (1,1); (ставимо курсор в позицію 1,1 на екрані) write (''); (пишемо прогалини щоб замазати текст) gotoxy (1,1 ); (Повертаємо курсор тому в позицію 1,1) write (data); (виводимо значення на екран) delay (100); (затримка в 100мс. (Не точно!)) End; {….. до сюди) END.

Для тих хто працює в Delphi, маленька вставочка на асемблері, тк. я не знаю як в Дельфи правильно працювати з портами:

asm MOV DX,379h;

IN AL,DX

MOV data,ALend;

Ця програма буде робити наступне: виведе значення порту на екран, почекає 100мс, поверне курсор на початок рядка і замінить старе значення на нове і так до тих пір, поки не натиснута кнопка на клавіатурі.
Тепер можна запустити програму, прибрати клавіатуру з мишкою в сторону і спостерігати за змінами.
Ось тепер починається головоломка … Методом тику я знайшов, що кожній кнопці відповідає своє значення (свій біт), значення присвоєно дуже дивно, може пізніше я розберуся чому, але поки просто викладу їх:
 

висновок значення
10 64
11 128
12 32
13 16
15 8

Я не випадково виділив 11 висновок жирним, він відрізняється від інших – він логічно інвертувати, ті. якщо всі наші кнопки система вважає віджатий, то цю вона вважає замкнутою. А якщо її замкнути, то система буде думати що кнопка віджатий.
Тепер як це все впливає на загальне число яке ми вважали (120):
Якщо натиснути на одну з наших кнопочок, то від загального числа відніметься значення цієї кнопочки (див. таблицю).
Наприклад, ми натискаємо кнопку підключенню до висновку 10 і число відразу зменшується на 64 (див. прогу), відпустимо і значення знову збільшиться на 64. А тепер, натиснемо кнопку на виведення 15 – значення зменшилося на 8, відпустили і воно знову збільшилася.
А що буде якщо натиснути особливу 1911 кнопку? Натискаємо – значення не зменшилася, а виросла, відпустили і воно знову поменшало. Ось чим ця кнопка відрізняється від решти 4.

А тепер по-російському, як дізнатися програмі самій? Я робив так:
Запам'ятовую що зараз у порту, при зміні значення порівнюю що було і що вийшло, якщо відрізняється на 64, значить натиснута 10кнопка, якщо відрізняється на 32, значить 12 кнопка і тд. Щоб визначити натиснута або відпущена, потрібно враховувати збільшилося число або зменшилася.
Тобто, якщо число стало менше на 32, то натиснута кнопка 12, а якщо кількість збільшилася на 32, значить кнопку 12 відпустили. АЛЕ! тут потрібно враховувати, що кнопка зі значенням 128 (11вивод) працює навпаки.
Ось те ж саме, тільки на программерском:

Uses Dos; uses dos, crt; var bylo, stalo: word; razn: integer; BEGIN clrscr; bylo: = port [$ 379]; while not keypressed do begin stalo: = port [$ 379]; razn : = Stalo – bylo; case razn of -64: writeln ('натиснута кнопка 10!'); 64: writeln ('відпущена кнопка 10!'); -32: Writeln ('натиснута кнопка 12!'); 32: writeln ('відпущена кнопка 12!'); 128: writeln ('натиснута кнопка 11!'); -128: writeln ('відпущена кнопка 11!'); end; bylo: = stalo; end; END.

Сподіваюся, що цього коду достатньо для початку, далі вже можна самостійно розібратися або запитати допомоги на форумі

Тепер знову про електроніку …
У найпростішому варіанті можна використовувати кнопочки або перемикачі як в експериментальній панельці, можна поставити геркон, тк. це теж кнопочка, тільки магнітна, можна контакти реле … Але тут потрібно пам'ятати про таку негарну вешь, як "брязкіт" контактів – розхитаність або просто неякісний вимикач обов'язково буде давати повторні спрацьовування в програмі. Якщо точність не потрібна, то можна просто збільшити затримку з 100 мс до, наприклад, 1 секунди і тоді програма просто не обробить повторні натискання. А якщо потрібна точність, то потрібно щось вигадувати.
Теоретично, зв'язати порт можна з будь-яким низьковольтним пристроєм через транзистор, ті. замикати контакти не кнопкою, а транзистором. Наприклад, у нас є схема, в якій світлодіод загоряється коли хтось проходить поруч із пристроєм, якщо світлодіод підключений прямо до висновку мікросхеми, просто подпіваем до ніжки мікросхеми замість світлодіода резистор, а резистор до бази транзистора емітером з колектором якого підключені замість вимикача до ніжки. Ух, під сказав, аж сам не зрозумів. Просто лінь малювати схему, а прімерчік Цей із моєї практики …
 

 

 

Джерело: zps-electronics.com