Студопедия

КАТЕГОРИИ:

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


Теоретичні відомості. Існує 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 - закінчився час затримки, повертаємось з функції.

 

Варіанти практичних завдань. Написати фрагменти програм на мові С++.

 

Варіант 1 Варіант 2 Варіант 3 Варіант 4
Написати программу функції для читання даних із порту, вживаючи системні бібліотечні функції для читання. Написати программу функції для управління клавіатурою при читанні/записі. Написати программу функції для скидання даних пристрою АТА/АТАРІ. Написати программу функції для управління лотком CD-ROM ізапису даних, вживаючи системні бібліотечні функції для запису.

 

 



Поделиться:

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





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