Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаба КЛАВИАТУРА IBM PC. ИСПОЛЬЗОВАНИЕ ПРЕРЫВАНИЙ ЭВМ.docx
Скачиваний:
2
Добавлен:
08.07.2025
Размер:
8.97 Mб
Скачать
  1. Задание на лабораторную работу

  1. Разработать, написать и отладить программу управления пе­ремещением символа (например, "*") в пределах заданного на экране окна. Для управления использовать функциональные клавиши F9, F10. Для ввода использовать стандартные функции языка C++ (getch, getche, kbhit, bioskey). Сохранить отлаженную программу.

  2. Изменить программу, заменив стандартные функции библиотеки C++(getch, getche, kbhit, bioskey) своими. Для написания функций использовать заданное прерывание INT 16h. Если его возможностей не достаточно, то заменить его по своему усмотрению. Сохранить отлаженную программу.

  3. Две отлаженные программы предъявить преподавателю.

  1. Алгоритмы и тексты отлаженных программ

Функция Direction (рисунок 1), определяющая направление движения символа в зависимости от нажатой клавиши.

Рисунок 1 - функция Direction

Функция main (рисунок 2). Задает окно и начальное положение символа, после чего постоянно перемещает «?» до тех пор, пока не будет нажата клавиша Escape или символ не дойдет до границы окна.

Рисунок 2 – функция main

Функция Our_Getch (рисунок 3). Является аналогом встроенной функции getch из функций С++.

Рисунок 3 – функция Our_Getch

Функция Our_Kbhit (рисунок 4). Является аналогом встроенной функции kbhit из функций С++.

Рисунок 4 – функция Our_Kbhit

Функция Direction для второй версии программы с использованием написанных функций (рисунок 5), определяющая направление движения символа в зависимости от нажатой клавиши.

Рисунок 5 – функция Direction

Функция main для второй версии программы (рисунок 6). Задает окно и начальное положение символа, после чего постоянно перемещает «?» до тех пор, пока не будет нажата клавиша Escape или символ не дойдет до границы окна.

Рисунок 6 – функция main

Текст программы 1 с использованием стандартных функций:

#include <stdio.h>

#include <conio.h>

#include <bios.h>

#include <dos.h>

#define ESCAPE 27

#define UP 67

#define DOWN 68

#define X1 20

#define X2 60

#define Y1 12

#define Y2 23

int Direction(int& direction)

{

char ch;

if (kbhit()) {

int ch = getch();

if (ch == ESCAPE) direction = 3;

if (ch == 0 || ch == 224) {

switch (getch()) {

case DOWN:

direction = 2;

break;

case UP:

direction = 1;

break;

}

return 1;

}

}

}

int main()

{

int x, y;

int direction = 0;

x = 20;

y = 7;

window(X1, Y1, X2, Y2);

textbackground(9);

textcolor(11);

_setcursortype(_NOCURSOR);

clrscr();

gotoxy(x, y);

printf("?");

do {

Direction(direction);

if (direction == 1) {

clrscr();

y--;

if (y <= 1) {

y = 1;

}

gotoxy(x, y);

printf("?");

}

else if (direction == 2) {

clrscr();

y++;

if (y >= (Y2 - Y1 + 1)) {

y = Y2 - Y1 + 1;

}

gotoxy(x, y);

printf("?");

}

delay(100);

} while (direction != 3);

return 0;

}

Текст программы 2 с использованием написанных функций:

#include <stdio.h>

#include <conio.h>

#include <bios.h>

#include <dos.h>

#define ESC 27

#define UP 67

#define DOWN 68

#define X1 20

#define X2 60

#define Y1 12

#define Y2 23

char Our_Getch() {

union REGS in, out;

in.h.ah = 0x10;

int86(0x16, &in, &out);

if (out.h.al == 0) {

return out.h.ah + 256;

}

return out.h.al;

}

int Our_Kbhit() {

union REGS in, out;

in.h.ah = 0x01;

int86(0x16, &in, &out);

return !(out.x.flags & 0x40);

}

int Direction(int& direction)

{

int ch;

if (Our_Kbhit()) {

ch = Our_Getch();

switch (ch) {

case DOWN:

direction = 2;

break;

case UP:

direction = 1;

break;

case ESC:

direction = 3;

break;

default:

break;

}

}

}

int main()

{

int x, y;

int direction = 0; // 0 - не движется, 1 - вверх, 2 - вниз

x = 20;

y = 7;

window(X1, Y1, X2, Y2);

textbackground(9);

textcolor(11);

_setcursortype(_NOCURSOR);

clrscr();

do {

Direction(direction);

clrscr();

gotoxy(x, y);

putch('?');

delay(100);

if (direction == 1) {

y--;

if (y <= 1) y = 1;

}

else if (direction == 2) {

y++;

if (y >= (Y2 - Y1 + 1)) y = Y2 - Y1 + 1;

}

} while (direction != 3);

return 0;

}