Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ОргЭВМиС (3 сем) / Лаба №4 / Отчёт по Лабораторной Работе №4

.docx
Скачиваний:
67
Добавлен:
01.06.2019
Размер:
23.59 Кб
Скачать

Минобрнауки России

Федеральное государственное автономное образовательное

учреждение высшего образования

«Санкт-Петербургский государственный электротехнический университет им. В.И. Ульянова (Ленина)»

(СПбГЭТУ «ЛЭТИ»)

Факультет компьютерных технологий и информатики

Кафедра вычислительной техники

ОТЧЕТ

по лабораторной работе №4

на тему:

«Клавиатура IBM PC. Использование прерываний»

по дисциплине: «Организация ЭВМ и систем»

Выполнил студент группы №

Принял: Гречухин М.Н.

Санкт-Петербург

2018 г.

Содержание

Введение………………………………………………………………………………..3

  1. Задание…………………………………………………………………………..3

  2. Краткие сведения о подсистеме ввода информации с клавиатуры…………………………………........................................................3

  3. Сведения об используемых прерываниях……………………………………..3

  4. Буфер клавиатуры………………………………………………………………4

  5. Функции обслуживания ввода с клавиатуры…………………………………4

  6. Текст программы………………………………………………………………..5

Заключение……………………………………………………………………………..6

Введение

Цель работы: изучение возможностей работы с клавиатурой, ознакомление со стандартными средствами библиотеки C++ и средствами системы прерываний DOS и BIOS, обслуживающими клавиатуру.

  1. Задание

1) Разработать, написать и отладить программу управления перемещением символа (например, "*") в пределах заданного на экране окна с координатами (20, 10; 60, 20). Для управления использовать клавиши F3, F4 Для ввода использовать стандартные функции языка C++. 2) Изменить программу, заменив стандартные функции библиотеки C++ своими. Для написания функций использовать прерывание INT 21h, если его возможностей достаточно. Если его возможностей недостаточно, то заменить его по своему усмотрению.

  1. Краткие сведения о подсистеме ввода информации с клавиатуры

Подсистема ввода отвечает за считывание вводимой пользователем информации со всевозможных устройств (клавиатура, мышь, джойстик и пр.) и формирование на их основе событий ввода, которые затем передаются различным модулям. Подсистема предоставляет полную абстракцию от устройств ввода: в модули-обработчики передаются уже готовые события, связанные с конкретными действиями. Устройство ввода (клавиатура, мышь и пр.) фиксирует действие пользователя (нажатие кнопки, движение мышью и т.д.) и передает сообщение об этом в движок ввода. В таком сообщении содержится тип события и всевозможные параметры. Например, когда пользователь нажимает кнопку на клавиатуре - передается событие key_press с двумя параметрами: идентификатор нажатой кнопки и unicode-символ, который ей соответствует. Когда пользователь отпускает кнопку - передается событие key_release с теми же параметрами. Движок ввода передает это событие всем активным контекстам ввода. Контекст ввода - это таблица преобразования низкоуровневых событий в пользовательские. Контекст ввода определяет правила, по которым события будут передаваться пользователю. Контекст ввода передает результат обработки события обработчикам ввода (небольшой модуль, который выполняет с полученным событием какие-либо действия и отправляет результат пользователю).

  1. Сведения об используемых прерываниях

Int 0x21 является программным прерыванием x86 - в основном это означает, что в фиксированной точке в памяти имеется таблица прерываний, в которой перечислены адреса программных прерываний. Когда процессор x86 получает код операции прерывания (или иным образом решает, что должно выполняться определенное прерывание программного обеспечения), он ссылается на эту таблицу для выполнения вызова этой точки.

4. Буфер клавиатуры

Буфер клавиатуры– это место в памяти, где хранятся нажатия клавиш клавиатуры, пока компьютер не может их обработать.

5. Функции обслуживания ввода с клавиатуры

Функции, используемые в лабораторной работе:

1) int getch (void) - выполняет ввод с клавиатуры через функцию MS-DOS АН=07h. Она не выполняет "эхо" вывода на экран. В этой связи полезна для организации интерфейса с пользователем, при котором нажатие той или иной клавиши вызывает немедленную реакцию программы без отображения введенного символа на экране. 2) void gotoxy(int x, int y) - помещает курсор текстового экрана в точку с координатами х,у. Если хотя бы одна из координат недействительна, то никаких действий не выполняется. 3) putch(int ch) - выводит символ в текущей позиции текстового окна экрана. 4) window(int , int ,int , int ) - описывает активное текстовое окно: первая пара аргументов задает соответственно номера столбца и строки левого верхнего угла, вторая пара правого нижнего угла.

6. Текст программы

1) Стандартные функции языка C++:

#include "dos.h"

#include "conio.h"

#include "stdio.h"

#define X1 20

#define Y1 10

#define X2 60

#define Y2 20

int main()

{

window(X1, Y1, X2, Y2);

clrscr();

int x = 1, y = 1, ch = 0;

int left = 0;

do

{

do

{

clrscr();

if ((left==1)&&((x-1)>=0))

x-=1;

if ((left==0)&&((x+1)<=(X2-X1)))

x+=1;

gotoxy(x, y);

putch('*');

delay(100);

}while(kbhit()==0);

ch = getch();

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

{

switch (getch ())

{

case 61: //F3

left = 1;

break;

case 62: //F4

left = 0;

break;

}

}

}while(ch!=27);

return 0;

}

2) Замена стандартных функций C++ на свои и использование прерывания INT 21h:

#include "dos.h"

#include "conio.h"

#include "stdio.h"

#define X1 20

#define Y1 10

#define X2 60

#define Y2 20

int code();

int keypressed();

int main()

{

window(X1, Y1, X2, Y2);

clrscr();

int x = 1, y = 1, ch = 0;

int left = 0;

do

{

do

{

clrscr();

if ((left == 1) && ((x - 1) >= 0))

x -= 1;

if ((left == 0) && ((x + 1) <= (X2 - X1)))

x += 1;

gotoxy(x, y);

putch('*');

delay(100);

} while (keypressed() == 0);

ch = code();

switch (ch)

{

case 61: //F3

left = 1;

break;

case 62: //F4

left = 0;

break;

}

} while (ch != 27);

return 0;

}

int keypressed()

{

union REGS r;

r.h.ah = 0x0B;

int86(0x21, &r, &r);

return r.h.al;

}

int code()

{

union REGS r;

r.h.ah = 0x7;

int86(0x21, &r, &r);

return r.h.al;

}

Заключение

При выполнении лабораторной работы были изучены возможности работы с клавиатурой, ознакомлены со стандартными средствами библиотеки C++ и средствами системы прерываний DOS и BIOS, обслуживающими клавиатуру.

6