Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Структура программы




Разработка алгоритма

Пример решения задачи

Постановка задачи

Лабораторня работа №5. Управление клавиатурой

Результаты работы программы

В процессе работы программы на экран была выведена такая информация:

Лабораторная работа N4

Проверка состава оборудования

 

Тип компьютера: AT

Конфигурация:

Дисководов ГМД: 2

Математич. сопроцессор: есть

Тип дисплейного адаптера: VGA, кол., анал., 256 Кбайт

Первичный блок памяти: 16 Кбайт

Портов RS232: 2

Джойстик: нет

Принтеров: 1

Объем оперативной памяти: 639 Кбайт

Объем extended-памяти: 384 Кбайт

Адрес ПЗУ = c000. Длина модуля = 24576 байт

Версия MS-DOS 6.20

 


 

 

Цель работы

Изучение организации и принципов работы клавиатуры и закрепление практических навыков управления ею, а также практических навыков создания собственных программ обработки прерываний.

Разработать программу обработки прерывания от клавиатуры, которая должна:

· распознавать нажатие «горячей» комбинации клавиш и реагировать на него звуковым сигналом;

· при первом нажатии «горячей» комбинации переходить в режим блокировки ввода заданной клавиши, при втором — отменять этот режим;

· системная обработка всех других клавиш нарушаться не должна.

Индивидуальные задания

Индивидуальное задание:

· комбинация клавиш LeftCtrl+RightShift+F3;

· блокирование ввода клавиши 3.

Программа состоит из основной программы и трех функций.

· void *readvect(int in) — функция читает вектор прерывания с номером in и возвращает его значение.

 

· void writevect (int in, void *h) — функция устанавливает новый вектор прерывания in на новый обработчик этого прерывания по адресу h.

· void interrupt new9() — процедура нового обработчика прерывания 9h.

Описание переменных

Глобальные переменные программы: old9 — адрес старого обработчика прерывания 9h; F3_code — скан-код клавиши «F3», которая входит в комбинацию «горячих» клавиш; key3_code — скан-код клавиши «3», которая будет блокироваться/разблокироваться при каждом нажатии «горячей» комбинации клавиш; f — флаг, который при каждом нажатии «горячей» комбинации клавиш переключается из состояния 0 в 1 или из 1 в 0 (состояние 1 означает, что клавиша «3» заблокирована); rr и sr — переменные, которые используются для задания значений регистров общего назначения и сегментных регистров соответственно при вызове прерывания.

В главной программе использует символьный массив string для проверки работы программы.

Переменные процедуры обработки прерывания 9h:

· c — переменная, которая используется для подтверждения приема из клавиатуры, в случае, если была нажата клавиша «3», а флаг f показывал, что эта клавиша заблокирована;

· x, y — переменные, которые используются для сохранения координат курсора на экране в момент вызова процедуры обработки прерывания;

· byte17 — байт флага состояния клавиатуры в области данных BIOS по адресу 0040:0017;

· byte18 — байт флага состояния клавиатуры в области данных BIOS по адресу 0040:0018;

· mask — маска, которая используется для определения нажатия клавиши левый Shift (в этом случае бит 1 в byte17 установлен в 1);

· mask17 — маска, которая используется для определения нажатия клавиши Сtrl (в этом случае бит 2 в byte17 установлен в 1);

· mask18 — маска, которая используется для определения нажатия клавиши левый Сtrl (в этом случае бит 0 в byte18 установлен в 1);

Описание алгоритма программы

Главная программа выполняет такие действия:

· Запоминает адрес старого обработчика прерывания 9h, вызывая функцию readvect(in) с параметром in=9.

· Записывает в таблицу векторов прерываний адрес нового обработчика прерывания с помощью функции writevect().

· Вводом строки символов дает возможность проверить работу программы и ее реакцию на нажатие «горячей» комбинации клавиш и блокирование/разблокирование ввода клавиши «3».

· В конце работы восстанавливает в таблице векторов прерываний адрес старого обработчика.

Для решения задачи процедура обработки прерывания от клавиатуры new9() должна действовать по такому алгоритму:

· Прочитать флаги состояния клавиатуры (статус клавиш-переключателей), которые находятся в области данных BIOS (два байта по адресам 0040:0017 и 0040:0018).

· Выделить бит 1 в флаге по адресу 0040:0017 (если он равен 1, то нажата клавиша левый Shift).

· Выделить бит 2 в этом же флаге (если он равен 1, то нажата левый или правый Ctrl).

· Выделить бит 0 в флаге состояния клавиатуры по адресу 0040:0018 (если он равен 1, то нажата клавиша левый Ctrl).

· Из порта 60h прочитать скан-код нажатой клавиши.

· Если нажата комбинация клавиш левый Shift, правый Ctrl (нажата клавиша Ctrl, но это не правый Ctrl)и клавиша F3, то выполнить п.7. Иначе — перейти к п.8.

· Сигнализировать о нажатии «горячей» комбинации клавиш звуковым сигналом, переключить значение флага блокирования ввода клавиши «3» на обратное и вызвать старый обработчик прерывания от клавиатуры.

· Прочитав байт из порта 60h, определить, нажата ли клавиша «3» и если, кроме этого, еще и флаг блокирования указывает на то, что она заблокирована (f=1), то выполнить п.п. 9 и 10, иначе — вызвать старый обработчик прерывания.

· Послать подтверждение приема в клавиатуру. Для этого в порт 61h на короткое время выставить «1» по шине старшего разряда.

· Сбросить контроллер прерываний, посылая код 20h в порт 20h.

Функция readvect() читает вектор заданного прерывания. Для чтения вектора используется функция 35h DOS (прерывания 21h):

Вход: AH = 35h;

AL = номер вектора прерывания.

Выход: ES:BX = адрес программы обработки прерывания

Функция writevect() устанавливает новый вектор прерывания на заданный адрес. Для записи вектора используется функция 25h DOS:

Вход: AL = номер вектора прерывания;

DS:BX = 4-байтный адрес нового обработчика прерывания.




Поделиться с друзьями:


Дата добавления: 2017-02-01; Просмотров: 209; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.006 сек.