Lập trình nhận KeyBoard
Trang 1Trương Xuân Nam
Khi các bạn viết một chươngtrình bằng Pascal trên DOS, nếu như chương trình của bạn yêu cầu phải có khảnăng?bắt? một lúc nhiều phím thì các bạn không thể dùng các hàm có sẵn nhưReadKey được mà các bạn sẽ phải viết một hàm có khả năng?bắt? nhiều phím mộtlúc Lúc này có một phương án chấp nhận được là ta sẽ viết một lệnh thường trúcó chức năng đánh dấu xem phím nào đang được nhấn, chương trình chỉ việc kiểmtra xem phím đang được đánh dấu là phím nào là xong, đơn vị này tên là Keyboardvà có thể dịch trong các môi trường Turbo Pascal và Borland Pascal
Trong đơn vị chương trình nàycó lệnh InstallKeyboard dùng để cài lệnh thường trú chặn ngắt bàn phím lại vàđánh dấu mảng KeyPress Còn lệnh UninstallKeyboard để gỡ lệnh thường trú chặnbàn phím ra Để kiểm tra xem một phím có phải đang được nhấn hay không ta kiểmtra xem phần tử tương ứng của nó ở KeyPress có bằng True hay không, nếu bằngFalse tức là phím không được ấn Các bạn có thể tham khảo cách sử dụng trongchương trình Test.Pas kèm theo, chương trình này kiểm tra trạng thái bốn phímUp, Down, Left, Right và đưa kết quả ra màn hình, chương trình chấm dứt khinhấn Esc Tên các phím đã được định nghĩa sẵn trong unit Keyboard
Các bạn nên chú ý khi chặnngắt bàn phím các lệnh như ReadKey không thể thực thi, nếu sau khi chấm dứtchương trình không gỡ lệnh chặn ngắt bàn phím ra thì các chương trình khác cóthể không nhận được lệnh từ bàn phím
UNIT Keyboard;
INTERFACE
USES Dos;
CONST
Install : Boolean =False;
KeyA = $1E; (* Aa *)
KeyB = $30; (* Bb *)
KeyC = $2E; (* Cc *)
KeyD = $20; (* Dd *)
KeyE = $12; (* Ee *)
Trang 2KeyF = $21; (* Ff *) KeyG = $22; (* Gg *) KeyH = $23; (* Hh *) KeyI = $17; (* Ii *) KeyJ = $24; (* Jj *) KeyK = $25; (* Kk *) KeyL = $26; (* Ll *) KeyM = $32; (* Mm *) KeyN = $31; (* Nn *) KeyO = $18; (* Oo *) KeyP = $19; (* Pp *) KeyQ = $10; (* Qq *) KeyR = $13; (* Rr *) KeyS = $1F; (* Ss *) KeyT = $14; (* Tt *) KeyU = $16; (* Uu *) KeyV = $2F; (* Vv *) KeyW = $11; (* Ww *) KeyX = $2D; (* Xx *) KeyY = $15; (* Yy *) KeyZ = $2C; (* Zz *) Key1 = $02; (* 1! *) Key2 = $03; (* 2@ *)
Trang 3Key4 = $05; (* 4$ *)
Key5 = $06; (* 5% *)
Key6 = $07; (* 6^ *)
Key7 = $08; (* 7^ *)
Key8 = $09; (* 8* *)
Key9 = $0A; (* 9( *)
Key0 = $0B; (* 0) *)
KeyDash = $0C; (* -_*) KeyEqual = $0D; (* =+ *) KeyLBracket = $1A; (* [{ *) KeyRBracket = $1B; (* ]} *) KeySemicolon = $27; (* ;: *) KeyRQuote = $28; (* '' *) KeyLQuote = $29; (* `~ *) KeyPeriod = $33; (*.> *) KeyComma = $34; (* ,< *) KeySlash = $35; (* /? *) KeyBackSlash = $2B; (* | *) KeyF1 = $3B; (* F1 *) KeyF2 = $3C; (* F2 *) KeyF3 = $3D; (* F3 *) KeyF4 = $3E; (* F4 *)
Trang 4KeyF5 = $3F; (* F5 *)
KeyF6 = $40; (* F6 *)
KeyF7 = $41; (* F7 *)
KeyF8 = $42; (* F8 *)
KeyF9 = $43; (* F9 *)
KeyF10 = $44; (* F10 *)
KeyESC = $01; (* Esc *)
KeyBackSpace = $0E; (* BS *)
KeyTab = $0F; (* Tab *)
KeyEnter = $1C; (* Enter *)
KeyControl = $1D; (* Ctrl *)
KeyLShift = $2A; (* Left Shift *) KeyRShift = $36; (* Right Shift *) KeyPrintScreen = $37; (*PrintScreen *) KeyAlt = $38; (* Alt *)
KeySpace = $39; (* Space *)
KeyCapsLock = $3A; (* CapLock *) KeyNumLock = $45; (* NumLock *) KeyScrollLock = $46; (*ScrollLock *) KeyHome = $47; (* Home *)
KeyUp = $48; (* Up *)
KeyPgUp = $49; (* PgUp *)
KeyMinus = $4A; (* Minus *)
Trang 5KeyCenter = $4C; (* Center *)
KeyRight = $4D; (* Right *)
KeyPlus = $4E; (* Plus *)
KeyEnd = $4F; (* End *)
KeyDown = $50; (* Down *)
KeyPgDn = $51; (* PgDn *)
KeyIns = $52; (* Insert *)
KeyDel = $53; (* Delete *)
VAR
KeyPress,Key : Array[0 127] of Boolean; OldInt9h : Procedure;
PROCEDURE InstallKeyboard;
PROCEDURE UnInstallKeyboard; IMPLEMENTATION
{$F+}
PROCEDURE NewInt9h; Assembler; Asm
Push AX
Push BX
Push DS
Mov AX,Seg @Data
Mov DS,AX
Trang 6In AL,60h
Mov BX,AX
And BX,07Fh
And AL,80h
Jz @Press
Mov Byte Ptr KeyPress[BX],False Jmp @Done
@Press:
Mov Byte Ptr KeyPress[BX],True
@Done:
In AL,61h
Mov AH,AL
Or AL,80h
Out 61h,AL
XChg AH,AL
Out 61h,AL
Mov AL,20h
Out 20h,AL
Pop DS
Pop BX
Pop AX
Iret
End;
Trang 7PROCEDURE InstallKeyboard;
Var KeyCount : Byte;
Begin
If Install then Exit;
FillChar(KeyPress,SizeOf(KeyPress),False); GetIntVec(9,@OldInt9h);
SetIntVec(9,@NewInt9h);
Install:=True;
End;
PROCEDURE UnInstallKeyboard;
Begin
If Install=False then Exit;
SetIntVec(9,@OldInt9h);
Mem[$40:$1C]:=Mem[$40:$1A];
Install:=False;
End;
END
Test.Pas
USES Crt,Keyboard;
BEGIN
ClrScr;
InstallKeyboard;
Trang 8If KeyPress[KeyUp] then Begin
GotoXY(1,1);
Write('Key Up pressed '); End
Else
Begin
GotoXY(1,1);
Write('Key Up released'); End;
If KeyPress[KeyDown] then Begin
GotoXY(1,2);
Write('Key Down pressed '); End
Else
Begin
GotoXY(1,2);
Write('Key Down released'); End;
If KeyPress[KeyLeft] then Begin
Trang 9Write('Key Left pressed ');
End
Else
Begin
GotoXY(1,3);
Write('Key Left released');
End;
If KeyPress[KeyRight] then
Begin
GotoXY(1,4);
Write('Key Right pressed ');
End
Else
Begin
GotoXY(1,4);
Write('Key Right released');
End;
Until KeyPress[KeyEsc];
UninstallKeyboard;
END
Bạn nào có nhu cầu về các chương trình trên hãy liên hệ với tòa soạn
Trương Xuân Nam