Сделай Сам Свою Работу на 5

Принцип действия клавиатуры IBM PC

Клавиатура IBM PC работает следующим образом: всякий раз, когда Вы нажимаете или отпускаете клавишу, встроенное в клавиатуру устройство запоминает в своей встроенной памяти один байт. Этот байт содержит код нажатия или отпускания (соответственно 1 и 0) в седьмом бите и идентификатор клавиши, или scan-код, в остальных битах. Всего возможно 83 scan-кода, по одному для каждой клавиши клавиатуры. После того как встроенное в клавиатуру устройство запомнило какие-либо данные в своей памяти, оно посылает системе BIOS IBM PC прерывание типа 9, сообщающее, что у него есть данные для передачи.

Память клавиатуры способна хранить до 20 байтов, или до 10 операций нажатия и отпускания (т.е. ударов по клави
 
   
 

               
 
шам). Это позволяет Вам набирать текст даже в то время, когда микропроцессор ЭВМ занят, например выдает содержимое экрана на принтер. Если прерывания разрешены, то процедура обработки прерывания типа 9 KB_INT входящая в состав системы BIOS, считает байты из памяти клавиатуры и преобразует их в коды символов. Частью процесса преобразования является проверка того, не было ли некоторых нажатий без последующего отпускания; это позволяет формировать коды символов, отражающие удерживание в нажатом состоянии регистровых клавиш Shift, Ctrl или Alt во время нажатия на другую клавишу. По завершении работы процедура обработки прерывания типа 9 запоминает scan-код и код символа в буфереклавиатуры, находящимся в памяти ЭВМ. Этот буфер рассчитан на сохранение результатов 15 ударов по клавишам; при таком размере буфера скорость работы программного обеспечения позволяет успевать за самыми быстрыми машинистками. Но если Вам вдруг удастся нажать на клавишу в то время, когда буфер полон, то система BIOS проигнорирует эту клавишу и выдаст звуковой сигнал.   Расширенная система ASCII Ранее уже упоминалось, что клавиатура IBM PC имеет так много клавиш и настолько отличается от стандартной клавиатуры ЭВМ, что для представления генерируемых ею кодов символов не хватает стандартного набора из 128 ASCII-кодов. Всего в IBM PC предусмотрено 256 кодов, называемых фирмой IBM расширенной системой ASCII.   Расширенные коды Когда Вы запрашиваете чтение символа с клавиатуры, система BIOS возвращает ASCII-код этого символа и его scan-код в регистрах AL и AH соответственно. Другие (“не ASCII”) клавиши возвращают 0 и в регистре AL и расширенный код в регистре AH. Обратите внимание на то, что расширенные коды в интервале 3-53 соответствуют scan-кодам.   Специальные комбинации клавиш Следующие комбинации клавиш вызывают специальные действия: Alt-Ctrl-Del вызывает рестарт или “перевызов” ОС ЭВМ.
 
вводе этих комбинаций клавиш работа программы завершается. Если клавиатурный буфер пуст, программа переводится в состояние ожидания. Функция getche() полностью аналогична функции getch(), за исключением того, что прочитанный символ отображается на экране. Приведем прототип функции getche(): int getche(void); Приведем пример программы отображающей на экране ASCII-коды и расширенный ASCII-коды нажимаемых клавиш.   #include <conio.h> #include <ctype.h> #include <stdio.h> void main() { int key; //Читаем в цикле символы с клавиатуры и отображаем //ASCII- коды нажатых клавиш. //Выходим из цикла при нажатии на клавишу ESC for(;;) { //Читаем символ key=getch(); //Если прочитанный символ равен 0, вызываем функцию getch() //для получения расширенного ASCII-кода нажатой клавиши if ((key == 0) || (key == 0xe0)) { key=getch(); printf( "pасширенный ASCII-код:\t" ); } else printf( "ASCII-код:\t" ); printf( "%d/n",key ); //При нажатии на клавишу ESC выходим из цикла if (key == 27) break; }}   Для проверки буфера клавиатуры на наличие символов можно использовать функцию kbhit(). Она описана в файле conio.h: int kbhit(void); Если буфер клавиатуры не пуст, функция возвращает не нулевое значение. В этом случае программа может прочитать символы из буфера клавиатуры при помощи функции getch() и getche(). Если буфер пуст, функция возвращает нулевое значение. Приведем пример программы, ожидающей нажатия на любую клавишу. Во время ожидания программа выводит на
 
   
 

               
 
Break. Эта функция проверяет состояние клавиатурного буфера. Вы можете вызвать ее перед функциями 01h, 07h, 08h, для того, чтобы избежать ожидания нажатия на клавишу. Если программа выполняет какую-либо длительную обработку(копирование Файлов, форматирование дисков и т.п.), Вы можете вызвать эту функцию в процессе обработки для проверки нажатия комбинации клавиш, прерывающих работу программы.   3.7. Сброс буфера клавиатуры На входе: AH = 0Ch; AL = 1, 6, 7, 8, или 0Ah. На выходе: Не определены.   Функция очищает клавиатурный буфер и вызывает клавиатурную функцию MS-DOS, номер которой определяется содержимым регистра AL. Если же регистр AL содержит другое значение, кроме приведенных выше, функция просто сбрасывает содержимое буфера и не выполняет никаких других действий. Эту функцию удобно использовать тогда, когда перед выводом символа необходимо убедиться в том, что буфер клавиатуры пуст.   4. Клавиатурные функции библиотеки Mocrosoft C Стандартные библиотеки трансляторов Mocrosoft Quick и C 6.0 содержат набор функций, предназначенных для работы с клавиатурой. Эти функции повторяют и немного дополняют возможмости функций MS-DOS и BIOS, обслуживающих клавиатуру. Самые простые из них - getch() и getche(). Они списаны в файле conio.h. Функция getch() имеет следующий прототип: int getch(void); Эта функция возвращает ASCII-код прочитанного из клавиатурного буфера символа, причем прочитанный символ не отображается на экране. Если была нажата функциональная клавиша или клавиша перемещения курсора, функция возвращает 0. В этом случае функцию надо вызывать еще раз для получения расширенного ASCII-кода нажатой клавиши. Функция обрабатывает клавиши Ctrl-C и Ctrl-Break- при
 
Ctrl-Break инициирует прерывание типа 1B (клавиша прерывания). Эта комбинация клавиш возвращает 0 в регистрах AL и AH. Ctrl-NumLock заставляет ЭВМ ждать, пока Вы не нажмете какую либо клавишу, отличную от клавиши NumLock. Это даст Вам возможность приостановить операцию (например, распечатку программы), а за тем возобновить ее исполнение. Shift-PrtSc инициирует прерывание типа 5 (печать содержимого экрана). Процедура BIOS, обслуживающая клавиатуру воспринимает клавиши Ctrl, Shift, NumLock, ScrollLockиIns как управляющие. Программа обработки прерывания типа 16 (обмен данными с клавиатурой) возвращает байт состояния регистровых клавиш, который сообщает о том, какие из этих клавиш были нажаты. 1. АППАРАТНОЕ ПРЕРЫВАНИЕ КЛАВИАТУРЫ   Клавиатура подключена к линии прерывания IRQ1. Этой линии соответствует прерывание INT 09h. Клавиатурное прерывание обслуживается модулями BIOS. Драйверы клавиатуры и резидентные программы могут организовывать дополнительную работу прерывания INT 09h. Для этого может быть использована цепочка обработчиков прерывания. В первой книге первого тома мы приводили примеры расширения обработчиков прерывания INT 09h. Как работает стандартный обработчик клавиатурного прерывания, входящий в состав BIOS? Этот обработчик выполняет следующие действия: – читает из порта 60h скан-код нажатой клавиши; – записывает вычисленное по скан-коду значение ASCII-кода нажатой клавиши в специальный буфер клавиатуры, расположенный в области данных BIOS; – устанавливает в 1 бит 7 порта 61h, разрешая дальнейшую работу клавиатуры; – возвращает этот бит в исходное состояние; – записывает в порт 20h значение 20h для правильного завершения обработки аппаратного прерывания.   Обработчик прерывания INT 09h не просто записывает значение ASCII-кода в буфер клавиатуры. Дополнительно от
 
   
 

               
 

слеживаются нажатия таких комбинаций клавиш, как Ctrl-Alt-Del, обрабатываются специальные клавиши PrtSc и SysReq. При вычислении кода ASCII нажатой клавиши учитывается состояние клавиш Shift и CapsLock.

Буфер клавиатуры имеет длину 32 байта и расположен по адресу 0000h:041Eh для машин IBM PC/XT.

В IBM AT и PS/2 расположение клавиатурного буфера задается содержимым двух слов памяти с адресами 0000h:0482h (компонента смещения адреса начала буфера). Обычно в IBM AT эти ячейки содержат значения соответственно 001Eh и 003Eh. Так как смещения заданы относительно сигментного адреса 0040h, то видно, что обычное расположение клавиатурного буфера в IBM AT и PS/2 соответствует его расположению в IBM PC/XT.

Клавиатурный буфер организован циклически. Это означает, что при его переполнении самые старые значения будут потеряны. Две ячейки памяти, находящиеся в области данных BIOS с с адресами 0000h:041Ah и 0000h:041Ch, содержат соответственно указатели на начало и конец буфера. Если значения этих указателей равны друг другу, буфер пуст (можно удалить все символы из буфера клавиатуры, установив оба указателя на начал буфера. Однако есть более предпочтительный способ с использованием прерывания BIOS INT 16h).

Указателями на начало и конец клавиатурного буфера обычно управляют обработчики прерываний INT 09h и INT 16h.

Программа извлекает из буфера коды нажатых клавиш, используя различные функции прерывания INT 16h.

Помимо управления содержимым буфера клавиатуры, обработчик прерывания INT 09h отслеживает нажатия на так называемые переключающие клавиши - NumLock, ScrollLock, CapsLock, Ins. Состояние этих клавиш записывается в область данных BIOS в два байта с адресами 0000h:0417h и 0000h:0418h.

 

Формат байта 0000h:0417h:

Биты Значение
Нажата правая клавиша Shift
Нажата левая клавиша Shift
Нажата комбинация клавиш Ctrl-Shift с любой стороны
 
 
3.5. Ввод строки символов На входе: AH = 0Ah; DS:DX = адрес буфера для вывода строки. На входе: Буфер содержит введенную строку.   Функция проверяет комбинации клавиш Ctrl-C и Ctrl-Break. Функция предназначена для ввода с клавиатуры строки символов. Перед вызовом функции необходимо специальным образом подготовить буфер, адрес которого передается в регистрах DS:DX,- в первый байт буфера следует записать максимальную длину вводимой строки(в диапазоне от 1 до 244):       Ввод осуществляется до тех пор, пока либо количество введенных символов не достигнет max-1, либо пока не будет нажата клавиша Enter(код 0Dh). Если оператор уже ввел max-1 символов и продолжает вводить символы дальше, функция выдает звуковой сигнал на каждое нажатие и игнорирует вводимые символы до тех пор, пока не будет нажата клавиша Enter. При вводе строки можно использовать стандартные средства редактирования MS-DOS, используемые при вводе команд в режиме командной строки.   3.6. Проверка состояния стандартного ввода На входе: AH = 0Bh. На выходе: AL = 0FFh, если в буфере имеется код нажатой на клавиатуре клавиши; AL = 0, если буфер клавиатуры пуст. Функция проверяет комбинации клавиш Ctrl-C и Ctrl-
 
   
 

               
 
жит 0, то следующий вызов этой же функции возвратит в регистре AL расширенный ASCII-код символа. Функция проверяет комбинации клавиш Ctrl-C и Ctrl-Break. Если буфер клавиатуры пуст, выполнение программы задерживается до нажатия на любую клавишу. Эту функцию удобно использовать в тех случаях, когда завершение программы по нажатию комбинаций клавиш Ctrl-C или Ctrl-Break по тем или иным причинам нежелательно. Например, программа держит в оперативной памяти буфера для данных, которые перед завершением работы обязательно должны быть записаны на диск. Если оператор в неподходящий момент нажал Ctrl-C и программа аварийно завершила работу, содержимое буферов будет потеряно.   3.4. Ввод/вывод на консоль На входе: AH = 06h. DL = 0FFh - для вывода символа с консоли; или; DL = код символа, не равный 0FFh,-для вывода символа на консоль. На выходе: ZF = 0, если в буфере имеется код нажатой на клавиатуре клавиши; ZF = 1,если буфер клавиатуры пуст; AL = ASCII-код символа или 0, если AH содержит расширенный ASCII-код символа. Функция проверяет комбинации клавиш Ctrl-C и Ctrl-Break. Функция 06h может использоваться как для ввода с консоли, так и для вывода символов на консоль. Режим работы функции зависит от содержимого регистра DL при вызове функции. Если этот регистр содержит значение 0FFh, функция выполняет ввод с консоли, в противном случае символ, код которого записан в этот регистр, выводится на консоль. Очевидно, что с помощью этой функции нельзя вывести на консоль символ с кодом 0FFh. Основное отличие функции 06h от всех описанных ранее заключается в том, что эта функция не ожидает, пока оператор нажмет на клавишу. Если буфер клавиатуры пуст, функция просто устанавливает флаг процессора ZF в 1. Если в буфере клавиатуры имеются символы, флаг ZF сбрасывается и в регистр AL функция записывает ASCII-код символа.
 
ны
Нажата комбинация клавиш Alt-Shift с любой стороны
Состояние клавиши ScrollLock
Состояние клавиши NumLock
Состояние клавиши CapsLock
Состояние клавиши Insert

Формат байта 0000h:0418h:

Биты Значение
Нажата левая клавиша Shift вместе с клавишей Ctrl
Нажата левая клавиша Shift вместе с клавишей Alt
Нажата клавиша SysReq
Состояние клавиши Pause
Нажата клавиша ScrollLock
Нажата клавиша NumLock
Нажата клавиша CapsLock
Нажата клавиша Insert

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

Программой обработки прерывания INT 09h отслеживаются некоторые комбинации клавиш. В таблице приведены эти комбинации и действия, выполняемые обработчиком прерывания при их обнаружении:

 

Комбинации клавиш Выполняемые действия
Ctrl-Alt-Del Сброс и перезагрузка системы
Ctrl-NumLock, Pause Перевод машины в состояние ожидания до нажатия любой клавиши
Shift-PrtSc Распечатка на принтере содержимого видеопамяти
Ctrl-Break Выполнение прерывания INT 1Bh, завершающего работу программы
 
   
 

               
 
шающего работу программы

 

Многие типы клавиатур имеют отдельную альтернативную цифровую панель, напоминающую клавиатуру калькулятора. Если одновременно с нажатием на клавишу Alt набрать число на этой панели (не большее чем 255 и не равное 0), то это число будет помещено в буфер клавиатуры, как будто бы оно было введено нажатием на одну клавишу. Это число будет также записано в слове по адресу 0000h:0419h в области данных BIOS.

При переполнении внутреннего буфера клавиатуры или буфера, расположенного в области данных BIOS программа-обработчик прерывания INT 09h генерирует звуковой сигнал.

При составлении программ для MS-DOS у Вас едва ли появится необходимость непосредственного манипулирования содержимым буфера клавиатуры – Вы можете использовать прерывание BIOS INT 16h для выполнения практически всех клавиатурных операций.

В следующем разделе мы займемся непосредственно изучением средств работы с клавиатурой, предоставляемых в распоряжение прерыванием BIOS INT 16h.

 



©2015- 2017 stydopedia.ru Все материалы защищены законодательством РФ.