Bài th c hành s 6
L p trình n pm
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)
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 nhi u lo i: 83 phím, 84 phím, 101 phím,… Bên trong m i bàn phím
chip đi u khi n 8049 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 nhi m v chuy n đ i quét thành
ASCII l u tr vào b đ m bàn phím. Các ch ng trình nhu c u nh n thông tin t bàn phímư ươ
th s d ng các hàm c a ng t 21h ho c 16h đ đ c b đ m này không c n quan tâm đ n ế
giá tr c a mã quét.
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 d u ch m câu (nh n phím ‘.’) hay không không quan tâm đ n đó 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,…) quét s đ c d ch ra 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ươ ượ ư
đ 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 lo i phím m r ng (ví d nh F1, F2,…), trong b đ m s l u gi s 0 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 ASCII 2Eh. Phím Delete cho cùng m t m r ng đ 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 quét trong AH, 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 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 th nh n các giá tr t 0 (250ms) đ n 3 (1000 ms). BL 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 = quét, CL = ASCII (ho c m r ng).
Hàm này ghi giá tr c a CH CL vào b đ m bàn phím 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 tr l i ASCII c a phím đó trong thanh ghi AL, ượ
đ ng th i hi n th 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 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 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âut đ 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 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 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 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 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 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 ! ướ