Лабораторна робота № 4 - Ввід інформації з клавіатури. Обмін інформації з файлами засобами мови Turbo C

Назва роботи : Організація функціонування маніпулятора "миша"

Мета роботи: Ознайомитись з принципами функціонуваня маніпулятора "миша". Засобами Turbo C організувати функціонування маніпулятора "миша".

Загальні положення

Апаратно маніпулятор являє собою периферійні пристрій, що підключається до одного з адапторів послідовного зв'язку комп'ютера. До складу маніпулятора входять датчики преміщення "миші" в горизонтальному та вертикальному напрямках, індикатор натиску кнопок та блок зв'язку з інтерфейсом. Блок зв'язку з інтерфейсом передає в адаптер послідовного зв'язку байти даних при довільному натисканні кнопок та переміщенні "миші" в горизонтальному та вертикальному напрямках на певну величину, так звану "міккі". Один "міккі" звичайно дорівнює 1/200 частині дюйма.

Значення зміщення, що передаються в адаптер, мають "знак". Наприклад, при переміщенні маніпулятора знизу догори на один "міккі" передається байт 01Н, а при переміщенні зверху донизу - байт FFH. Обробник переривань від послідовного адаптера сумує отримані значення з врахуванням знаку. Таким чином, завжди є можливість визначити "біжучу" позицію маніпулятора відносо моменту початку спостереження. Звичайно спостереження за "мишею" починаються після завантаження драйвера "миші" або виконання операції ініціалізації "миші" з програми користувача.

Основними частинами драйвера миші є :

Секція інсталяції драйвера.

Обробник апаратних переривань від адаптера послідовного зв'язку (в ІВМ РС АТ адптерам СОМ1 та СОМ2 відповідають переривання - 0СН та 0СВ).

Обробник програмного переривання інтерфейса прикладної програми з "мишею" (переривання 33Н).

Обробник програмного переривання 10Н керування екраном.

Кожна програма, що використовує для вводу інформації маніпулятор

"миша", повинна виконати такі підготовчі операції:

Визначити, чи інстальований драйвер "миші".

Задати вид і форму курсора маніпулятора.

Описати межі переміщення курсора "миші" по екрану.

Описати "чутливість" курсора, яка дорівнює числу "міккі",що приходяться на один піксель екрана по горизонталі та вертикалі.

Встановити поріг "подвоєної" швидкості курсора "миші".

"Включити" курсор маніпулятора( зробити видимим на екрані).

Встановити курсор в початкову позицію на екрані у відповідності з потребами програм.

Багато з цих дій допомагає виконати функція ініціалізації та визначення біжучого стану маніпулятора стає в стан по замовченню:

Курсор маніпулятора встановлений в центрі екрана та виключений.

Чутливість маніпулятора по вертикалі дорівнює 2 "міккі" на піксел, по горизонталі - 1 "міккі" на піксел.

Поріг "подвійної" швидкості встановлюється рівним 64 "міккі"/сек.

Встановлюється форма курсора по змовченню.

Координати лівого верхнього кута області переміщення курсора маніпулятора відповідають координатам (00), а координати ніжнього правого кута області перемщення маніпулятора - максимальним координатам біжучого відеорежиму мінус 1.

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

Сі-функція завдання параметрів курсора маніпулятора "миша" для текстового режиму роботи адаптера в програмі *L4-1.C*.

В графічному режимі роботи відеоадаптора може бути описана довільна власна форма курсора в межах прямокутника 16x16 пікселів курсорів в графічному режимі описується двома масками розміром 16x16 біт кожна. XOR-маска (маска курсора ). При переміщенні курсора попередній вміст екрану відновлюється драйвером "миші ". Маски, комбінують, визначають спосіб обробки біжучого коду кольору пікселя на екрані (pixel-Picture Element - телевізійна точка на екрані).

Біт AND-маски

Біт XOR - маски

Колір піксела на екрані

0

0

Колір фону

0

1

Білий колір

1

0

Біжучий колір пікселя

1

1

Побітова інверсія біжучого кольору пікселя

В графічні режимах задається так звана "гаряча пляма" ( Hot spot) у відносних координатах, за точку відліку яких приймається верхній лівий кут прямокутника 16x16 пікселів. "Гаряча пляма" - це той піксел, на який вказує в біжучий момент графічний курсор. Сі-функція установки графічного "миші" в програмі *L4-2.C*.Для отримання графічнрго курсора,

Якого видно на довільному фоні, поступають наступним чином. AND-маскою задають із слів FFFFH, a XOR-маску описують таким чином, щоб в нійстояли одиниці в тих бітах, які утворюють контури кукрсора, а нулі - в усіх решта бітах маски. В прикладі викликається функція для завдання графічного курсору у вигляді стрілки (функція set-graph-cursor ( ) ).

Одразу після ініціалізації екрану, за область допустимих переміщень курсора по замовченню приймається весь екран. Але завжди є можливість обмежити переміщення курсору окремо по горизонталі та по вертикалі. Сі-фуекції для установки меж переміщення курсору по вертикалі та по горизонталі в програмах *L4-3.C*, *L4-4.C*. Після того, як виконані всі необхідні підготовчі операції, програма може використовувати маніпулятор для вводу інформації. Інформація, що вводиться, - це біжуча позиція курсора та стан кнопок маніпулятора. Періодичний ввід інформації з "миші" та попадання курсору в ті або інші області екрану дозволяють виконувати потрібні дії - "відкрити2 підменю і т. ін. визначення стану кнопки (натиснута двічі) використовується як команда на виконання програмою додаткових дій.

Сі-функція визначення біжучих координат курсора та стану кнопок "миші" в прикладі *L4-5.C* та прикладі *L4-6.C* (фіксація одноразового або дворазового натиску на кнопку "миші").

При переміщенні маніпулятоорапостолу, драйвер пересуває "мишу" по екрану без участі програми. Але і прикладна програма має можливість керувати позицією курсора "миші". Сі-функція позиціонування курсору "миші" в точку екрана з координатами int hor-position та int ver-position в прикладі *L4-7.C*.

Для отримання демонстраційної програми, яка читає стан "миші" та фіксує всі переміщення курсора "миші" в межах екрану у верхньому рядку треба, використовуючи файл проекту, виконати сумісну компіляцію файлів : ВООК3 - L3-13.C, L4-1.C, L4-3.C, L4-5.C - L4-8.C та ВООК2 - L8-11.C, L9-5.C, L9-8.C, L9-9.C.

Для отримання демонстраційної програми, що демонструє можливість використання вводу з "миші" для "малювати", треба, використовуючи файл проекту, виконати сумісну компіляцію файлів ВООК3 - L4-1.C-L4-5.C, L4-7.C - L4-9.C та ВООК2 - L8-11.C, L9-2.C, L9-5.C. В ції програмі адаптер встаноалювається в графічний режим 12Н. Далі описується графічний курсор. В верхній частині екрану виводяться номера рядка та стовпчика курсора маніпулятора. Окрім того, відображається код кольора пікселя, що використовується для "малювання".Для виводу текста в графічномуу режимі використовується варіанти функція scroll( ), hor-pm( ) та printche ( ), що працюють через BIOS (ВООК2 - L9-5.C, L9-2.C, L9-3.C. Позиціонування курсора виконує функція goto-xy ( ) (L8-11.C). При натисканні лівої кнопки маніпулятора він "малює" піксел в біжучий позиції. При кожому натисканні правої кнопки код кольору малюємого піксела збільшується на 1. При одночастному натисканні лівої та правої кнопок "миші" демонстраційна програма заверщує свою роботу для виводу пікселя на екран використовуються функція plot( )(BOOK2-L10-5.C).

Порядок виконаня роботи:

1. В середовищі MS DOS ініціалізувати одну з систем програмування :

Turbo C, Turbo C++,Borland C++.

    2. Компілювати та виконуючі відповідні приклади, розглянути особливості функціонування функцій керування маніпулятором "миша". 3. Зкомпілювати та виконати програми, що демонструють різні режими

Використання "миші". інформація файла клавіатура маніпулятор миша

4. Зробити висновки відносно можливостей маніпулятора "миші".

Результат виконання програми.

#include <dos. h>

#include <stdio. h>

#include <stdlib. h>

#include <conio. h>

#define CURSOR_ON() _AX=1; geninterrupt(0x33);

#define CURSOR_OFF() _AX=2; geninterrupt(0x33);

Static unsigned screen_and_cursor_masks[] =

{0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,

0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,

0x8000, 0xC000, 0xA000, 0x9000, 0xA800, 0xB400, 0xBA00, 0xBD00,

0xBE80, 0xBF40, 0xBFA0, 0xBFD0, 0xBFE0, 0xAE00, 0xA300, 0xE300,

};

Struct MOUSE_STATE {

Char buttons;

Int hor_position;

Int ver_position;

};

Void set_text_cursor(int mode, unsigned int AND_mask, unsigned int XOR_mask){

Struct REGPACK r;

R. r_ax = 0x0a;

R. r_bx = mode;

R. r_cx = AND_mask;

R. r_dx = XOR_mask;

Intr(0x33, &;r);

}

Void set_graph_cursor(int hot_spot_column, int hot_spot_row, unsigned int far * screen_and_cursor_masks){

Struct REGPACK r;

R. r_ax = 9;

R. r_bx = hot_spot_column;

R. r_cx = hot_spot_row;

R. r_es = FP_SEG(screen_and_cursor_masks);

R. r_dx = FP_OFF(screen_and_cursor_masks);

Intr(0x33, &;r);

}

Void hor_movement(int start_hor_movement, int end_hor_movement){

_AX = 7;

_CX = start_hor_movement;

_DX = end_hor_movement;

Geninterrupt(0x33);

}

Void vert_movement(int start_vert_movement, int end_vert_movement){

_AX = 8;

_CX = start_vert_movement;

_DX = end_vert_movement;

Geninterrupt(0x33);

}

Void ms_state(struct MOUSE_STATE * current_state){

Struct REGPACK r;

R. r_ax = 3;

Intr(0x33, &;r);

Current_state -> buttons = r. r_bx;

Current_state -> hor_position = r. r_cx;

Current_state -> ver_position = r. r_dx;

}

Int ms_release(struct MOUSE_STATE * current_state){

Struct REGPACK r;

R. r_ax = 6;

R. r_bx = current_state -> buttons;

Intr(0x33, &;r);

Current_state -> hor_position = r. r_cx;

Current_state -> ver_position = r. r_dx;

Return r. r_bx;

}

Void ms_move(int hor_position, int ver_position){

_AX = 4;

_CX = hor_position;

_DX = ver_position;

Geninterrupt(0x33);

}

Void main(){

Struct MOUSE_STATE cur_state;

_AX=0;

Geninterrupt(0x33);

If(_AX==0){

Puts("No mouse!!!");

Exit(-1);

}

Set_text_cursor(1, 0x000e, 0x000f);

Hor_movement(0, 639);

Vert_movement(16, 199);

Ms_move(0, 160);

CURSOR_ON();

While (cur_state. buttons!= 0x03){

Ms_state(&;cur_state);

Gotoxy(1,1);

Printf("x=%i ",cur_state. hor_position);

Printf("y=%i ",cur_state. ver_position);

If (cur_state. buttons == 0x01) printf("left ");

If (cur_state. buttons == 0x02) printf("right ");

If (cur_state. buttons == 0x03) printf("both ");

}

CURSOR_OFF();

_AX = 0x0012;

Geninterrupt(0x10);

_AX=0;

Geninterrupt(0x33);

If(_AX==0){

Puts("no mouse!");

Exit(-1);

}

Set_graph_cursor(0, 0, screen_and_cursor_masks);

Hor_movement(0, 639);

Vert_movement(16, 199);

Ms_move(160, 160);

Ms_state(&;cur_state);

CURSOR_ON();

While (cur_state. buttons!= 0x01){

Ms_state(&;cur_state);

}

CURSOR_OFF(); }

Похожие статьи




Лабораторна робота № 4 - Ввід інформації з клавіатури. Обмін інформації з файлами засобами мови Turbo C

Предыдущая | Следующая