
Bài th c hành s ự ố 6
L p trình ậbàn phím
M c ụđích
Hi u đ c cách th c ho t đ ng c a bàn phímể ượ ứ ạ ộ ủ
Bi t cách s d ng m t s hàm liên quan đ n bàn phím c a ng t 16h (BIOS ) và ng t 21hế ử ụ ộ ố ế ủ ắ ắ
(DOS)
Tóm t t lý thuy tắ ế
Nguyên t c ho t đ ng c a bàn phímắ ạ ộ ủ
Bàn phím cho máy PC có nhi uề lo i: 83 phím, 84 phím, 101 phím,… Bên trong m i bàn phímạ ỗ
là chip đi u khi n 8049 và 8042. Khi m t phím đ c nh n (up-to-down) hay đ c th (down-to-ề ể ộ ượ ấ ượ ả
up), chip đi u khi n ghi nh n phím đó b ng m t (ho c m t vài) mã s (g i là mã quét, scan code)ề ể ậ ằ ộ ặ ộ ố ọ
và g i mã này ra c ng 60h, đ ng th i t o tín hi u ng t IRQ1. ử ổ ồ ờ ạ ệ ắ
Ví dụ :
- Khi phím ch ‘a’ đ c nh n r i th ra, ta nh n đ c 2 mã quét t ng ng là: 1E và 9E.ữ ượ ấ ồ ả ậ ượ ươ ứ
Thông th ng, mã th (up-code) b ng mã nh n (down-code) c ng thêm 80h.ườ ả ằ ấ ộ
- T ng t , đ i v i Left-Control, 2 mã quét là 1D và 9Dươ ự ố ớ
- Tuy nhiên, v i Right-Control, ta nh n đ c 4 mã quét: 0E 1D (khi nh n) và 0E 9D (khiớ ậ ượ ấ
th ).ả
Tín hi u IRQ1 gây ra ng t 09h. ệ ắ Ng t 09h này có nhi m v chuy n đ i mã quét thành mãắ ệ ụ ể ổ
ASCII và l u tr vào b đ m bàn phím. Các ch ng trình có nhu c u nh n thông tin t bàn phímư ữ ộ ệ ươ ầ ậ ừ
có th s d ng các hàm c a ng t 21h ho c 16h đ đ c b đ m này mà không c n quan tâm đ nể ử ụ ủ ắ ặ ể ọ ộ ệ ầ ế
giá tr c a mã quét.ị ủ
Ví d :ụ m t ch ng trình nào đó ch c n dùng ng t 16h, hàm 01 đ ki m tra xem ng i sộ ươ ỉ ầ ắ ể ể ườ ử
d ngụ có gõ d u ch m câu (nh n phím ‘.’) hay không mà không quan tâm đ n đó là phím d uấ ấ ấ ế ấ
ch m ph n keypad (scan code = 53) hay là ph n các phím c b n (scan code = 34).ấ ở ầ ở ầ ơ ả
Khi đ c g i, trình ph c v ng t 09h s đ c c ng 60h đ l y mã quét. N u phím đ c nh nượ ọ ụ ụ ắ ẽ ọ ổ ể ấ ế ượ ấ
thu c lo i phím th ng (ví d nh các phím ch a, b,…) mã quét s đ c d ch ra mã ASCIIộ ạ ườ ụ ư ữ ẽ ượ ị
t ng ng. Sau đó, giá tr c a mã quét và mã ASCII đ c l u vào b đ m bàn phím. B đ m nàyươ ứ ị ủ ượ ư ộ ệ ộ ệ
có đ a ch 0040h:001Eh, kích th c 16 word, đ c t ch c nh m t m ng vòng v i con tr đ uị ỉ ướ ượ ổ ứ ư ộ ả ớ ỏ ầ
(head) l u t i đ a ch 0040h:001Ah, con tr cu i (tail) l u t i đ a ch 0040h:001Ch. N u phímư ạ ị ỉ ỏ ố ư ạ ị ỉ ế
đ c nh n là lo i phím m r ng (ví d nh F1, F2,…), trong b đ m s l u gi s 0 và mã mượ ấ ạ ở ộ ụ ư ộ ệ ẽ ư ữ ố ở
r ng c a phím đó.ộ ủ
Ví d :ụ Gi s NumLock đang là OFF, b đ m bàn phím đang tr ng (head = tail = 0041Eh), khiả ử ộ ệ ố
l n l t n các phím ‘ầ ượ ấ a’, F10, ‘·’, ‘NumLock’, ‘·’keypad, ‘NumLock’, ‘·’keypad, ‘Delete’ b đ m sộ ệ ẽ
có n i dung nh sau:ộ ư
↓ 0041Ch
a F10 · · (kp) · (kp) Delete
61
1E
00
44
2E
34
2E
53
00
53
E0
53
head ↑ tail ↑
L u ý r ngư ằ , vi c nh n phím NumLock không sinh ra m t thông tin nào trong b đ m. Haiệ ấ ộ ộ ệ
phím d u ch m cho cùng m t mã ASCII là 2Eh. Phím Delete cho cùng m t mã m r ng dù đ cấ ấ ộ ộ ở ộ ượ
nh n trong ch đ NumLock là ON hay OFF.ấ ế ộ

M t s hàm c a ng t 16h (BIOS)ộ ố ủ ắ
AH = 00h. L y m t phím t b đ m bàn phím. N u b đ m tr ng, s ch cho đ n khi m tấ ộ ừ ộ ệ ế ộ ệ ố ẽ ờ ế ộ
phím đ c nh n. Tr v mã quét trong AH, mã ASCII (ho c mã m r ng) trong AL.ượ ấ ả ề ặ ở ộ
AH = 01h. Ki m tra b đ m bàn phím. N u tr ng, b t c ZF. N u không tr ng, t t c ZF,ể ộ ệ ế ố ậ ờ ế ố ắ ờ
đ c phím đ u tiên trong b đ m (tr đ n b i con tr head), tr v mã quét trong AH, mã ASCIIọ ầ ộ ệ ỏ ế ở ỏ ả ề
(ho c mã m r ng) trong AL. Tuy nhiên, phím này không b l y ra kh i b đ m.ặ ở ộ ị ấ ỏ ộ ệ
AH = 02h. Ki m tra tình tr ng các phím đ c bi t. Hàm này tr v byte đ a ch 0040h:0017h.ể ạ ặ ệ ả ề ở ị ỉ
Các bit (I,C,N,S,A,O,L,R) c a byte này, tính t cao xu ng th p, ng v i các phím:ủ ừ ố ấ ứ ớ
Insert CapsLock NumLock ScrollLock Alt Control LeftShift RightShift.
Phím nào tr ng thái ON thì bit t ng ng s b t.ở ạ ươ ứ ẽ ậ
AH = 03h. Thay đ i t c đ nh n phím. AL = 05h, BH = th i gian đ i tr c khi l p, BL = t nổ ố ộ ậ ờ ợ ướ ặ ầ
s l p. BH có th nh n các giá tr t 0 (250ms) đ n 3 (1000 ms). BL có th nh n các giá tr t 0ố ặ ể ậ ị ừ ế ể ậ ị ừ
(30 l n/giây) đ n 1Fh (2 l n/giây). ầ ế ầ
AH = 05h. Gi l p thao tác nh n phím. CH = mã quét, CL = mã ASCII (ho c mã m r ng).ả ậ ấ ặ ở ộ
Hàm này ghi giá tr c a CH và CL vào b đ m bàn phím và tr v AL = 0, n u b đ m còn chị ủ ộ ệ ả ề ế ộ ệ ỗ
tr ng. Tr v AL = 1 n u không còn ch tr ng.ố ả ề ế ỗ ố
M t s hàm c a nộ ố ủ g t 21h (DOS)ắ
AH = 01h. Đ i m t phím đ c nh n và tr l i mã ASCII c a phím đó trong thanh ghi AL,ợ ộ ượ ấ ả ạ ủ
đ ng th i hi n th kí t lên màn hình. N u đây là phím không có mã ASCII mà ch có mã m r ngồ ờ ể ị ự ế ỉ ở ộ
thì AL tr v 0. Đ nh n đ c mã m r ng, c n ph i g i hàm này m t l n n a. N u Ctrl-Breakả ề ể ậ ượ ở ộ ầ ả ọ ộ ầ ữ ế
đ c nh n thì ng t 23h s đ c g i.ượ ấ ắ ẽ ượ ọ
AH = 08h. Hàm này ch khác hàm 01h ch không th hi n lên màn hình kí t ng v i phímỉ ở ỗ ể ệ ự ứ ớ
đ c nh n.ượ ấ
AH = 07h. Hàm này khác hàm 08h ch không ki m tra Ctrl-Break.ở ỗ ể
AH = 0Ah. Nh p t bàn phím m t xâu kí t có đ dài không quá N kí t , k t thúc b i mã 13hậ ừ ộ ự ộ ự ế ở
(phím Enter). Vùng b nh đ l u tr xâu kí t ph i đ c chu n b tr c đ a ch DS:DX. Byteộ ớ ể ư ữ ự ả ượ ẩ ị ướ ở ị ỉ
đ u tiên đ a ch này ph i l u giá tr N. Khi tr v , byte th hai l u đ dài xâu nh n đ cầ ở ị ỉ ả ư ị ả ề ứ ư ộ ậ ượ
(không k kí t k t thúc 13h, m c dù kí t này v n đ c l u vào vùng nh ).ể ự ế ặ ự ẫ ượ ư ớ
AH = 0Ch. Xóa s ch b đ m bàn phím và g i m t trong các hàm 01h, 07h, 08h, 0Ah. Trongạ ộ ệ ọ ộ
AL l u s hi u c a hàm c n g i.ư ố ệ ủ ầ ọ
Tài li u tham kh oệ ả
1. Nguy n Minh Tu n, Giáo trình h p ng - Ch ng 10, ĐHKHTN, 2002ễ ấ ợ ữ ươ
2. Randal Hyde, The art of assembly language programming – Chapter 20.
3. Dan Rollins, TechHelp v.6.0
Bài t pậ
Bài 1. KeyDetection. S d ng các hàm liên quan đ n bàn phím c a ng t 16h. Vi t ch ng trìnhử ụ ế ủ ắ ế ươ
ki m tra xem có phím ch cái nào đ c nh n không, n u có thì dùng ch đó đ in đ y màn hình.ể ữ ượ ấ ế ữ ể ầ
N u không thì ti p t c in đ y màn hình b ng ch cái đ c nh n l n tr c. Nh n Esc đ k tế ế ụ ầ ằ ữ ượ ấ ở ầ ướ ấ ể ế
thúc.
Bài 2. Phím gõ t t.ắ S d ng các hàm liên quan đ n bàn phím c a ng t 21h, vi t ch ng trình choử ụ ế ủ ắ ế ươ
phép nh p t bàn phím m t xâu kí t đ dài không quá 79. Trong quá trình nh p, n u ng i dùngậ ừ ộ ự ộ ậ ế ườ
nh n phím F1, ch ng trình s t đ ng chèn vào c m t “DH KHTN Tp.HCM”, n u nh n phímấ ươ ẽ ự ộ ụ ừ ế ấ
F2 ch ng trình s t đ ng chèn vào c m t “Khoa CNTT – BM MMT&VT”. Cho phép dùngươ ẽ ự ộ ụ ừ
BackSpace đ s a l i. Khi nh p xong, in ra đ dài c a xâu kí t đó.ể ử ỗ ậ ộ ủ ự
M r ngở ộ
1. Trong bài t p 1, khi ng i dùng nh n m t ch cái nào đó, thì ch cái đó có l p t c xu tậ ườ ấ ộ ữ ữ ậ ứ ấ
hi n trên màn hình không ?ệ Có th gi i thích nh th nào v kho ng th i gian tr này ?ể ả ư ế ề ả ờ ễ

2. Trong bài t p ậ2, làm sao đ cho phép ngay sau khi nh n F1 đ thêm c m t , có th nh nể ấ ể ụ ừ ể ấ
Esc đ b đi c m t v a thêm.ể ỏ ụ ừ ừ
3. Đ v t qua gi i h n ể ượ ớ ạ 79 kí t trong bài t p 2, c n bi t thêm kĩ thu t gì ?ự ậ ầ ế ậ
4. Vi t m t ch ng trình cho phép xem n i dung c a b đ m bàn phím. Dùng ch ng trìnhế ộ ươ ộ ủ ộ ệ ươ
đó đ quan sát s thay đ i c a b đ m khi b m phím.ể ự ổ ủ ộ ệ ấ
H ng d nướ ẫ
Bài 1. Dùng hàm 01 c a ng t 16h đ ki m tra b đ m. Tuy nhiên ph i nh r ng hàm này khôngủ ắ ể ể ộ ệ ả ớ ằ
l y phím đ c nh n ra kh i b đ m bàn phím. Vì v y, sau khi phát hi n có phím đ c nh n, cóấ ượ ấ ỏ ộ ệ ậ ệ ượ ấ
th g i hàm 00 đ l y phím ra kh i b đ m.ể ọ ể ấ ỏ ộ ệ
Ví d :ụ
NextKey:
;
; trong khi ch a có phím nào đ c nh n, ư ượ ấ
; ta x lí nh ng vi c khác đâyử ữ ệ ở
;
mov ah,1 ; ki m tra b đ mể ộ ệ
int 16h
jz NextKey ; v n không có gì, quay l iẫ ạ
mov ah,0
int 16h ; l y ra kh i b đ mấ ỏ ộ ệ
;
; x lí phím v a nh n đâyử ừ ậ ở
jmp NextKey
Bài 2. T o m t m ng 80 kí t . Dùng hàm 8 c a ng t 21h đ ki m tra phím nào đ c nh n. N uạ ộ ả ự ủ ắ ể ể ượ ấ ế
là phím có ASCII code khác 0, l u vào m ng đ ng th i in ra màn hình. N u là phím đ c bi t, g iư ả ồ ờ ế ặ ệ ọ
hàm 8 l n n a đ l y mã m r ng. Sau đó ki m tra F1 hay F2 đ c nh n đ chèn c m t c nầ ữ ể ấ ở ộ ể ượ ấ ể ụ ừ ầ
thi t vào m ng.ế ả
Ví d :ụ Đ x lí nh p xâu và chèn macro, tham kh o đo n ch ng trình sauể ử ậ ả ạ ươ
mac1 db 'DH KHTN Tp.HCM$'
mac2 db 'Khoa CNTT - BM MMT&VT$'
...................
NextKey:
mov ah,8 ; ch nh n phím, không hi n thờ ấ ể ị
int 21h
cmp al,0
jnz NotSpec ; n u là phím th ngế ườ
int 21h
cmp al,3bh
jz InsMac1
cmp al,3ch
jz InsMac2
jmp NextKey
InsMac1:
mov bx,offset mac1
jmp InsMac
InsMac2:

mov bx,offset mac2
jmp InsMac
; thêm các macro khác đâyở
; ........
InsMac:
call Insert ; chèn macro DS:BX vào m ngở ả
jmp NextKey
NotSpec:
;
; l u kí t vào m ngưựả
;
Đ cho phép s a ch a b ng Esc, có th ki m tra mã ASCII, n u là 8, vi t ra 3 kí t có mã ASCIIể ử ữ ằ ể ể ế ế ự
l n l t là 8,32,8. (3 kí t này có nghĩa là: lùi con tr , vi t kho ng tr ng đ xóa, lùi con tr l nầ ượ ự ỏ ế ả ắ ể ỏ ầ
n a). Đ ng th i ph i gi m giá tr c a bi n l u tr đ dài xâu hi n th i.ữ ồ ờ ả ả ị ủ ế ư ữ ộ ệ ờ
Ví d :ụ Đ b sung tính năng dùng BckSpc, tham kh o đo n ch ng trình sau:ể ổ ả ạ ươ
BckSpc db 8,32,8,'$'
...............
cmp al,8
jnz InsChar ; n u không ph i BckSpc, l uế ả ư
cmp si,0 ; ki m tra đ dài xâu hi n th iể ộ ệ ờ
jz NextKey
mov dx,offset BckSpc ; xóa kí t trên màn hìnhự
printSt
dec si ; xóa trong m ngả
jmp NextKey
InsChar:
cmp si,maxLen ; dài quá 79 ?
jz NextKey
mov buffer[si],al ; l u vào m ngư ả
inc si
jmp NextKey
Ví d :ụ Đ in ra đ dài xâu v a nh p (<80, là s nguyên có hai ch s ), có th vi t nh sau:ể ộ ừ ậ ố ữ ố ể ế ư
printUInt macro
push ax
push bx
push dx
mov bh,10
div bh
mov bx,ax
mov dl,bl
add dl,48
mov ah,2
int 21h
mov dl,bh
add dl,48
mov ah,2
int 21h
pop dx
pop bx
pop ax

endm
Không quên ki m tra đ dài xâu hi n th i tr c m i thao tác thêm, b t kí t trong m ng !ể ộ ệ ờ ướ ỗ ớ ự ả

