Библиотека системного программиста




Скачать 3.55 Mb.
Название Библиотека системного программиста
страница 9/48
Тип Документы
rykovodstvo.ru > Руководство эксплуатация > Документы
1   ...   5   6   7   8   9   10   11   12   ...   48

Средства BIOS для работы с клавиатурой


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

Чтение символа с ожиданием


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

Приведем формат вызова функции:


Регистры на входе:

AH = 00h

Регистры на выходе:

AL = код ASCII символа или 0, если AH содержит расширенный код ASCII символа;

AH = скан-код или расширенный код ASCII символа, если AL=0


Приведем таблицу скан-кодов:


01

Esc

12

E

23

H

34

. >

45

NumLock

02

1 !

13

R

24

J

35

/ ?

46

ScrLock

03

2 @

14

T

25

K

36

Shift прав.

47

Home [7]

04

3 #

15

Y

26

L

37

PrtSc

48

Up [8]

05

4 $

16

U

27

; :

38

Alt

49

PgUp [9]

06

5 %

17

I

28

‘ “

39

Пробел

4A

[-]

07

6 ^

18

O

29

` ~

3A

CapsLock

4B

<- [4]

08

7 &

19

P

2A

Shift лев.

3B

F1

4C

[5]

09

8 *

1A

[ {

2B

\ |

3C

F2

4D

-> [6]

0A

9 (

1B

] }

2C

Z

3D

F3

4E

[+]

0B

0 )

1C

Enter

2D

X

3E

F4

4F

End [1]

0C

- _

1D

Ctrl

2E

C

3F

F5

50

Dn [2]

0D

= +

1E

A

2F

V

40

F6

51

PgDn [3]

0E

Bksp

1F

S

30

B

41

F7

52

Ins [0]

0F

Tab

20

D

31

N

42

F8

53

Del [.]

10

Q

21

F

32

M

43

F9







11

W

22

G

33

, <

44

F10








Для остальных клавиш функция 00h прерывания INT 16h возвращает расширенный код ASCII:


F1

3b

Shift+F1

54

Ctrl+F1

5e

Alt+F1

68

F2

3c

Shift+F2

55

Ctrl+F2

5f

Alt+F2

69

F3

3d

Shift+F3

56

Ctrl+F3

60

Alt+F3

6a

F4

3e

Shift+F4

57

Ctrl+F4

61

Alt+F4

6b

F5

3f

Shift+F5

58

Ctrl+F5

62

Alt+F5

6c

F6

40

Shift+F6

59

Ctrl+F6

63

Alt+F6

6d

F7

41

Shift+F7

5a

Ctrl+F7

64

Alt+F7

6e

F8

42

Shift+F8

5b

Ctrl+F8

65

Alt+F8

6f

F9

43

Shift+F9

5c

Ctrl+F9

66

Alt+F9

70

F10

44

Shift+F10

5d

Ctrl+F10

67

Alt+F10

71

Alt+A

1E

Alt+P

19

Alt+3

7A

Down

50

Alt+B

30

Alt+Q

10

Alt+4

7B

Left

4B

Alt+C

2E

Alt+R

13

Alt+5

7C

Right

4D

Alt+D

20

Alt+S

1F

Alt+6

7D

Up

48

Alt+E

12

Alt+T

14

Alt+7

7E

End

4F

Alt+S

21

Alt+U

16

Alt+8

7F

Home

47

Alt+G

22

Alt+V

2F

Alt+9

80

PgDn

51

Alt+H

23

Alt+W

11

Alt+-

82

PdUp

49

Alt+I

17

Alt+X

2D

Alt+=

83







Alt+J

24

Alt+Y

15







Ctrl+Left

73

Alt+K

25

Alt+Z

2C







Ctrl+Right

74

Alt+L

26







Shift+Tab

0F

Ctrl+End

75

Alt+M

32

Alt+0

81

Insert

52

Ctrl+Home

77

Alt+N

31

Alt+1

78

Delete

53

Ctrl+PgDn

76

Alt+O

18

Alt+2

79

PrintScr

72

Ctrl+PgUp

84


В следующей таблице приведены скан-коды клавиш, имеющихся только на 101-клавишной клавиатуре:


F11

85

Alt-Bksp

0e

Alt- Д /

a4

F12

86

Alt-Enter

1c

Alt- Д *

37

Shft-F11

87

Alt-Esc

01

Alt- Д -

4a

Shft-F12

88

Alt-Tab

a5

Alt- Д +

4e

Ctrl-F11

89

Ctrl-Tab

94

Alt- Д Enter

a6

Ctrl-F12

8a













Alt-F11

8b

Alt-up Up

98

Ctrl- Д /

95

Alt-F12

8c

Alt-down Dn

a0

Ctrl- Д *

96

Alt-[

1a

Alt-left <-

9b

Ctrl- Д -

8e

Alt-]

1b

Alt-right ->

9d

Ctrl- Д +

90

Alt-;

27












Alt-'

28

Alt-Delete

a3

Ctrl- Д Up [8]

8d

Alt-`

29

Alt-End

9f

Ctrl- Д 5 [5]

8f

Alt-\

2b

Alt-Home

97

Ctrl- Д Dn [2]

91

Alt-,

33

Alt-Insert

a2

Ctrl- Д Ins[0]

92

Alt-.

34

Alt-PageUp

99

Ctrl- Д Del[.]

93


Буква "Д" здесь обозначает дополнительную клавиатуру.

Программа KBDSCAN


Для демонстрации использования функции 00h прерывания INT 16h мы подготовили программу, выводящую на экран скан-коды и коды ASCII нажимаемых клавиш (листинг 2.2).

Листинг 2.2. Файл kbdscan\kbdscan.c

// =====================================================

// Просмотр клавиатурных скан-кодов и кодов ASCII

//

// (C) Фролов А.В, 1997

//

// E-mail: frolov@glas.apc.org

// WWW: http://www.glasnet.ru/~frolov

// или

// http://www.dials.ccas.ru/frolov

// =====================================================

#include

#include
int main(void)

{

union REGS rg;

printf("KBDSCAN, (c) A. Frolov, 1997\n"

"Press to exit\n");
for(;;)

{

// Вызываем прерывание INT 16h

rg.h.ah = 0;

int86(0x16, &rg, &rg);
// Выводим на экран содержимое регистров AH и AL,

// содержащих, соответственно, скан-код и код ASCII

// нажатой клавиши

printf("\nScan = %02.2X Ascii = %02.2X",

rg.h.ah, rg.h.al);
// Если была нажата клавиша ESC, завершаем работу

// программы

if(rg.h.ah == 1)

break;

}

return 0;

}

Проверка буфера на наличие в нем символов


Функция 01h поможет вам проверить состояние буфера клавиатуры - есть там коды нажатых клавиш или нет. При этом программа не переводится в состояние ожидания, даже если буфер клавиатуры пуст. В этом случае в регистре флагов флаг ZF устанавливается в единицу и управление возвращается программе.

Формат вызова функции представлен ниже:


Регистры на входе:

AH = 01h

Регистры на выходе:

ZF = 0, если в буфере имеется код нажатой клавиши;

ZF = 1, если буфер клавиатуры пуст;

AL = код ASCII символа или 0, если AH содержит расширенный код ASCII символа;

AH = скан-код или расширенный код ASCII символа, если AL=0


Эту функцию удобно использовать во время выполнения какого-либо длительного процесса (например, форматирования диска или передачи данных по линии связи) для прерывания этого процесса по запросу пользователя.

Кроме того, функцию 01h можно применять вместе с функцией 00h для сброса содержимого клавиатурного буфера. Для этого в цикле повторяют вызов функции 01h, вслед за которым идет вызов функции 00h при условии, что буфер клавиатуры не пуст.

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

Программа CHKBUF


Приведем исходный текст программы CHKBUF, выводящей на экран в цикле символ '*' (листинг 2.3). Если нажать любую клавишу, кроме , программа выводит на экран строку текста - инструкцию для завершения работы программы. Если же нажать на клавишу , работа программы будет завершена.

Листинг 2.3. Файл chkbuf\chkbuf.c

// =====================================================

// Демонстрация способа проверки буфера клавиатуры

//

// (C) Фролов А.В, 1997

//

// E-mail: frolov@glas.apc.org

// WWW: http://www.glasnet.ru/~frolov

// или

// http://www.dials.ccas.ru/frolov

// =====================================================

#include

#include
int main(void)

{

union REGS rg;

int i, zflag;

printf("CHKBUF, (c) A. Frolov, 1997\n");

for(;;)

{

// Выводим в цикле символ '*'

putchar('*');
// Небольшая задержка во времени

for(i=0; i<30000; i++);
// Вызываем прерывание INT 16h для проверки буфера

// клавиатуры. Устанавливаем флаг, который будет сброшен

// при нажатии на любую клавишу

zflag = 1;
_asm

{

mov ax, 0100h

int 16h
// Если клавишу не нажимали,

// продолжаем выполнение программы

jz nokey
// В противном случае сбрасываем флаг

mov zflag, 0

nokey:

}
if(zflag == 0)

{

// Если флаг сброшен, читаем код нажатой клавиши из

// буфера при помощи функции 01h прерывания INT 16h

rg.h.ah = 0;

int86(0x16, &rg, &rg);
// Если была нажата клавиша ,

// завершаем работу программы

if(rg.h.ah == 1)

{

// Выводим на экран содержимое регистров AH и AL,

// содержащих, соответственно, скан-код и код ASCII

// нажатой клавиши

printf("\nScan = %02.2X Ascii = %02.2X",

rg.h.ah, rg.h.al);

break;

}

else

printf("\nPress to exit\n");

}

}

return 0;

}

Получение состояния переключающих клавиш


Функция 02h возвращает в регистре AL состояние переключающих клавиш, таких как , , , , , , :


Регистры на входе:

AH = 02h

Регистры на выходе:

AL = Байт состояния переключающих клавиш


Формат байта состояния соответствует формату байта, находящегося в области данных BIOS по адресу 0000h:0417h:


Биты

Описание

0

Нажата правая клавиша

1

Нажата левая клавиша

2

Нажата комбинация клавиш с левой или правой стороны

3

Нажата комбинация клавиш с левой или правой стороны

4

Состояние клавиши

5

Состояние клавиши

6

Состояние клавиши

7

Состояние клавиши


Функция 02h может быть использована для анализа текущего состояния переключающих клавиш.

Ниже показан фрагмент кода, в котором проверяется состояние клавиши :

rg.h.ah = 2;

int86(0x16, &rg, &rg);

if((rg.h.al & 0x40) == 0)

{

// Клавиша не нажата,

// соответствующий светодиод не горит

. . .

}

else

{

// Клавиша нажата

. . .

}

Установка временных характеристик клавиатуры


Мы уже рассказывали о возможности изменения временных характеристик клавиатуры. Если BIOS, установленная в вашей машине, изготовлена после 15 декабря 1985 года, вы можете воспользоваться функцией 03h для ускорения (или замедления) работы клавиатуры:


Регистры на входе:

AH = 03h;

AL = 05h;

BL = Период автоповтора (количество повторов за одну секунду)

BH = Задержка включения режима автоповтора

Регистры на выходе:

Не используются


Период автоповтора задается следующим образом:


Содержимое регистра BL

Период автоповтора

0

30,0

1

26,7

2

24,0

4

20,0

8

15,0

0Ah

10,0

0Dh

9,2

10h

7,5

14h

5,0

1Fh

2,0


Для задержки включения режима автоповтора вы можете указывать следующие значения:


Содержимое регистра BH

Задержка включения режима автоповтора, mc

0

250

1

500

2

750

3

1000


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

union REGS rg;

. . .

rg.h.al = 5;

rg.h.ah = 3;
// Устанавливаем максимальное быстродействие клавиатуры

rg.h.bl = 0;

rg.h.bh = 0;

int86(0x16, &rg, &rg);
. . .

// Восстанавливаем исходное быстродействие клавиатуры

rg.h.bl = 0xa;

rg.h.bh = 1;

int86(0x16, &rg, &rg);

Запись символов в буфер клавиатуры


С помощью функции 05h можно вставить символы в буфер клавиатуры, как будто они были введены оператором.


Регистры на входе:

AH = 05h;

CL = код ASCII записываемого символа;

CH = скан-код записываемого символа, или 0

Регистры на выходе:

AL = 0 - запись выполнена успешно;

AL = 1 - буфер клавиатуры переполнен


Приведенная ниже фрагмент программы записывает в буфер клавиатуры пять символов '*'. Если запустить программу, соедржащую этот фрагмент кода, а затем посмотреть на системное приглашение, то вы увидите что-нибудь похожее на C:\>*****.

union REGS rg;

int i;

for(i=0; i<5; i++)

{

rg.h.ah = 5;

rg.h.cl = '*';

rg.h.ch = 9;

int86(0x16, &rg, &rg);

}

Чтение символа с ожиданием для 101-клавишной клавиатуры


Функция 10h, предназначенная для чтения символа с ожиданием, полностью аналогична функции 00h, но она может работать только с клавиатурой, имеющей 101 клавишу.

Приведем формат вызова функции:


Регистры на входе:

AH = 10h;

Регистры на выходе:

AL = код ASCII символа или 0, если AH содержит расширенный код ASCII символа;

AH = скан-код или расширенный код ASCII символа, если AL=0


Функция определена для BIOS, изготовленной после 15 декабря 1985 года.

Проверка буфера на наличие в нем символов для 101-клавишной клавиатуры


Функция 11h полностью аналогична функции 01h, но она предназначена для работы с клавиатурой, имеющей 101 клавишу:


Регистры на входе:

AH = 11h

Регистры на выходе:

ZF = 0, если в буфере имеется код нажатой клавиши;

ZF = 1, если буфер клавиатуры пуст;

AL = код ASCII символа или 0, если AH содержит расширенный код ASCII символа;

AH = скан-код или расширенный код ASCII символа, если AL=0


Эта функция определена для BIOS, изготовленной после 15 декабря 1985 года.

Получение состояния переключающих клавиш для 101-клавишной клавиатуры


Функция 12h возвращает в регистре AL состояние переключающих клавиш, таких как , , , , , , и используется только для 101-клавишных клавиатур:


Регистры на входе:

AH = 12h

Регистры на выходе:

AL = Байт состояния переключающих клавиш


Эта функция определена для BIOS, изготовленной после 15 декабря 1985 года.
1   ...   5   6   7   8   9   10   11   12   ...   48

Похожие:

Библиотека системного программиста icon М. Ю. Храмцов С. В. Шарф Руководство системного программиста (администратора)...
Руководство системного программиста (администратора) системы управления прохождением задач мвс-1000/7 (версия 1, RedHat)
Библиотека системного программиста icon Руководство системного программиста
«Электронный бюджет» подсистема обеспечения интеграции, ведения реестров и формуляров
Библиотека системного программиста icon Руководство системного программиста (администратора)
Муниципальный модуль распределённой автоматизированной системы государственного банка данных о детях
Библиотека системного программиста icon Руководство системного программиста лист утверждения бкмд. 425530....
Программное обеспечение системы централизованного управления персональными мобильными устройствами и платформами в корпоративных...
Библиотека системного программиста icon Руководство системного программиста
З по выполнению государственных функций и оказанию государственных услуг, заинтересованным лицам территориальными управлениями Росоэз...
Библиотека системного программиста icon Система цифровой регистрации изображений комплект программного обеспечения
Программный документ “Руководство системного программиста” содержит сведения о “Комплексе программ для получения и визуализации данных,...
Библиотека системного программиста icon Инструкция по проведению регламентных и восстановительных работ rus. Гаро. 00001-25 32 02
Пк типа ibm pc в операционной системе Windows’98 и имеющих квалификацию инженера-программиста или системного инженера. Инструкция...
Библиотека системного программиста icon Инструкция читателя в онлайн-проекте «Библиотека ЛитРес» Аннотация...
«Библиотека ЛитРес» (biblio litres ru) позволяет читателям библиотек получить бесплатный доступ к электронным книгам, представленным...
Библиотека системного программиста icon Муниципальный модуль прикладного программного обеспечения «аист»...
Настоящий документ является эксплуатационным документом на муниципальный модуль прикладного программного обеспечения «Аист» (далее...
Библиотека системного программиста icon В. П. Казанцев инструкция по охране труда для инженера-программиста
Инструкция, регламентирует безопасный, с точки зрения охраны труда, по­рядок действий инженера-программиста в процессе исполнения...
Библиотека системного программиста icon Сектор Абонемента
ЛитРес Библиотека (поиск "ЛитРес" или "Библиотека"), ссылка на приложение: https://play google com/store/apps/details?id=ru litres...
Библиотека системного программиста icon Учебно-методический комплекс по дисциплине наименование дисциплины...
Системного подхода, системной инженерии и с обширным арсеналом методов и моделей системного анализа. Это даст необходимую методологическую...
Библиотека системного программиста icon Должностная инструкция системного администратора информационной системы персональных данных
Настоящая инструкция определяет основные обязанности, права и ответственность системного администратора информационной системы доу...
Библиотека системного программиста icon Пример описания технических требований системного блока №1 2 2 Пример...
Устройство бесперебойного питания для рабочих станций. Типовая конфигурация №1 21
Библиотека системного программиста icon Пример описания технических требований системного блока №1 2 2 Пример...
Устройство бесперебойного питания для рабочих станций. Типовая конфигурация №1 22
Библиотека системного программиста icon Пример описания технических требований системного блока №1 2 2 Пример...
Устройство бесперебойного питания для рабочих станций. Типовая конфигурация №1 17

Руководство, инструкция по применению






При копировании материала укажите ссылку © 2024
контакты
rykovodstvo.ru
Поиск