Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Результаты работы программы
В процессе работы программы на экран была выведена такая информация: Практическая работа N4 Проверка состава оборудования
Тип компьютера: AT Конфигурация: Дисководов ГМД: 2 Математич. сопроцессор: есть Тип дисплейного адаптера: VGA, кол., анал., 256 Кбайт Первичный блок памяти: 16 Кбайт Портов RS232: 2 Джойстик: нет Принтеров: 1 Объем оперативной памяти: 639 Кбайт Объем extended-памяти: 384 Кбайт Адрес ПЗУ = c000. Длина модуля = 24576 байт Версия MS-DOS 6.20
: Лабораторня работа №5. Цель работы Изучение организации и принципов работы клавиатуры и закрепление практических навыков управления ею, а также практических навыков создания собственных программ обработки прерываний. Постановка задачи Разработать программу обработки прерывания от клавиатуры, которая должна: u распознавать нажатие «горячей» комбинации клавиш и реагировать на него звуковым сигналом; u при первом нажатии «горячей» комбинации переходить в режим блокировки ввода заданной клавиши, при втором — отменять этот режим; u системная обработка всех других клавиш нарушаться не должна. Индивидуальные задания Пример решения задачи Индивидуальное задание: u комбинация клавиш LeftCtrl+RightShift+F3; u блокирование ввода клавиши 3. Разработка алгоритма Структура программы Программа состоит из основной программы и трех функций. u void *readvect(int in) — функция читает вектор прерывания с номером in и возвращает его значение.
u void writevect (int in, void *h) — функция устанавливает новый вектор прерывания in на новый обработчик этого прерывания по адресу h. u void interrupt new9() — процедура нового обработчика прерывания 9h. Описание переменных Глобальные переменные программы: old9 — адрес старого обработчика прерывания 9h; F3_code — скан-код клавиши «F3», которая входит в комбинацию «горячих» клавиш; key3_code — скан-код клавиши «3», которая будет блокироваться/разблокироваться при каждом нажатии «горячей» комбинации клавиш; f — флаг, который при каждом нажатии «горячей» комбинации клавиш переключается из состояния 0 в 1 или из 1 в 0 (состояние 1 означает, что клавиша «3» заблокирована);rr и sr — переменные, которые используются для задания значений регистров общего назначения и сегментных регистров соответственно при вызове прерывания. В главной программе использует символьный массив string для проверки работы программы. Переменные процедуры обработки прерывания 9h: u c — переменная, которая используется для подтверждения приема из клавиатуры, в случае, если была нажата клавиша «3», а флаг f показывал, что эта клавиша заблокирована; u x,y — переменные, которые используются для сохранения координат курсора на экране в момент вызова процедуры обработки прерывания; u byte17 — байт флага состояния клавиатуры в области данных BIOS по адресу 0040:0017; u byte18 — байт флага состояния клавиатуры в области данных BIOS по адресу 0040:0018; u mask — маска, которая используется для определения нажатия клавиши левый Shift (в этом случае бит 1 в byte17 установлен в 1); u mask17 — маска, которая используется для определения нажатия клавиши Сtrl (в этом случае бит 2 в byte17 установлен в 1);
u mask18 — маска, которая используется для определения нажатия клавиши левый Сtrl(в этом случае бит 0 в byte18 установлен в 1); Описание алгоритма программы Главная программа выполняет такие действия: u Запоминает адрес старого обработчика прерывания 9h, вызывая функцию readvect(in) с параметром in=9. u Записывает в таблицу векторов прерываний адрес нового обработчика прерывания с помощью функции writevect(). u Вводом строки символов дает возможность проверить работу программы и ее реакцию на нажатие «горячей» комбинации клавиш и блокирование/разблокирование ввода клавиши «3». u В конце работы восстанавливает в таблице векторов прерываний адрес старого обработчика. Для решения задачи процедура обработки прерывания от клавиатуры new9() должна действовать по такому алгоритму: u Прочитать флаги состояния клавиатуры (статус клавиш-переключателей), которые находятся в области данных BIOS (два байта по адресам 0040:0017 и 0040:0018). u Выделить бит 1 в флаге по адресу 0040:0017 (если он равен 1, то нажата клавиша левый Shift). u Выделить бит 2 в этом же флаге (если он равен 1, то нажата левый или правый Ctrl). u Выделить бит 0 в флаге состояния клавиатуры по адресу 0040:0018 (если он равен 1, то нажата клавиша левый Ctrl). u Из порта 60h прочитать скан-код нажатой клавиши. u Если нажата комбинация клавиш левый Shift, правый Ctrl (нажата клавиша Ctrl, но это не правый Ctrl)и клавиша F3, то выполнить п.7. Иначе — перейти к п.8. u Сигнализировать о нажатии «горячей» комбинации клавиш звуковым сигналом, переключить значение флага блокирования ввода клавиши «3» на обратное и вызвать старый обработчик прерывания от клавиатуры.
u Прочитав байт из порта 60h, определить, нажата ли клавиша «3» и если, кроме этого, еще и флаг блокирования указывает на то, что она заблокирована (f=1), то выполнить п.п. 9 и 10, иначе — вызвать старый обработчик прерывания. u Послать подтверждение приема в клавиатуру. Для этого в порт 61h на короткое время выставить «1» по шине старшего разряда. u Сбросить контроллер прерываний, посылая код 20h в порт 20h. Функция readvect() читает вектор заданного прерывания. Для чтения вектора используется функция 35h DOS (прерывания 21h): Вход: AH = 35h; AL = номер вектора прерывания. Выход: ES:BX = адрес программы обработки прерывания Функция writevect() устанавливает новый вектор прерывания на заданный адрес. Для записи вектора используется функция 25h DOS: Вход: AL = номер вектора прерывания; DS:BX = 4-байтный адрес нового обработчика прерывания. Текст программы /*--------Практическая работа N5---------------*/ /*---------Управление клавиатурой---------------*/ /* Подключение стандартных заголовков */ #include <dos.h>
void interrupt (*old9)(); /* Старый обработчик прерывания 9h */ void interrupt new9(); /* Новый обработчик прерывания 9h */ void *readvect (int in); /* Чтение вектора */ void writevect (int in,void *h); /* Запись вектора */
unsigned char F3_code=61; /* scan-code "F3" */ unsigned char key3_code=4;/* scan-code "3" */ char f=0; /* Флаг */ union REGS rr; struct SREGS sr;
/*------------------------------------------------*/ void main() { char string[80]; /* Буфер для ввода текста */ textbackground(0); clrscr(); textattr(0x0a); cprintf("---------------"); cprintf(" Практическая работа N5 "); cprintf("---------------"); cprintf("---------------"); cprintf(" Управление клавиатурой "); cprintf("---------------");
old9=readvect(9); writevect(9,new9); textattr(0x0c); cprintf("\n\n\r\"горячая\" комбинация: "); textattr(0x0a); cprintf("Left Shift, Right Ctrl, F3\n\r"); textattr(0x0b); cprintf("Клавиша, которая блокируется: "); textattr(0x0f); cprintf("3"); textattr(0x07); cprintf("\r\nВводите строку символов>"); scanf("%s",string); writevect(9,old9); } /*------------------------------------------------*/ /* Чтение вектора */ void *readvect(int in) { rr.h.ah=0x35; rr.h.al=in; intdosx(&rr,&rr,&sr); return(MK_FP(sr.es,rr.x.bx)); } /*------------------------------------------------*/ /* Запись вектора */ void writevect(int in,void *h) { rr.h.ah=0x25; rr.h.al=in; sr.ds=FP_SEG(h); rr.x.dx=FP_OFF(h); intdosx(&rr,&rr,&sr); } /*------------------------------------------------*/ /* Новый обработчик 9-го прерыванмя */ void interrupt new9() { unsigned char c,x,y; unsigned char byte17,byte18; unsigned char mask=0x02; unsigned char mask17=0x04; unsigned char mask18=0x01;
byte17=peekb(0x40,0x17); byte18=peekb(0x40,0x18); if((inportb(0x60)==F3_code)&&(byte17&mask)&& (byte17&mask17)&&(!(byte18&mask18))) { cputs("\7"); x=wherex(); y=wherey(); gotoxy(55,3); textattr(0x1e); if(f==0) { f=1; cprintf("Клавиша \"3\" заблокирована "); } else { f=0; cprintf("Клавиша \"3\" разблокирована"); } gotoxy(x,y); textattr(0x07); (*old9)(); } if( (f==1) && (inportb(0x60)==key3_code) ) { c=inportb(0x61); outportb(0x61,c|0x80); outportb(0x61,c); outportb(0x20,0x20); } else (*old9)(); }
|
||
Последнее изменение этой страницы: 2018-05-10; просмотров: 209. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |