Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Сборка Часть2 / АВМиС / Лабораторные / Лабораторня работа Клавиатура2010.doc
Скачиваний:
40
Добавлен:
15.09.2014
Размер:
140.29 Кб
Скачать

Лабораторная работа УПРАВЛЕНИЕ КЛАВИАТУРОЙ 2

1. Цель работы 2

2. Темы для предварительного изучения 2

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

4. Порядок выполнения 2

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

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

6.5. Скриншот окна программы 5

Приложение 6

Сводная таблица скан-кодов 6

Сводная таблица кодов ASCII 7

Сводная таблица расширенных кодов. 9

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

1. Цель работы

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

2. Темы для предварительного изучения

  • Организация и принцип работы ПЭВМ и клавиатуры.

  • Работа контроллера прерываний. Установка вектора прерывания.

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

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

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

  • при первом нажатии "горячей" комбинации переходить в режим блокировки ввода заданной клавиши, при втором - отменять этот режим;

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

4. Порядок выполнения

Порядок выполнения работы и содержание отчета определены в общих указаниях.

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

 Nп/п

"Горячая" комбинация/

Клавиша, которая блокируется

 Shift 

 Ctrl 

 Alt 

 Fxx 

 Лев. 

 Пр. 

 Лев. 

 Пр. 

 Лев. 

 Пр. 

 1 

 +  

 +  

 

 

 

 

 F1 

 1 

 2 

 +  

 

 +  

 

 

 

 F2 

 2 

 3

 

 + 

 

 

 + 

 

 F3 

 3 

 4

 + 

 

 

 

 + 

 

 F4 

 4

 5

 + 

 

 

 

 

 + 

 F5 

 5 

 6 

 

 + 

 + 

 

 

 

 F6 

 6 

 7 

 

 + 

 

 

 + 

 

 F7 

 7 

 8 

 

 + 

 

 + 

 

 

 F8 

 8 

 9 

 

 + 

 

 

 

 + 

 F9 

 9 

 10 

 

 

 + 

 

 + 

 

 F10 

 0 

 11 

 

 

 + 

 

 

 + 

 F1 

 q 

 12 

 

 

 

 + 

 + 

 

 F2 

 w 

 13 

 

 

 

 + 

 

 + 

 F3 

 e 

 14 

 + 

 

 + или + 

 

 

 F4 

 r 

 15 

 

 + 

 

 

 + или + 

 F5 

 t 

 16 

 

 

 

 

 

 

 F6 

 y 

 17 

 + 

 + 

 + или + 

 

 

 F7 

 u 

 18 

 + 

 + 

 

 

 + или + 

 F8 

 i 

 19 

 

 

 + или + 

 + или + 

 F9 

 o 

 20 

 + 

 + 

 + или + 

 + или + 

 F10 

 p 

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

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

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

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

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

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

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

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

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

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

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

Глобальные переменные программы: 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);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Вход:

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

Выход:

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

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

Вход:

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