Теперь все вместе: Демонстрационная программа работы с клавиатурой
Как теперь насчет того, чтобы собрать все написанное про клавиатуру в одну кучу? В Листинге 3.7 представлена демонстрационная программа, которая состоит из вызовов уже написанных в этой главе функций. Она показывает скан-коды нажатых клавиш и состояние клавиш Ctrl и Alt. Если вы нажмете Q, программа завершит свою работу.
Листинг 3.7. Демонстрационная программа работы с клавиатурой (KEY.C).
// ВКЛЮЧАЕМЫЕ ФАЙЛЫ ///////////////////////////////////////
#include <dos.h>
#include <bios.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <graph.h>
// ОПРЕДЕЛЕНИЯ ///////////////////////////////////////////////
// битовые маски для управляющих клавиш
#define SHIFT_R 0х0001
#define SHIFT_L 0х0002
#define CTRL 0х0004
#define ALT 0х0008
#define SCROLL_LOCK_ON 0х0010
#define NUM_LOCK_ON 0х0020
#define CAPS_LOCK_ON 0х0040
#define INSERT_MODE 0х0080
#define CTRL_L 0х0100
#define ALT_L 0х0200
#define CTRL_R 0х0400
#define ALT_R 0х0800
#define SCROLL_LOCK_DWN 0х1000
#define NUM_LOCK_DWN 0х2000
#define CAPS_LOCK_DWN 0х4000
#define SYS_REQ_DWN 0х8000
// Значения скан-кодов. Внимание: каждая клавиша продуцирует только
// один скан-код, поэтому определения даны только для символов
// нижнего регистра. Например, одна и та же клавиша соответствует
// символу "1" (нижний регистр) и символу "!" (верхний регистр).
// Однако пользоваться надо все равно определением SCAN_1
#define SCAN_ESC 1
#define SCAN_1 2
#define SCAN_2 3
#define SCAN_3 4
#define SCAN_4 5
#define SCAN_5 6
#define SCAN_6 7
#define SCAN_7 8
#define SCAN_8 9
#define SCAN_9 10
#define SCAN_0 11
#define SCAN_MINUS 12
#define SCAN_EQUALS 13
#define SCAN_BKSPаааааааа 14
#define SCAN_TABааааааааа 15
#define SCAN_Qааааааааааа 16
#define SCAN_Wааааааааааа 17
#define SCAN_Eааааааааааа 18
#define SCAN_Rааааааааааа 19
#define SCAN_Tааааааааааа 20
#define SCAN_Yаааааааа 21
#define SCAN_Uаааааааа 22
#define SCAN_Iаааааааа 23
#define SCAN_0аааааааа 24
#define SCAN_Pаааааааа 25
# define SCAN_LFT_BRACKET 26
#define SCAN_RGT_BRACKET 27
#define SCAN_ENTERаааа 28
#define SCAN_CTRLааааа 29
#define SCAN_Aаааааааа 30
#define SCAN_Sаааааааа 31
#define SCAN_Dаааааааа 32
#define SCAN_Fаааааааа 33
#define SCAN_Gаааааааа 34
#define SCAN_Hаааааааа 35
#define SCAN_Jаааааааа 36
#define SCAN_Kаааааааа 37
#defane SCAN_Lаааааааа 38
#define SCAN_SEMIааааа 39
#define SCAN_APOSааааа 40
#define SCANJTILDEаааа 41
#define SCAN_LEFT_SHIFT 42
#define SCAN_BACK_SLASH 43
#define SCAN_Zаааааааа 44
#define SCAN_Xаааааааа 45
#define SCAN_Cаааааааа 46
#define SCAN_Vаааааааа 47
#define SCAN_Bаааааааа 48
#define SCAN_Nаааааааа 49
#define SCAN_Mаааааааа 50
#define SCAN_COMMAаааа 51
#define SCAN_PERIODааа 52
#define SCAN_FOWARD_SLASH 53
#define SCAN_RIGHT_SHIFT 54
#define SCAN_PRT_SCRNа 55
#define SCAN_ALTаааааа 56
#define SCAN_SPACEаааа 57
#define SCAN_CAPS_LOCK 58
#define SCAN_F1ааааааа 59
#define SCAN_F2ааааааа 60
#define SCAN_F3ааааааа 61
#define SCAN_F4ааааааа 62
#define SCAN_F5ааааааа 63
#define SCAN_F6ааааааа 64
#define SCAN_F7ааааааа 65
#define SCAN_F8ааааааа 66
#define SCAN_F9ааааааа 67
#define SCAN_F10аааааа 68
#define SCAN_Fllаааааа 133
#define SCAN_Fl2аааааа 134
#define SCAN_NUM_LOCKа 69
#define SCAN_SCROLL_LOCKа 70
#define SCAN_HOMEаааааааа 71
#define SCAN_UPаааааааааа 72
#define SCAN_PGUPаааааааа 73
#define SCAN_NUM_MINUSааа 74
#define SCAN_LEFTаааааааа 75
#define SCAN_CENTERаааааа 76
#define SCAN_RIGHTааааааа 77
#define SCAN_NUM_PLUSаааа 78
#define SCAN_ENDааааааааа 79
#define SCAN_DOWNаааааааа 80
#define SCAN_PGDWNааааааа 81
#define SCAN_INSааааааааа 82
#define SCAN_DELааааааааа 83
// LL=¦гLL /////////////////////////////////////////////
unsigned char Get_Ascii_Key(void)
{
// +ёыш т сєЇхЁх ъыртшрЄєЁv хёЄ№ ёшьтюы, ЇєэъЎш тючтЁр•рхЄ хую
// ASCII-ъюф. +ёыш ёшьтюыр эхЄ, тючтЁр•рхЄё 0.
if (_bios_keybrd(_KEYBRD_READY)) return(_bios_keybrd(_KEYBRD_READ)) ;
else return(0);
} // ъюэхЎ ЇєэъЎшш
////////////////////////////////////////////////////////
unsigned int Get_Control_Keys(unsigned int mask)
(ааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааа
// ЇєэъЎш тючтЁр•рхЄ ёюёЄю эшх ы¦сющ єяЁрты ¦•хщ ъыртш°ш
return(mask & _bios_keybrd(_KEYBRD_SHIFTSTATUS));
}//ъюэхЎ ЇєэъЎшш ////////////////////////////////////////////////////////
unsigned char Get_Scan_Code(void) (
// ЇєэъЎш тючтЁр•рхЄ ёърэ-ъюф эрцрЄющ ъыртш°ш // шёяюы№чєхЄё тёЄЁюхээvщ рёёхьсыхЁ
_asm{
mov ah,01hааа ;ЇєэъЎш 01h - яЁютхЁър эрцрЄш ъыртш°ш
int 16hаааааа ;тvчют яЁхЁvтрэш
jz emptyааааа ;эхЄ ёшьтюыр - тvїюфааааааааа
mov ah,00hааа ;ЇєэъЎш 0 - яюыєўхэшх ёърэ-ъюфр
int 16hаааааа ;тvчют яЁхЁvтрэш
mov al,ahаааа ;яхЁхьх•рхь Ёхчєы№ЄрЄ шч L= т AL
xor ah,ahаааа ;юсэєы хь L=
jmp doneааааа ;Ёхчєы№ЄрЄ тючтЁр•рхЄё т L-
empty:
xor ax,axааа ;юсэєы хь AX
done:
} //ъюэхЎ рёёхьсыхЁэюую сыюър
} // ъюэхЎ ЇєэъЎшш
// +T=+T=L- ¦¦++¦L¦¦L ///////////////////////////////////////
void main(void)
{
unsigned char key;
int done=0;
unsigned int control;
_clearscreen(_GCLEARSCREEN);
while(!done)
{
_settextposition(2,0);
if ( (key = Get_Scan_Code()) ) printf("%c %dа ",key,key);
// яЁютхЁър эр эрцрЄшх Ctrl ш Alt
if (Get_Control_Keys(CTRL))
printf("\ncontrol key pressed");
if (Get_Cbntrol_Keys(ALT))
printf("\nalt key pressedааа ");
if (key==16) done=1); // 16 Ч ¤Єю ёърэ-ъюф ъыртш°ш Q
}// ъюэхЎ Ўшъыр while
} // ъюэхЎ ЇєэъЎшш main