Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
sistemnoe_programmirovanie / 06 Мр по лаб_раб_Асс_инф.doc
Скачиваний:
135
Добавлен:
18.02.2016
Размер:
1.18 Mб
Скачать

5.2.4 Расширенные коды ascii и управление программой с клавиатуры

Процесс считывания ASCII-кодов клавиш клавиатуры с помощью системных функцийDOSотносится к алфавитно-цифровым клавишам, за которыми закрепленыASCII-таблицей отображаемые символы (буквы, цифры, знаки препинания и др.). Кроме них, на клавиатуре персонального компьютера имеется ряд клавиш, которым не назначены какие-либо отображаемые символы. Это, например, функциональные клавиши<F1>,...,<F12>,клавиши управления курсором<Home>, <End>, ... , <Стрелка вправо>, Стрелка вниз, специальные клавиши Ins, <Del>, а также использующие на практике различные сочетания клавиш с <Ctrl>, <Alt> и <Shift>. В этом случае, в качествеscan-кода клавиши или какой-либо комбинации из них выступает также старший байт кодового слова, но уже при нулевом младшем байте (нулевом кодеASCII). Например, при нажатии клавиши<F1>в кольцевой буфер ввода клавиатуры поступает код3B00h, а клавиши<Home> – 4700h.

Двухбайтовые коды клавиш, содержащие на месте кода ASCII – ноль, называются расширенными кодами ASCII. Эти коды (и соответствующие им клавиши) широко используются для управления программами. Для доказательства этого утверждения достаточно указать на популярную оболочкуDOS– Norton Commander. Широкое использование в компьютерах интерактивных средств требовало расширение возможностей ввода с клавиатуры управляющей информации, которую программа должна отличать от вводимого текста. Поэтому расширенные кодыASCIIгенерируются и всеми алфавитно-цифровыми клавишами, если они нажимаются совместно с клавишей<Alt>. В табл. 5.2 приведены значения расширенныхASCII-кодов для одиночных клавиш.

Таблица5.2

Расширенные коды для функциональных клавиш

Клавиша

Код (hex)

Клавиша

Код (hex)

Клавиша

Код (hex)

Клавиша

Код (hex)

Правая часть клавиатуры.

"Num Lock-выкл"

<F1>

<F2>

<F3>

<F4>

<F5>

<F6>

3B

3C

3D

3E

3F

40

<F7>

<F8>

<F9>

<F10>

<F11>

<F12>

41

42

43

44

85

86

<Home>

<PgUp>

5

47

48

49

4B

4C

4D

<End>

<PgDn>

Ins

Del

4F

50

51

52

53

В составе комбинации Alt+<Клавиша>

A

B

C

D

E

F

G

H

I

J

K

L

1E

30

2E

20

12

21

22

23

17

24

25

26

M

N

O

P

Q

R

S

T

U

V

W

X

32

31

18

19

10

13

1F

14

16

2F

11

2D

Y

Z

0

1

2

3

4

5

6

7

8

9

15

2C

81

78

79

7A

7B

7C

7D

7E

7F

80

<F1>

<F2>

<F3>

<F4>

<F5>

<F6>

<F7>

<F8>

<F9>

<F10>

<F11>

<F12>

68

69

6A

6B

6C

6D

6E

6F

70

71

8B

8C

Рассмотренные выше функции DOS, предназначенные для посимвольного ввода данных с клавиатуры, позволяют работать и с расширенными кодами ASCII.Однако программа при этом должна вызывать функциюDOSдважды. Первый вызов всегда возвращает младший байт и, если он равен нулю, то необходимо повторить вызов этой же функции для вывода старшего байта. Это и будет информационный байт расширенного кодаASCII,который можно использовать для управления программой.

Обратим здесь внимание на важный момент!Расширенный кодASCIIможно считать, если программа будет настроена на проверку нулевого значения младшего байта для каждого нажатия клавиши. Пример использования функциональных клавиш для управления программой показан в листинге 5.1.

Листинг 5.1Фрагмент программы, демонстрирующий выполнение альтернативных действий на основе анализа расширенных кодовASCII

DATASEG

mes1DB13,10,'Сообщение <F1> $'

mes2DB13,10,'Сообщение <Shift/F1> $'

mes3 DB 13,10,'Сообщение <Alt/A> $'

..................

CODESEG

..................

;Ожидаем нажатия клавиши

again:movah,08h;Функция ввода одиночного символа без эха

int21h;Первый вызовDOS

cmpal,0 ;РасширенныйASCIIкод?

Jneagain;Нет

movah,08h;Да, введём старший байт

int21h;Повторный вызовDOS

cmpal,3B;НажатаF1?

JeF1 ;Да

cmpal,54h;Нажата <Shift/F1>?

Je Shift_F1 ;Да

cmp al,1Eh ;Нажата <Alt/A>?

JeAlt_A;Да

jmpagain;Нажато незапланированное

F1:;Вывод сообщенияmes1

................

jmpExit

Shift_F1:;Вывод сообщенияmes2

.................

jmpExit

Alt_A:;Вывод сообщенияmes3

.................

Exit:;Завершение программы