КАТЕГОРИИ: Архитектура-(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; Просмотров: 226; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |