| Ins : Bit = $60; {128}
| Caps : Bit*$40; { 64}
| Num : Bit = $20; { 32}
| Scroll : Bit = $10 { 16}
| end; {case}
| if ( Mem[0:$417] and Bit ) = Bit { бит включен? }
| then GetLockKey := True { да }
| else GetLockKey := False { нет }
| END;
| PROCEDURE SetLockKey( Lock : КеуТуре; В : Boolean );
| VAR
| M : Byte absolute 0:$417; { байт состояния }
| Bit : Byte;
| BEGIN
| case Lock of
| Ins Bit := $60; {128}
| Caps Bit := $40; { 64}
| Num Bit := $20; { 32}
| Scroll Bit := $10 { 16}
| end; {case}
| case В of
| True : M := M or Bit; { включить xxxLock }
| False : M := M and (255-Bit); { выключить xxxLock }
| end {case}
| END;
Рис. 21.9
- 505 -
| BEGIN { ПРИМЕР ВЫЗОВОВ }
| SetLockKey( Caps, True );
| { включить CapsLock }
| Write( 'Введите любой текст ' );
| ReadLn;
| SetLockKey(Caps, not GetLockKey(Caps));
| { наоборот } Write( 'Режим стал обратным ');
| ReadLn;
| END.
Рис. 21.9 (окончание)
Пример на рис. 21.9 переключает режимы, но не влияет на свечение индикаторов, которое управляется на разных классах ПЭВМ через различные порты.
С помощью подобных функций программа может так управлять вводом, что не будет нужды нажимать клавиши регистров. Сам факт нажатия клавиш регистров Shift, Ctrl и Alt может быть программно проанализирован путем опроса ячеек памяти 0:$417 и 0:$418. Если, например, надо проверить, нажата ли левая клавиша Shift (бит 1 в байте 0:$417 равен 1), то логическая функция должна иметь следующий вид:
if (Mem[0:$417] and 2) = 2 then ... {да, левый Shift нажат}
else ... { нет };
Если надо проверить нажатие правой и левой клавиш Shift одновременно, то условие немного изменится:
if (Mem[0:$417] and (2+1))=(2+1) then {да, обе Shift нажаты}
else { нет };
Подобные опросы можно применять при написании процедур запроса паролей, если паролем доступа к работе с программой делать комбинации типа Alt+Shift и т.п. Но подобная система опроса работает только при длительном нажатии клавиш регистров. Ведь в момент нажатия программа может не анализировать состояние регистров, и тогда информация проскочит «мимо». Четко отловить факт нажатия клавиш регистров можно лишь с помощью анализа скэн-кодов клавиш, перехватывая прерывания от клавиатуры (см. пример на рис. 21.11).
21.6. Скэн-коды клавиатуры и работа с ними
Чтение скэн-кодов клавиш — это самый низкий уровень программного опроса клавиатуры. Каждая нажатая клавиша выдает свой
- 506 -
уникальный скэн-код, который зависит только от ее местоположения на клавиатуре и никак не зависит от того, что под ней понимается. Так, арифметические знаки на алфавитной и цифровой клавиатурах имеют различные скэн-коды. Скэн-коды полностью совместимой с IBM PC ПЭВМ приведены в табл. 21. 2.
Таблица 21. 2
Клавиша | Скэн-код (16) | Скэн-код (10) | Клавиша | Скэн-код (16) | Скэн-код (10) |
Esc | $01 | 1 | Z | $2C | 44 |
!1 | $02 | 2 | X | $2D | 45 |
@2 | $03 | 3 | C | $2E | 46 |
#3 | $04 | 4 | V | $2F | 47 |
$4 | $05 | 5 | B | $30 | 48 |
%5 | $06 | 6 | N | $31 | 49 |
^6 | $07 | 7 | M | $32 | 50 |
&7 | $08 | 8 | <, | $33 | 51 |
*8 | $09 | 9 | >. | $34 | 52 |
(9 | $0A | 10 | ?/ | $35 | 53 |
)0 | $0B | 11 | Shift(правый) | $36 | 54 |
_- | $0C | 12 | PrintScreen | $37 | 55 |
+= | $0D | 13 | Alt | $38 | 56 |
BackSpace | $0E | 14 | Пробел | $39 | 57 |
TAB | $0F | 15 | CapsLock | $3A | 58 |
Q | $10 | 16 | F1 | $3B | 59 |
W | $11 | 17 | F2 | $3C | 60 |
E | $12 | 18 | F3 | $3D | 61 |
R | $13 | 19 | F4 | $3E | 62 |
T | $14 | 20 | F5 | $3F | 63 |
Y | $15 | 21 | F6 | $40 | 64 |
U | $16 | 22 | F7 | $41 | 65 |
I | $17 | 23 | F8 | $42 | 66 |
O | $18 | 24 | F9 | $43 | 67 |
P | $19 | 25 | F10 | $44 | 68 |
{[ | $1A | 26 | NumLock | $45 | 69 |
}] | $1B | 27 | ScrollLock | $46 | 70 |
Enter | $1C | 28 | 7 Home | $47 | 71 |
Ctrl | $1D | 29 | 8 Вверх | $48 | 72 |
- 507 -
A | $1E | 30 | 9 PgUp | $49 | 73 |
S | $1F | 31 | Серый - | $4A | 74 |
D | $20 | 32 | 4 Влево | $4B | 75 |
F | $21 | 33 |
| $4C | 76 |
G | $22 | 34 | 6 Вправо | $4D | 77 |
H | $23 | 35 | Серый + | $4E | 78 |
J | $24 | 36 | 1 End | $4F | 79 |
K | $25 | 37 | 2 Вниз | $50 | 80 |
L | $26 | 38 | 3 PgDn | $51 | 81 |
:; | $27 | 39 | 0 Ins | $52 | 82 |
“ ' | $28 | 40 | . Del | $53 | 83 |
~` | $29 | 41 | F11 | $D9 | 217 |
Shift (левый) | $2A | 42 | F12 | $DA | 218 |
|\ | $2B | 43 |
|
|
|
Проверить правильность этой таблицы на любой другой ПЭВМ (с MS-DOS и Турбо Паскалем, конечно) можно при помощи программы опроса скэн-кода нажатой клавиши (рис. 21. 10).