2848

Процесс взаимодействия системы с клавиатурой в ОС MS-DOS

Контрольная

Информатика, кибернетика и программирование

Процесс взаимодействия системы с клавиатурой в ОС MS-DOS Клавиатура – это устройство компьютера, предназначенное для ввода текстовой информации. Технически клавиатура представляет собой матрицу ключей (кнопок), замыкаемых пользователем при нажа...

Русский

2012-10-20

39 KB

7 чел.

Процесс взаимодействия системы с клавиатурой в ОС MS-DOS

Клавиатура – это устройство компьютера, предназначенное для ввода текстовой информации. Технически клавиатура представляет собой матрицу ключей (кнопок), замыкаемых пользователем при нажатии, и контроллер, отслеживающий состояния ключей. Схематически процесс взаимодействия системы с клавиатурой в ОС MS-DOS показан на рисунке 1.

Рис. 1

Каждой клавише клавиатуры соответствует скэн-код размером 1 байт, идентифицирующий её расположение на клавиатуре.

Типы клавиш:

  •  основная клавиатура (буквы, цифры, управляющие клавиши Shift, Alt, Ctrl, CapsLock);
  •  функциональная клавиатура (F1, F2,…);
  •  цифровая клавиатура – при включённой клавише NumLock, клавиши управления курсором и экраном – при выключенной клавише NumLock;
  •  клавиши управления курсором и экраном, дублирующие функции цифровой клавиатуры.

При нажатии клавиши от матрицы контроллеру передаётся скэн-код клавиши. Если клавиша удерживается в нажатом состоянии, то через некоторое время срабатывает режим автоповтора, и скэн-код клавиши передаётся снова. При отпускании клавиши (даже если не было режима автоповтора) клавиатура XT передаёт её скэн-код, увеличенный на 80h, а клавиатура AT передаёт два байта: в первом содержится префикс F0h, во втором – скэн-код.

Контроллер клавиатуры посылает скэн-коды в порт 60h и генерирует аппаратное прерывание 09h, по которому ЦП останавливает выполнение текущей задачи и переходит на выполнение программы обработки прерывания от клавиатуры.

Скэн-код однозначно определяет нажатую клавишу, но по нему нельзя определить, в каком режиме работает пользователь (регистр, алфавит). Так как скэн-коды имеют все клавиши, в том числе и управляющие (Shift, Alt, Ctrl, Caps Lock), то их нажатия отслеживаются отдельно, запоминаются программой обработки прерывания и хранятся в специальном слове флагов состояния.

Программа обработки прерывания, получив управление, считывает скэн-код из порта 60h и анализирует его значение, а также слово флагов состояния. Если скэн-код принадлежит управляющей клавише, то устанавливается соответствующий бит в слове состояния флагов. При отпускании соответствующий бит сбрасывается для клавиш Shift, Alt, Ctrl. Для клавиш Insert, Caps Lock, Num Lock и Scroll Lock соответствующий бит сбрасывается при повторном нажатии клавиши.

Если скэн-код не принадлежит управляющей клавише, то её скэн-код транслируется по таблице преобразования в зависимости от флагов слова состояния в код ASCII, формируется двухбайтный код, старший байт которого содержит скэн-код, а младший – ASCII-код. Если скэн-код характеризует символьную клавишу, ASCII-код определяет закреплённый за ней символ. Каждому скэн-коду, как правило, соответствует несколько кодов ASCII.

Если же это не символьная клавиша (например, функциональная, клавиша перемещения по экрану, одновременное нажатие символьной и управляющей клавиш), то ей соответствует нулевой ASCII-код. Двухбайтные коды, содержащие на месте ASCII-кода ноль, называются расширенными ASCII-кодами.

Полученный в результате трансляции двухбайтный код записывается программой обработки прерывания в кольцевой буфер ввода, который служит для синхронизации процессов ввода данных с клавиатуры и приёма их программой пользователя. Объём буфера составляет 30 байтов, он может хранить 15 слов, содержащих коды. Коды извлекаются из буфера в том же порядке, в котором они в него поступали. За состоянием буфера следят два указателя. В хвостовом указателе хранится адрес первой свободной ячейки, в головном указателе хранится адрес самого старого кода, принятого с клавиатуры и ещё не прочитанного программой. Программа обработки прерывания помещает двухбайтный код по адресу хвостового указателя, после чего хвостовой указатель увеличивается на 2.

На этом процесс работы программы обработки прерывания заканчивается.

Пользовательская программа, желая получить код нажатой клавиши, вызывает прерывание int16h, которое активизирует драйвер клавиатуры BIOS. Драйвер считывает из кольцевого буфера двухбайтный код по адресу головного указателя и увеличивает адрес головного указателя на 2. Если это обычный ASCII-код, то будет достаточно считать младший байт, содержащий сам ASCII-код. Если же это расширенный ASCII-код, то необходимо считывать и старший байт.

Таким образом, программный запрос на ввод символа с клавиатуры фактически выполняет ввод не с клавиатуры, а из кольцевого буфера.

Если хвостовой указатель доходит до конца буфера, то при поступлении следующего кода его значение уменьшается на длину буфера, тем самым возвращаясь в начало буфера. Аналогичные манипуляции происходят и с головным указателем.

Равенство адресов головного и хвостового указателей свидетельствует о том, что буфер пуст. Если при этом программа пользователя вызовет прерывание int16h, то драйвер клавиатуры будет ждать поступления кода в буфер. Если же хвостовой указатель, перемещаясь по буферу, подойдёт к головному указателю сверху, то запись в буфер блокируется, чтобы предотвратить переполнение буфера, а нажатие на клавиши будет возбуждать звуковые сигналы.

Некоторые клавиши расширенной клавиатуры (101 клавиша) при нажатии генерируют не один, а несколько сигналов прерываний, каждый из которых сопровождается посылкой в порт 60h своего кода (последовательность кодов).

Функции языка C для работы с клавиатурой.

Для работы с клавиатурой в стандартной библиотеке conio.h объявлены следующие функции.

int getch(void);

Функция читает символ из буфера без отображения его на мониторе и возвращает ASCII-код символа из младшего байта. Если в буфере находится расширенный ASCII-код (ASCII-код, возвращаемый функцией, равен 0), то при следующем вызове функция возвратит значение скэн-кода из старшего байта. Если в буфере находится обычный ASCII-код (не равен 0), то при следующем вызове функция будет читать двухбайтный код следующего символа.

int getche(void);

Аналогична функции getch(), но при чтении из буфера производит вывод символа на экран в позицию курсора. При чтении младшего байта в расширенном ASCII-коде функция печатает пробел, при чтении старшего байта в расширенном ASCII-коде (скэн-кода) функция рассматривает его как обычный ASCII-код и печатает соответствующий ему символ.

int putch(int ch);

Функция выводит символ, код которого принимает в качестве аргумента, в текущую позицию курсора. Если в качестве аргумента указать escape-символ ‘\n’, то функция выполнит перевод курсора на следующую строку, но не будет выполнять перемещение курсора в начало строки.

int kbhit(void);

Функция проверяет, пуст ли буфер клавиатуры, и возвращает 0, если пуст, и значение, отличное от 0 (как правило -1), если буфер не пуст. При этом функция не читает символы из буфера.

int ungetch(int ch);

Функция помещает символ в голову буфера клавиатуры и возвращает значение кода в случае успешного завершения, или EOF (-1) в случае неуспешного завершения (если функция вызывается повторно, но до этого не было чтения с консоли от предыдущего вызова функции). При чтении этого символа функцией getche() отображение на экране не происходит.


 

А также другие работы, которые могут Вас заинтересовать

84552. Артеріальний тиск, фактори, що визначають його величину. Методи реєстрації артеріального тиску 43.25 KB
  Методи реєстрації артеріального тиску.; 4 Середньодинамічний рівень тиску який забезпечував би ту ж величину ХОК Q яка має місце в реальних умовах якби не було б коливань артеріального тиску. Фактори що визначають величину артеріального тиску: 1. ХОК нагнітальна функція лівого серця більше впливає на рівень систолічного тиску; 2.
84553. Кровообіг у капілярах. Механізми обміну рідини між кров’ю і тканинами. 43.5 KB
  Механізми обміну рідини між кровю і тканинами. Кількість речовин які ідуть за механізмом дифузії з капіляра в капіляр однакові Час протягом якого кров перебуває в капілярі достатня для того щоб повністю вирівнялись концентрації різних речовин в крові і в інтерстеціальної рідини. В капілярах відбувається обмін рідини між кровю та тканинами також за механізмом фільтраціїрезорбції. При цьому рух рідини через стінку капіляра проходить за градієнтом концентрації який утворюється внаслідок складання чотирьох сил: Ронк.
84554. Кровоток у венах, вплив на нього гравітації. Фактори, що визначають величину венозного тиску 43.4 KB
  Фактори що визначають величину венозного тиску. Фактором який викликає розтягування вен і депонування в них крові є трансмуральний тиск різниця гідростатичного тиску крові та оточуючих тканин. Трансмуральний тиск значно зростає у венах розміщених нижче серця при вертикальній позі людини оскільки до власного гідростатичного тиску крові створюється насосною функцією серця приєднується гідростатичний тиск стовпа рідини у венах. Збільшення трансмурального тиску розтягує вени і сприяє депонуванню крові при переході з горизонтального...
84555. Тонус артеріол і венул, його значення. Вплив судинно-рухових нервів на тонус судин 45.26 KB
  Вплив судиннорухових нервів на тонус судин. Механізми регуляції регуляції тонуса судин Місцеві Центральні Нервові рефлекси Гуморальні гормони Міогенні Гуморальні Тканинні гормони Парасимпатичні Метаболіти Симпатичні Регуляція кровотоку в окремих регіонах Регуляція системного кровообігу Тонус судин певна ступінь напруження стінки судин яка повязана із скороченням гладеньких мязів які входять до складу судинної стінки. Тонус більш виражений в артеріальних судинах ніж у венозних артеріальні судини мають більш виражений шар гладеньких...
84556. Міогенна і гуморальна регуляція тонусу судин. Роль ендотелія судин в регуляції судинного тонусу 45.08 KB
  Роль ендотелія судин в регуляції судинного тонусу. Базальний тонус судин той який притаманний судинам за відсутності нервових та гуморальних впливів вивчати можна на ізольованій судині. Кількість гладеньких мязів що здатні до автоматії більша в дистальних судинах ніж в проксимальних; більша в артеріальних судинах ніж у венозних.
84557. Гемодинамічний центр. Рефлекторна регуляція тонусу судин. Пресорні і депресорні рефлекси 44.84 KB
  Гемодинамічний центр ГДЦ розташований в довгастому мозку хоча в регуляції системного кровообігу беруть участь всі рівні ЦНС від кори ГМ до спинного мозку. В структурі ГДЦ виділяють: пресорний відділ ПВ депресорний відділ ДВ еферентне парасимпатичне ядро блукаючого нерва Х. Третім структурним елементом ГДЦ є парасимпатичне ядро блукаючого нерва. Аферентні звязки ГДЦ.
84558. Рефлекторна регуляція кровообігу при зміні положення тіла у просторі (ортостатична проба) 45.13 KB
  Регуляція САТ відбувається: за відхиленням у відповідь на зміну САТ вмикаються регуляторні механізми які повертають його до вихідного рівня саморегуляція або регуляція на основі негативного зворотнього звязку; така регуляція має місце при необхідності стабілізувати САТ на певному рівні: за збуренням збурення дія якогось зовнішнього по відношенню до системи кровообігу фактора потребує зміни САТ в певному напрямку; інформація про дію збурення передається в КП ГДЦ по каналу зовнішнього звязку ГДЦ виробляє керуючий сигнал що...
84559. Регуляція кровообігу при м’язовій роботі 45.45 KB
  Підвищення САТ є результатом рефлексу з пропріорецепторів працюючих мязів активація ПВ ГДЦ та гальмування ядра блукаючого нерва збільшення ЧСС та СО ріст ХОК ріст САТ; звуження артеріальних та венозних судин також зумовлюють ріст САТ. Рефлекс з пропріорецепторів працюючих мязів є основним але не єдиним механізмом розвитку пресорної реакції при мязовій роботі. Регуляція кровотоку в мязах при фізичній роботі спрямована на забезпечення його розширення зменшення опору цих судин збільшення обємної швидкості кровотоку через працюючі...
84560. Особливості кровообігу у судинах головного мозку і його регуляція 42.75 KB
  Унікальною особливістю кровообігу ГМ є те що воно відбувається в замкнутому просторі непіддатливого черепа та перебуває в динамічному взаємозвязку з кровообігом спинного мозку та переміщенням спинномозкової рідини. Величина мозкового кровообігу відносно постійна складає 750 мл хв 15 від ХОК маса мозку 2 від маси тіла. Кровотік в мозку нерівномірний краще кровопостачаються ділянки сірої речовини бо тут найвищий рівень обміну речовин.