КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Теоретичні відомості. Існує 6 функцій для роботи з портами: три із них використовуються для виводу, а три – для вводуІснує 6 функцій для роботи з портами: три із них використовуються для виводу, а три – для вводу. До функцій читання відносяться: · _inp – дозволяє зчитати один байт із вказаного порту; · _inpw – дозволяє зчитати одне слово з указаного порту; · _inpd – дозволяє прочитати подвійне слово з указаного порту. У всіх цих функціях потрібно вказати номер порту зчитування. Максимальне значення адреси порту обмежене числом 65535, якого зовсім достатньо для роботи зі всіма існуючими в системі значеннями. Покроковий хід роботидля написання макета програми використання функцій читання даних із порту: 1. Підключаємо необхідний файл ресурсів <conio.h> зі стандартної бібліотеки. 2. Прочитаємо значення базової пам’яті в кілобайтах, використовуючи бібліотечну системну функцію GetBaseMemory.Результат повернення типу іnt. Функція задається без параметрів. 3. Об’являємо змінні lowBase і highBase типу BYTE для отримання старшого і молодшого байтів, пока обнулюємо їх. 4. Читаємо інформацію з CMOS-пам’яті: Функцією _outp бібліотечного класу для роботи з портами (0x70) записуємо номер першого регістра 0x15. 5. Читаємо молодший біт командою _inp (0x71) і присвоюємо його значення змінній lowBase. 6. Функцією _outp бібліотечного класу для роботи з портами (0x70) записуємо номер другого регістра 0x16. 7. Читаємо старший біт командою _inp (0x71) і присвоюємо його значення змінній highBase. 8. Повертаємо розмір базової пам’яті в кілобайтах командою return і побітовим додаванням highBase << 8 та lowBase змінних. Покроковий хід роботидля написання макету програми управління клавіатурою: 1. Функція KeyBoardOnOff для управління клавіатурою без значення повернення (типу void) з логічним параметром bOff. 2. Об’являємо змінну state для текучого стану типу BYTE. 3. Якщо bOff не нуль то виключаємо клавіатуру. 4. Застосовуючи функціючитання з системного класу _inp з адресою 0x61, отримуємо текучий стан state. 5. Встановлюємо біт 7 в 1 командою state |=0x80. 6. Командою _outp записуємо обновлене значення змінної state в порт 0x61 Функції запису в порт мають два аргументи: перший вказує номер порту, другий – для зберігання даних передачі. До них відносяться: · _outp – дозволяє записати один байт в указаний порт; · _outpw - дозволяє записати слово в указаний порт; · _outpd - дозволяє записати подвійне слово в указаний порт. Максимальне значення адреси порту також обмежене числом 65535. Приклад застосування цих функцій: Покроковий хід роботидля написання макету програми використання функцій, які в комплексі використовуються для запису даних в порт: 1. Напишемо функціюResetDrive типу bool для скидання даних пристрою АТА/АТАРІ. 2. Використовуємо перший пристрій на другому каналі (як правило CD-ROM). 3. Командою _outp пишемо команду скидання 08h для даних пристрою 0x177. 4. Перевіряємо результат виконання: 5. Організовуємо цикл по змінній 0<i <5000. 6. Перевіряємо командою _inp біт 7- BUSY! Тобто ((0x177) & 0x80) = 0x00. 7. Команда успішно завершена, повертаємо значення true. 8. Повертаємо значення false.
1. Напишемо функціюEject з логічним поверненням і параметром bOpen типу bool для управління лотком CD-ROM (відкриттям/закриттям). 2. Ініціалізуємо змінну iTimeWait = 50000 часу затримки типу int. 3. Створюємо формат пакетної команди для відкриття лотка CD-ROM (6-й елемент массиву Eject [6], створюємо рядок { 0x1B, 0, 2, 0, 0, 0 } типу WORD. 4. Створюємо формат пакетної команди для закриття лотка CD-ROM (6-й елемент массиву Eject [6], створюємо рядок { 0x1B, 0, 3, 0, 0, 0 } типу WORD). 5. Перевіряємо готовність пристрою: 6. Знову організовуємо цикл по змінній затримки iTimeWait. 7. Читаємо стан порту функціями_inp (0x177) & 0x80 == 0x00 і _inp (0x177) & 0x08 == 0x00. Якщо ці дві умови виконані – виходимо з програми функції. 8. Якщо iTimeWait < 1 - закінчився час очікування, здійснюємо повернення. 9. Вибираємо перший пристрій на другому каналі: 10. Пишемо в порт 0x176 команду пакетної передачі 0xA0 (А0h) функцією _outp. 11. Перед посилкою пакетної команди потрібно перевірити стан порта: 12. Ініціалізуємо змінну iTimeWait = 50000 часу затримки типу int. 13. Очікуємо готовність пристрою: 14. Знову організовуємо цикл по змінній затримки iTimeWait. 15. Читаємо стан порту функціями _inp (0x177) & 0x80 == 0x00 і _inp (0x177) & 0x08 == 0x00 і перевіряємо, якщо рівні 0 – виходимо з циклу. 16. Якщо iTimeWait < 1, закінчився час затримки, поветаємось. 17. Пишемо в порт 0x177 команду пакетної передачі A0h. 18. Очікуємо готовність пристрою: 19. Знову організовуємо цикл по змінній затримки iTimeWait. 20. Читаємо стан порту функціями _inp (0x177) & 0x80 == 0x00 і _inp (0x177) & 0x08 == 0x01 і перевіряємо, якщо рівні 0 – виходимо з циклу. 21. Якщо iTimeWait < 1, закінчився час затримки, поветаємось. 22. Пишемо в порт пакетну команду: 23. Якщо параметр bOpen не 0, відкрити лоток. 24. Організовуємо цикл по змінній і від 0 до 6 для запису усіх 6 елементів массиву Eject[i], з яких складається 12-байтова команда. 25. Записуємо в порт з адресом 0x170 12-байтову команду за допомогою функції _outpw і по додавання елементів масиву Eject[i] (кожен по 2 байти). 26. Інакше - закрити лоток: 27. Організовуємо цикл по змінній j від 0 до 6 для формування 12-байтної команди закриття з елементів масиву Close[j]. 28. Записуємо в порт з адресом 0x170 12-байтову команду за допомогою функції _outpw і по додавання елементів масиву Close[j] (кожен по 2 байти). 29. Перевіряємо результат виконання команди, якщо потрібно: 30. Ініціалізуємо змінну iTimeWait = 50000 часу затримки типу int. 31. Очікуємо готовність пристрою: 32. Знову організовуємо цикл по змінній затримки iTimeWait. 33. Читаємо стан порту функціями _inp (0x177) & 0x80 == 0x00 і _inp (0x177) & 0x01 == 0x00 і _inp (0x177) & 0x40 == 0x01 перевіряємо, якщо рівні 0 – виходимо з циклу. 34. Якщо змінна iTimeWait < 1 - закінчився час затримки, повертаємось з функції.
Варіанти практичних завдань. Написати фрагменти програм на мові С++.
|