Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Теоретичні відомості. Як відомо, клавіатура і миша працюють по протоколу PS/2 і підключаються до одного і того ж контроллера клавіатури (наприклад




Як відомо, клавіатура і миша працюють по протоколу PS/2 і підключаються до одного і того ж контроллера клавіатури (наприклад, Intel 8042), інтегрованого в чіпі на материнській платі. Для клавіатури контроллер генерує переривання IRQ1. Контроллер може працювати в 2 режимах: PS/2- сумісному і АТ- сумісному. Перший режим передбачає підтримку двох пристроїв. Доступ до контроллера клавіатури здійснюється через порти 60h і 64h. Порт 60h в режимі читання отримує дані із буфера клавіатури, а в режимі запису – поміщає дані в буфер клавіатури. Порт 64h теж працює в 2-х режимах: в режимі читання він являється регістром стану, а в режимі запису – виконує роль регістра команд. В табл.3.10 представлений формат регістра стану порту 64h. В табл.3.11 представлений формат регістра команд порту 64h.

Біт Опис
    Наявність даних в вихідному буфері клавіатури (0- вихідний буфер пустий, 1- в буфері наявні дані) Наявність даних у вхідному буфері клавіатури (0- вхідний буфер пустий, 1- в буфері наявні дані) Результат самотестування: (0- зрив, 1- тест пройшов успішно) Порт, що використовується для останньої операції (0- 60h, 1- 64h) Стан клавіатури (0- заблокована, 1- включена) Помилка передачі (0- помилок немає, 1- клавіатура не включена) Помилка Тайм-Аута (0- помилка відсутня, 1- помилка) Помилка парності (0- помилка відсутня, 1- помилка) вказує на останню помилку, яка виникла при передачі даних.

Таблиця 3.10. регістр стану (64h)

Біт Опис
  Переривання для клавіатури (0- відключити, 1- включити) Переривання для миші (0- відключити, 1- включити) Системний прапор (1- ініціалізація через само тестування, 0- ініціалізація по живленню) Не використовується Доступ до клавіатури (0- відкритий, 1- закритий) Доступ до миші (0- відкритий, 1- закритий) Трансляція скан-кодів (0- не використовувати, 1- використовувати) Резерв.

Таблиця 3.11. Регістр команд (64h)

Перед початком роботи потрібно перевірити 0-й біт регістру статусу в буфері клавіатури. Цю перевірку потрібно здійснювати перед наступними операціями запису. Після перевірки буфера в регістр 64h записується код необхідної команди (табл.3.12). Якщо команда має додаткові параметри, то їх необхідно записати в регістр даних (60h). Після виконання команди в регістр даних 60h буде записаний результат.

Код команди Опис
20h 60h A1h A4h   A5h A6h   AAh   ABh   ADh AEh AFh C0h D0h D1h D2h E0h Прочитати байт із регістра команд Записати байт в регістр команд Отримати номер версії виробника Отримати пароль (повернення FAh, якщо пароль існує, і F1h- в протилежному випадку) Встановити пароль (засилає лінійку з нульовим символом вкінці) Перевірити пароль (порівнює введений з клавіатури пароль з текучим) Виконати само тестування контроллера (у випадку успіху поверне 55h) Перевірка інтерфейсу клавіатури (00h- все добре, 01h-низький рівень сигналу синхронізації, 02h- високий рівень сигналу синхронізації, 03h- низький рівень сигналу на лінії даних, 04h- високий рівень сигналу на лінії даних) Відключити інтерфейс клавіатури (встановлює біт 4 в регістрі команд) Включити інтерфейс клавіатури (очищає біт 4 в регістрі команд) Отримати версію Прочитати вхідний порт Прочитати значення із вихідного порту Записати параметр у вихідний порт Записати параметр в буфер клавіатури Тестування порту (повертає тестове значення для порту)

Таблиця 3.12. команди управління контроллером клавіатури

Код помилки Опис
00h AAh EEh FAh FCh FEh FFh Помилка переповнення (дуже багато натискань клавіш) Само тестування контроллера успішно завершено Результат ехо-режиму ініційованого командою EEh Підтвердження успішного виконання команди Помилка само тестування клавіатури Запит на повторну передачу даних (команда Resend) Помилка клавіатури

Таблиця 3.13. Коди помилок клавіатури

Розглянемо приклади для використання команд управління. Спочатку представимо код перевірки інтерфейсу (команда ABh) клавіатури.

Покроковий хід роботидля написання програми функції ABh на мові Асемблер для перевірки наявності клавіатури:

1. Чекаємо звільнення вхідного буфера клавіатури.

2. Запитуємо регістр стану AL про код 64.

3. Тестуємо, якщо буфер зайнятий (010b).

4. Повторюємо запит.

5. Записуємо команду тестування інтерфейсу 0ABh в регістр AL.

6. Записуємо код (64h) в порт AL.

 

Покроковий хід роботидля написання програми функції АВh на мові С++ для перевірки наявності клавіатури.

1. Ініціалізуємо змінну dwResult типу DWORD для збереження результату.

2. Об’являємо змінну занчення затримки iTimeWait цілого типу, яка дорівнює 50000. Може бути і інший час затримки.

3. Перевіряємо наявність даних у вхідному буфері клавіатури.

4. Організовуємо цикл «поки» по змінній iTimeWait до 0:

5. Читаємо стан порта за допомогою бібліотечної функції inPort з аргументами 0x64, &dwResult, 1.

6. Якщо dwResult & 0x02 = 0, - виходимо.

7. Закінчуємо час очікування. Перевіряємо, якщо iTimeWait<1, то повертаємо значення MY_ERROR_TIME.

8. Записуємо в порт команду перевірки інтерфейсу.

 

Тепер попробуємо відключити клавіатуру. Для цього застосуємо команду управління з кодом ADh.

 

Покроковий хід роботидля написання програми функції ADh на мові Асемблер для відключення клавіатури:

1. Чекаємо звільнення вхідного буфера клавіатури.

2. Запитуємо регістр стану AL про код 64.

3. Тестуємо якщо буфер AL зайнятий (010b).

4. Повторюємо запит.

5. Заносимо в регістр AL команду 0ADh- відключення клавіатури.

6. Записуємо в порт AL код команди 64h.

 

Покроковий хід роботидля написання програми функції АDh на мові С++ для відключення клавіатури.

1. Ініціалізуємо змінну dwResult типу DWORD для збереження результату.

2. Задаємо змінну iTimeWait =50000 (може бути і інше значення) типу іnt.

3. Перевіряємо наявність даних у вхідному буфері клавіатури:

4. Організовуємо цикл «поки» по змінній iTimeWait.

5. Читаємо стан порту бібліотечною функцією inPort за адресою 0x64 і двома іншими параметрами &dwResult і 1.

6. Порівнюємо, якщо dwResult і 0x02 дорівнюють нулю, виходимо з програми.

7. Закінчимо час очікування:

8. Якщо змінна iTimeWait<1, повертаємо код помилки MY_ERROR_TIME.

9. Записуємо в порт 0x64 команду відключення клавіатури 0xAD із третім параметром 1.

 

Для відновлення роботи клавіатури потрібно в регістр команд записати код AEh. Список інших команд представлений в таблиці 3.14. команди можуть мати додаткові параметри, які передаються у виді додаткового байту. Команди потрібно записати в порт 60h. Після посилання кожної команди потрібно перевірити біт 1 для порту 64h і тільки при його зануленні передавати додатковий параметр. Крім того, можна перевірити додатковий біт в порту 60h. Після виконання кожної команди крім EEh і FEh повертається код підтвердження FАh (читається з порту 60h). Якщо значення коду команди або параметра неприпустимі, клавіатура поверне код FEh. Якщо замість додаткового байту параметра заслати код нової команди, клавіатура її виконає, але про попередню забуде.

Код команди Опис
EDh EEh F0h F2h F3h F4h F5h F6h F7h F8h F9h FAh   FBh   FCh   FDh FEh FFh Встановити або скинути стан індикатора Виконати ехо-діагностику клавіатури Вибрати набір скан-кодів (перший, другий або третій) Отримати ідентифікатор клавіатури Настроїти параметри автоповтору і часу затримки Включити клавіатуру (буфер буде очищений) Відключити клавіатуру і завантажити значення по замовчуванню Встановити параметри по замовчуванню (10 символів/с, 500 мс) Встановити режим автоповтору для всіх клавіш Встановити для всіх клавіш передачу кодів натискання і відпускання Встановити для всіх клавіш передачу кодів натискання Встановити для всіх клавіш передачу кодів натискання відпускання і режим автоповтору Встановити для вказаної клавіші передачу кодів натискання і режим автоповтору Встановити для вказаної клавіші передачу кодів натискання і відпускання Встановити для вказаної клавіші передачу кодів натискання Виконати повторну передачу останнього переданого байту Скидання клавіатури

Таблиця 3.14. Набір команд для клавіатури

Деякі команди потребують додаткового опису, а тому розглянемо їх більш детально.

Команда EDh дозволяє управляти станом індикаторів на клавіатурі, розмір її – 2 байти. Перший із них розміщує код команди, а другий – бітову маску для налаштування індикаторів.

Біт Опис
3-7 Індикатор Scroll Lock (1- включений, 0- виключений) Індикатор Num Lock (1- включений, 0- виключений) Індикатор Caps Lock (1- включений, 0- виключений) Резерв

Таблиця 3.15. Біт стану індикаторів

Покроковий хід роботидля написання програми функції ЕDh на мові Асемблер. Наведемо простий приклад для управління індикатором Num Lock:

1. Чекаємо звільнення вхідного буфера клавіатури.

2. Запитуємо регістр стану AL про код 64.

3. Тестуємо, якщо буфер AL зайнятий (010b).

4. Повторюємо запит.

5. Заносимо в регістр AL команду управління індикаторами 0ЕDh.

6. Записуємо в порт даних 60h значення з порта AL.

7. Організовуємо очікування

8. Запитуємо регістр стану AL про код 64.

9. Тестуємо, якщо буфер AL зайнятий (010b).

10. Повторюємо запит.

11. Включаємо в буфер AL клавішу «Num Lock» (010b).

12. Записуємо в порт 60h значення буфера AL.

 

Покроковий хід роботидля написання програми функції ЕDh на мові С++ для управління індикатором Num Lock.

1. Ініціалізуємо змінну dwResult типу DWORD для збереження результату.

2. Об’являємо змінну очікування iTimeWait типу int рівну 50000 (можна вибрати і інше значення).

3. Перевіряємо наявність даних у вхідному буфері клавіатури:

4. Організовуємо цикл «поки» по змінній iTimeWait.

5. Читаємо стан порту бібліотечною функцією inPort за адресою 0x64 і двома іншими параметрами &dwResult і 1.

6. Порівнюємо, якщо dwResult і 0x02 дорівнюють нулю виходимо з програми.

7. Закінчимо час очікування:

8. Якщо змінна iTimeWait<1, повертаємо код помилки MY_ERROR_TIME.

9. Записуємо в порт 0x64 команду відключення клавіатури 0xЕD із третім параметром 1.

10. Відновлюємо змінну iTimeWait =50000 того ж типу, що і раніше.

11. Перевіряємо наявність даних у вхідному буфері клавіатури:

12. Організовуємо цикл «поки» по змінній iTimeWait.

13. Читаємо стан порту бібліотечною функцією inPort за адресою 0x64 і двома іншими параметрами &dwResult і 1.

14. Порівнюємо, якщо dwResult і 0x02 дорівнюють нулю, виходимо з програми.

15. Закінчимо час очікування:

16. Якщо змінна iTimeWait<1, повертаємо код помилки MY_ERROR_TIME.

17. Записуємо в порт 0x64 команду відключення клавіатури 0xЕD із третім параметром 1.

 

Команда EEh дозволяє протестувати клавіатуру на предмет роботоздатності. Якщо в клавіатурі були збої, потрібно здійснити скидання (команда FFh) і послати цю команду. Значення повернення, відмінне від EEh, явно вкаже на збої клавіатури. Можливо, потрібно виключити і включити електросітку для відновлення роботоздатності пристрою.

Команда F2h дозволяє отримати ідентифікатор клавіатури і переконатися в її наявності. Після її виконання клавіатура поверне код підтвердження FАh, а потім ідентифікатор: для більшості клавіатур – це 2 коди – АВh і 83h (для окремих клавіатур 41h). Розглянемо приклад отримання ідентифікатора клавіатури нижче.

Покроковий хід роботидля написання програми функції F2h на мові Асемблер для отримання ідентифікатора клавіатури:

1. Чекаємо звільнення вхідного буфера клавіатури.

2. Запитуємо регістр стану AL про код 64.

3. Тестуємо, якщо буфер AL зайнятий (010b).

4. Повторюємо запит.

5. Заносимо в регістр AL команду управління індикаторами 0F2h.

6. Записуємо в порт даних 60h значення з порта AL

7. Організовуємо очікування:

8. Отримуємо підтвердження з регістра стану AL про код 60h.

9. Виконання команди: буфер AL, команда 0FFh.

10. Виникла помилка.

11. Організовуємо очікування:

12. Отримуємо підтвердження в буфер AL вмістиме порта 60h.

13. Зчитуємо перший байт ідентифікатора (0АВh) в буфер AL.

14. Виникла помилка (ErrorHnd).

15. Організовуємо очікування:

16. Отримуємо підтвердження в буфер AL вмістиме порта 60h.

17. Зчитуємо перший байт ідентифікатора (83h) в буфер AL.

18. Виникла помилка (ErrorHnd).

19. Здійснюємо повернення.

20. Організовуємо очікування:

21. Запитуємо регістр стану AL про код 64.

22. Тестуємо, якщо буфер AL зайнятий (код 01b).

23. Повторюємо опитування.

24. Здійснюємо повернення.

В даному прикладі ми послали команду F2h контроллеру клавіатури і послідовно отримали три байти: байт підтримки і два ідентифікатори клавіатури. Аналогічно цей приклад можна привести на С++.

Покроковий хід роботидля написання програми функції F2h на мові С++ для отримання ідентифікатора клавіатури:

1. Для зручності напишемо окрему функцію запиту даних в буфері.

2. Функція WaitData () для реалізації затримки приймає значення true i falce.

3. Задаємо ініціалізацію змінної dwResult типу DWORD для збереження результату.

4. Задаємо змінну довжини затримки iTimeWait типу int рівну 50000.

5. Перевіряємо наявність даних у вхідному буфері клавіатури:

6. Організовуємо цикл «поки» по змінній iTimeWait> 0.

7. Читаємо стан порту функцією inPort з адресою порту 0x64 і значення ложимо в змінну dwResult через операцію «взяття адреси» посилання на змінну, третій аргумент задаємо 1.

8. Порівнюємо, якщо значення dwResult і біта 1 на 0 вірне, то повертаємо значення true.

9. Закінчуєм час затримки:

10. Порівнюємо, якщо значення iTimeWait < 1, повертаємо false.

11. При інших варіантах вирішення функції WaitData () повертаємо false;

12. Основна програма:

13. Задаємо ініціалізацію змінної dwResult типу DWORD для збереження результату.

14. Задаємо змінну довжини затримки iTimeWait типу int рівну 50000.

15. Перевіряємо наявність даних у вхідному буфері клавіатури:

16. Організовуємо цикл «поки» по змінній iTimeWait> 0.

17. Читаємо стан порту функцією inPort з адресою порту 0x64 і значення ложимо в змінну dwResult через операцію «взяття адреси» посилання на змінну, третій аргумент задаємо 1.

18. Порівнюємо, якщо значення dwResult і біта 2 на 0 вірне, то виходимо з програми.

19. Закінчився час затримки:

20. Перевіряємо, якщо значення змінної часу затримки iTimeWait < 1, то повертаємо код помилки системний MY_ERROR_TIME.

21. Записуємо в порт 0x60 код команди 0xF2 з (перевіркою 1-го біта) параметром 1.

22. Чекаємо отримання першого байта:

23. Знову задаємо змінну затримки iTimeWait рівну 50000.

24. Перевіряємо, чи отриманий байт функцією WaitData ().Отриманий!

25. Записуємо в порт з адресою 0x60 значення dwResult через операцію взяття адреси по посиланню і перевіряємо біт 1.

26. Перевіряємо на рівність змінної dwResult коду FАh.

27. Якщо не рівна FАh, то повертаємо код помилки MY_ERROR.

28. Інакше – даних немає, повертаємо код помилки MY_ERROR.

29. Чекаємо отримання другого байта:

30. Знову задаємо змінну затримки iTimeWait рівну 50000.

31. Перевіряємо, чи отриманий байт функцією WaitData (). Отриманий!

32. Записуємо в порт з адресою 0x60 значення dwResult через операцію взяття адреси по посиланню і перевіряємо біт 1.

33. Перевіряємо на рівність змінної dwResult коду АВh.

34. Якщо не рівна АВh, то повертаємо код помилки MY_ERROR.

35. Інакше – даних немає, повертаємо код помилки MY_ERROR.

36. Чекаємо отримання третього байта:

37. Знову задаємо змінну затримки iTimeWait рівну 50000.

38. Перевіряємо чи отриманий байт функцією WaitData (). Отриманий!

39. Записуємо в порт з адресою 0x60 значення dwResult через операцію взяття адреси по посиланню і перевіряємо біт 1.

40. Перевіряємо на рівність змінної dwResult коду 83h.

41. Якщо не рівна АВh, то повертаємо код помилки MY_ERROR.

42. Інакше – даних немає, повертаємо код помилки MY_ERROR.

43. Ідентифікатор клавіатури успішно отриманий.

Команда F3h - дозволяє встановити частоту і час затримки для автоматичного повтору набраного на клавіатурі символу. Розмір команди рівний 2 байти, де 1-й – код команди, 2-й – опис параметрів налаштування автоповтору.

 

Біти Опис
0-4 5-6 Код значення частоти автоповтору Код значення часу затримки резерв

Таблиця 3.16. Зміст байту настройки автоповтору

Коди значень частоти автоповтору і часу затримки були представлені відповідно в табл.3.7 і табл.3.6. Приклад використання команди F3h показаний в наступному фрагменті програми.

Покроковий хід роботидля написання програми функції F3h на мові Асемблер для встановлення частоти і часу затримки автоповтору:

1. Чекаємо звільнення вхідного буфера клавіатури.

2. Запитуємо регістр стану(в AL про код 64).

3. Тестуємо, якщо буфер AL зайнятий (010b).

4. Повторюємо запит.

5. Заносимо в регістр AL команду управління індикаторами 0F3h.

6. Записуємо в порт даних 60h значення з буфера AL.

7. Організовуємо цикл затримки data_wait.

8. Запитуємо регістр стану AL про код 64.

9. Тестуємо, якщо буфер AL зайнятий (010b).

10. Повторюємо запит.

11. Отримуємо в буфері AL підтвердження стану регістра 60h.

12. Заносимо в буфер AL виконання команди 0FAh.

13. Виникла помилка ErrorHnd.

14. Організовуємо цикл затримки keyb_wait.

15. Запитуємо регістр стану AL про код 64.

16. Тестуємо, якщо буфер AL зайнятий (010b).

17. Повторюємо запит.

18. Заносимо в регістр стану AL частоту 28h: 15 символів/с і 750 мс.

19. Записуємо в порт даних 60h значення регістра стану AL.

Аналогічний код для установки параметрів автоповтору (частота 15 символів/с і час 750 мс) може бути представлений в С++.

Покроковий хід роботидля написання програми функції F3h на мові С++ для встановлення частоти і часу затримки автоповтору:

1. Задаємо ініціалізацію змінної dwResult типу DWORD для збереження результату.

2. Задаємо змінну довжини затримки iTimeWait типу int рівну 50000.

3. Перевіряємо наявність даних у вхідному буфері клавіатури:

4. Організовуємо цикл «поки» по змінній часу затримки iTimeWait> 0.

5. Читаємо стан порту функцією inPort з адресою порту 0x64 і значення ложимо в змінну dwResult через операцію «взяття адреси» посилання на змінну, третій аргумент задаємо 1.

6. Порівнюємо, якщо значення dwResult і біта 2 на 0 вірне, то виходимо з програми.

7. Закінчився час затримки:

8. Перевіряємо, якщо значення змінної часу затримки iTimeWait < 1, то повертаємо системний код помилки MY_ERROR_TIME.

9. Записуємо в порт 0x60 код команди 0xF3 з (перевіркою 1-го біта) параметром 1.

10. Задаємо змінну довжини затримки iTimeWait типу int рівну 50000.

11. Перевіряємо наявність даних у вхідному буфері клавіатури:

12. Організовуємо цикл «поки» по змінній часу затримки iTimeWait> 0.

13. Читаємо стан порту функцією inPort з адресою порту 0x64 і значення ложимо в змінну dwResult через операцію «взяття адреси» посилання на змінну, третій аргумент задаємо 1.

14. Порівнюємо, якщо значення dwResult і біта 2 на 0 вірне, то виходимо з програми.

15. Закінчився час затримки:

16. Перевіряємо, якщо значення змінної часу затримки iTimeWait < 1, то повертаємо системний код помилки MY_ERROR_TIME.

17. Записуємо в порт 0x60 значення змінної dwResult через операцію «взяття адреси» посилання на змінну з (перевіркою 1-го біта) параметром 1.

18. Перевіряємо dwResult на рівність коду FAh; якщо не дорівнює, то повертаємо код помилки MY_ERROR.

19. Задаємо змінну довжини затримки iTimeWait типу int рівну 50000.

20. Перевіряємо наявність даних у вхідному буфері клавіатури:

21. Організовуємо цикл «поки» по змінній часу затримки iTimeWait> 0.

22. Читаємо стан порту функцією inPort з адресою порту 0x64 і значення ложимо в змінну dwResult через операцію «взяття адреси» посилання на змінну, третій аргумент задаємо 1.

23. Порівнюємо, якщо значення dwResult і біта 2 на 0 вірне, то виходимо з програми.

24. Закінчився час затримки:

25. Перевіряємо, якщо значення змінної часу затримки iTimeWait < 1, то повертаємо системний код помилки MY_ERROR_TIME.

26. Записуєм в порт 0x60 значення частоти і часу затримки з кодом 0x28 і з третім (перевіркою 1-го біта) параметром 1.

Якщо порівняти програмування клавіатури з використанням переривання int 16h і безпосередньо портів, то перший спосіб виявиться зручнішим. Однак доступ через апаратні порти дає виграш дещо в швидкості і дозволяє застосовувати весь набір команд для будь-яких випадків. Приведемо скан-коди команд, які використовуються у всіх клавіатурах (табл.3.17).

Клавіша Код натискання Код відпускання Клавіша Код натискання Код відпускання
F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12     A B C D E F G H I J K L M N O P Q R S T U V W X Y Z (IE) Search (IE) Home (IE) Stop (IE) Refresh (IE) Forward (IE) Back (IE) Favorites Volume Up Volume Dwn Mute Play Stop 0C 0B 0A 1E 2E   3D 3E   1C 2B 3B 4B 3A 4D 2D 1B 2C 3C 2A 1D 1A E0, 10 E0, 3A E0, 28 E0, 20 E0, 30 E0, 38 E0, 18 E0, 32 E0, 21 E0, 23 E0, 34 E0, 3B F0, 05 F0, 06 F0, 04 F0, 0C F0, 03 F0, 0B F0, 83 F0, 0A F0, 01 F0, 09 F0, 78 F0, 07 F0, 45 F0, 16 F0, 1E F0, 26 F0, 25 F0, 2E F0, 36   F0, 3D F0, 3E   F0, 46 F0, 1C F0, 32 F0, 21 F0, 23 F0, 24 F0, 2B F0, 34 F0, 33 F0, 43 F0, 3B F0, 42 F0, 4B F0, 3A F0, 31 F0, 44 F0, 4D F0, 15 F0, 2D F0, 1B F0, 2C F0, 3C F0, 2A F0, 1D F0, 22 F0, 35 F0, 1A E0, F0, 10 E0, F0, 3A E0, F0, 28 E0, F0, 20 E0, F0, 30 E0, F0, 38 E0, F0, 18 E0, F0, 32 E0, F0, 21 E0, F0, 23 E0, F0, 34 E0, F0, 3B ‘ - = Bachspace Tab Space Caps Lock Esc Enter Left Ctrl Right Ctrl Left Alt Right Alt Left Shift Right Shift Left Win Right Win Apps Print Screen   Scroll Lock Pause   [ ] ; | , . / Insert Home Delete End Page Up Page Down Up Arrow Down Arrow Left Arrow Right Arrow Num Lock (+) Enter (+) / (+) * (+) – (+) + (+) . (+) 0 (+) 1 (+) 2 (+) 3 (+) 4 (+) 5 (+) 6 (+) 7 (+) 8 (+) 9 Next Track Prevs Track Wake Power Sleep 0E 4E 0D 5A E0, 14 E0, 11 E0, 1F E0, 27 E0, 2F E0, 12; E0, 7C 7E E1, 14, 77 E1, F0, 14 F0, 77 5B 4C 4A E0, 70 E0, 6C E0, 71 E0, 69 E0, 7D E0, 7A E0, 75 E0, 72 E0, 6B E0, 74 E0, 5A E0, 4A 7C 7B 7A 6B 6C 7D E0, 4D E0, 15 E0, 5E E0, 37 E0, 3F F0, 0E F0, 4E F0, 55 F0, 66 F0, 0D F0, 29 F0, 58 F0, 76 F0, 5A F0, 14 E0, F0, 14 F0, 11 E0, F0, 11 F0, 12 F0, 59 E0, F0, 1F E0, F0, 27 E0, F0, 2F EO, FO, 7C E0, F0, 12 F0, 7E Нема   F0, 54 F0, 5B F0, 4C F0, 52 F0, 41 F0, 49 F0, 4A E0, F0, 70 E0, F0, 6C E0, F0, 71 E0, F0, 69 E0, F0, 7D E0, F0, 7A E0, F0, 75 E0, F0, 72 E0, F0, 6B E0, F0, 74 F0, 77 E0, F0, 5A E0, F0, 4A F0, 7C F0, 7B F0, 79 F0, 71 F0, 70 F0, 69 F0, 72 F0, 7A F0, 6B F0, 73 F0, 74 F0, 6C F0, 75 F0, 7D E0, F0, 4D E0, F0, 15 E0, F0, 5E E0, F0, 37 E0, F0, 3F

Таблиця 3.17. Другий набір скан-кодів клавіатури

Існує ще один порт 61h, який використовується в сьогоднішніх комп’ютерах для управління вмонтованим динаміком (спікером). Він служить для читання і запису і дозволяє управляти деякими функціями клавіатури (для співставлення зі старими моделями). Формат регістра 61h представлений в табл. 3.18.

Біт Опис
0-5 Для клавіатури не використовуються Низький рівень сигналу Відключення клавіатури (1- включити, 0- відключити

Таблиця.3.18. Формат регістра 61h

Як видно, для клавіатури відведені тільки 2 біти: 6-й і 7-й. Щоб відключити і включити клавіатуру, потрібно написати код програми, скориставшись покрочною схемою нижче.

Покроковий хід роботидля написання програми на мові Асемблер для відключення і включення клавіатури:

1. Прочитати стан порту 61h в буфер AL.

2. Виконати побітову операцію «АБО» - 80h в AL.

3. Виключити клавіатуру записавши в порт 61h стан буфера AL.

 

4. Прочитати в буфер AL стан порту 61h.

5. Обнулити в AL 7 біт (код 01111111h) для включення клавіатури.

6. Включити клавіатуру, занести в порт 61h значення буфера AL.

Покроковий хід роботидля написання програми на мові С++ для відключення і включення клавіатури:

1. Напишемо окрему функцію управління клавіатурою:

2. Функція LockUnlockKeyboard для включення і виключення клавіатури з аргументом bLock типу bool.

3. Ініціалізуємо змінну dwResult типу DWORD.

4. Якщо змінна bLock не 0 – блокувати клавіатуру.

5. Записуємо в порт з адресою 0x61 значення dwResult і перевіряємо 1-й біт.

6. Виконуємо побітове додавання dwResult і 0x80.

7. Записуємо в порт 0x61 значення dwResult і перевіряємо 1-й біт.

8. Інакше – розблокувати клавіатуру:

9. Записуємо в порт з адресою 0x61 значення dwResult і перевіряємо 1-й біт.

10. Виконуємо побітове додавання dwResult і 0x7F.

11. Записуємо в порт 0x61 значення dwResult і перевіряємо 1-й біт.

12. Кінець функції.

 

Варіанти для практичного завдання: скласти програми поваріантно поданих функцій на відповідних мовах програмування.

 

Варіант Асемблер С++ Варіант Асемблер С++
ABh Виключення івключення клавіатури Виключення івключення клавіатури ABh
ADh F3h F3h ADh
EDh F2h F2h EDh
EEh EEh EEh EEh
F2h EDh EDh F2h
F3h ADh ADh F3h
Виключення івключення клавіатури ABh ABh Виключення івключення клавіатури
ABh EDh EDh ABh
ADh ADh ADh ADh
EDh ABh ABh EDh
EEh Виключення івключення клавіатури Виключення івключення клавіатури EEh
F2h F3h F3h F2h
F3h F2h F2h F3h
Виключення івключення клавіатури EEh EEh Виключення івключення клавіатури
EDh F3h F3h EDh

 

 



Поделиться:

Дата добавления: 2015-08-05; просмотров: 103; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты