Скачиваний:
3
Добавлен:
09.01.2023
Размер:
130.55 Кб
Скачать

МИНОБРНАУКИ РОССИИ

САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ

ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

«ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)

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

ОТЧЕТ

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

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

Тема: “ клавиатура ibm pc. Использование прерываний

Преподаватель

_______________ Анисимов А.В.

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

2022

Цель работы

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

Задание на лабораторную работу

1. Разработать, написать и отладить программу управления пе­ремещением символа (например, "*") в пределах заданного на экране окна. Для управления использовать клавиши из набора: "стрелка вверх" (СтВВ), "стрелка вниз" (СтВН), "стрелка вправо" (СтВП), "стрелка влево" (СтВЛ) или функциональные клавиши Fl - F12 (варианты см. в таблице 4.2). Для ввода использовать стандартные функции языка C++. Сохранить отлаженную программу.

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

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

№ варианта

X1

Y1

X2

Y2

Вид движения

Клавиши управления

Номер прерывания

12

25

10

55

20

Пошаговое

F7, F8

INT 21h

Краткие сведения о подсистеме ввода информации с клавиатуры, используемых прерываниях, буфере клавиатуры и функциях обслуживания ввода с клавиатуры.

Ввод информации в компьютер может быть выполнен на трех уровнях: обращением к функция MS-DOS; обращением к функциям BIOS; физическим доступом к аппаратным средствам.

Ввод информации на уровне MS-DOS позволяет «пропустить» клавиатурный ввод через инсталлируемые драйверы.

Досутп к клавиатуре на уровне BIOS позволяет программе отслеживать нажатие всех, а не только символьных клавиш, выполнять управление аппаратурой клавиатуры и пр. Интерфейсом Turbo C с BIOS является функция bioskey().

Непосредственный доступ к буферу клавиатуры резко повышает производительость программы. В некоторых случаях необходима имитация нажатия клавиш клавиатуры с записью кодов непосредственно в буфер. При этом физически нажатия клавиш не происходят.

Буфер BIOS для записи кодов клавиш занимает 32 байта оперативной памяти с адреса 40:lEh дл 40:3Eh. Буфер организуется как кольцевая очередь, доступ к которой осуществляется с помощью указателя «головы», адрес которого 40:1Ah, и указателя «хвоста», адрес которого 40:1Ch. Указатель "хвоста" задает смещение до слова, где будет записан обработчиком прерывания 9 код буферизуемой кла-виши, т.е. первое свободное слово буфера. Указатель "головы" задает смещение слова, которое будет возвращено запросу буферизованного ввода с клавиатуры, сделанного операционной системой или BIOSoм.

Функции библиотеки C++

int getch(void) — выполняет ввод с клавиатуры через функци. MS-DOS AH = 07h. Она не выполняет «эхо» вывода на экран.

Int getche(void) — выполняет небуферизуемый ввод с клавиатуры через функцию MS-DOS AH = 07h, но в отличие от предыдущей функции обеспечивает вывод введенного символа на экран.

Char *getpass(char *prompt) — выводит на экран ASCII-строку, на начало которой указывает prompt, а затем принимает с клавиатуры без «эха» строку символов. Вводимые символы (не более 7) помещаются во внутренннюю статическую память.

Int kbhit(void) — проверяет пуст ли буфер клавиатуры. Еслт в буфере есть символы. Функция возвращает ненулевое значение, в противном случае она возвращает 0.

Интерфейсом программ в персональном компьютере с клавиатурой является прерывание 16h BIOS. Далее приводится описание его функций.

АН = 00h - чтение с ожиданием двухбайтового кода из буфера клавиатуры. Прочитанный код возвращается в регистре АХ: младший байт - в регистре AL, старший - в АН. Если нажата ASCII-клавиша, в AL помещается ASCII-код симво-ла, в АН - скэн-код. При нажатии специальных клавиш AL равен 0, а в АН воз-вращается расширенный скэн-код.

АН = 0lh - чтение без ожидания двухбайтового кода из буфера клавиатуры. Если буфер пуст, в 1 выставляется флаг нуля ZF. В противном случае в АХ воз-вращается двухбайтовый код из буфера клавиатуры, но продвижение указателя "головы" буфера не производится, т.е. код "остается" в буфере.

АН = 02h - определение состояния шифт- и триггерных клавиш. В регистре AL возвращается содержимое байта по адресу 40:17h (см. табл. 4.1).

Функция АН = 05h не имеет аналогов в библиотеке Turbo С и может исполь-зоваться для имитации нажатии клавиш в демонстрационных программах, про-граммах переноса текста и т.д.

Функции AH = 00 — 02h прерывания 16h BIOS положены в основу функции bioskey() библиотеки Turbo C. Далее следует описание этой функции.

Int bioskey(int cmd) — обращается в зависимости от значения в cmd к функциям AH = 00 – 02h прерывания 16h. Возвращаемое функцией значение повторяет значение регистра AX при выходе из прерывания.

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

Программа 1:

#include <dos.h>

#include <conio.h>

void putchar(char s){

union REGS r;

r.h.ah = 0xA;

r.h.al = s;

r.h.bh = 0;

r.x.cx = 1;

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

}

int main(){

int x1 = 25, y1 = 10, x2 = 55, y2 = 20;

int symbol_x = (x2-x1+2)/2, symbol_y = (y2-y1+2)/2;

int key, mode = 0;

_setcursortype(_NOCURSOR);

textattr(BLUE<<4 | LIGHTGRAY);

window(x1,y1,x2,y2);

for(int i = 0; i <= (y2 - y1); i++)

insline();

gotoxy(symbol_x, symbol_y); //start position

putchar('*');

do{

key = getch();

if (key == 65 || key == 66){

gotoxy(symbol_x, symbol_y);

if(symbol_x > 1 && key == 65){

symbol_x--; mode = 1;

}else if(symbol_x < x2-x1+1 && key == 66){

symbol_x++; mode = 1;

}

if(mode){

putchar(' ');

gotoxy(symbol_x, symbol_y);

putchar('*');

}

}

}while(key!=0x1B);

textattr(0);

clrscr();

return 0;

}

Программа 2:

#include <dos.h>

#include <conio.h>

void putchar(char s){

union REGS r;

r.h.ah = 0xA;

r.h.al = s;

r.h.bh = 0;

r.x.cx = 1;

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

}

unsigned char getChar(){

union REGS r;

r.h.ah = 0x7;

intdos(&r,&r);

return r.h.al;

}

int main(){

int x1 = 25, y1 = 10, x2 = 55, y2 = 20;

int symbol_x = (x2-x1+2)/2, symbol_y = (y2-y1+2)/2;

int key, mode = 0;

_setcursortype(_NOCURSOR);

textattr(GREEN<<4 | RED);

window(x1,y1,x2,y2);

for(int i = 0; i <= (y2 - y1); i++)

insline();

gotoxy(symbol_x, symbol_y); //start position

putchar('*');

do{

key = getChar();

if (key == 65 || key == 0x66){

gotoxy(symbol_x, symbol_y);

if(symbol_x > 1 && key == 65){

symbol_x--; mode = 1;

}else if(symbol_x < x2-x1+1 && key == 66){

symbol_x++; mode = 1;

if(mode){

putchar(' ');

gotoxy(symbol_x, symbol_y);

putchar('*');

}

}

}while(key!=0x1B);

textattr(0);

clrscr();

return 0;

}

Контрольные примеры

С труктурная схема аппаратных устройств

Вывод

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

Соседние файлы в папке лаба 4