Tải bản đầy đủ (.pdf) (11 trang)

KEYBOARD

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (94.06 KB, 11 trang )

46
CHƯƠNG 8 : KEYBOARD
Bàn phím của máy IBM PC là một thiết bò bao gồm :
Các phím : mỗi phím xác đònh bởi một số thứ tự gọi là scan code (scan code là một giá trò 8 bit)
Có 3 loại bàn phím chính :
- bàn phím 83 phím của IBM PC
- bàn phím 84 phím của IBM PC/AT
- bàn phím 101 phím của IBM PC/AT
Các đèn hiệu báo trạng thái cho các phím đặc biệt
Bộ vi xử lý riêng với nhiệm vụ tiếp nhận thông tin từ các phím và chuyển các thông tin này đến
computer.
8.1NGUYÊN LÝ HOẠT ĐỘNG CỦA BÀN PHÍM
8.1.1Scan code
Khi một phím được nhấn xuống, bàn phím thông báo và chuyển scan code của phím ấy cho
computer
Nếu phím đã được nhấn xuống và giữ im (không buông tay) sau một thời gian (initial delay), bàn
phím sẽ tiếp tục chuyển scan code của phím ấy cho computer theo một tốc độ xác đònh (repeat rate) .
Ta gọi scan code trong trường hợp này là Pressed-key
Khi phím được ngưng nhấn (buông tay), bàn phím chuyển scan code của phím ấy cho computer sau
khi cộng thêm 128 (dựng bit số 7)
Ta gọi scan code trong trường hợp này là Released-key
Bảng B.8.1 : Scan code của các phím trên bàn phím 83/84
Hex Key Hex Key Hex Key Hex Key Hex Key
01 Esc 12 E 23 H 34 . > 45 NumLock
02 1 ! 13 R 24 J 35 / ? 46 ScrollLock
03 2 Ỵ 14 T 25 K 36 Shft(Rt) 47 Home [7]
04 3 # 15 Y 26 L 37 * PrtSc 48 Up [8]
05 4 $ 16 U 27 ; : 38 Alt 49 PgUp [9]
06 5 % 17 I 28 “ ‘ 39 Spacebar 4A K -
07 6 Á 18 O 29 Ạ À 3A CapsLock 4B Left [4]
08 7 & 19 P 2A Shft(L) 3B F1 4C [5]


09 8 * 1A [ A 2B \ 3C F2 4D Right[6]
0A 9 ( 1B ] Ã 2C Z 3D F3 4E K +
0B 0 1C Enter 2D X 3E F4 4F End [1]
0C - - 1D Ctrl 2E C 3F F5 50 Down [2]
0D + = 1E A 2F V 40 F6 51 PgDn [3]
0E bksp 1F 30 B 41 F7 52 Ins [0]
0F Tap 20 T,T 31 N 42 F8 53 Del [.]
10 Q 21 F 32 M 43 F9 54 SysReq
11 W 22 33 33 , < 44 F10


Đối với bàn phím 101 phím, scan code tương ứng với các phím mở rộng (Ctrl,Alt,Enter thứ hai, các
phím Ins,Delete,Home,End,PgUp,PgDn và các phím mũi tên thứ hai ) luôn được tạo thành một cặp giá trò
47
với byte đầu bằng 0E0h và byte kế tiếp là scan code tương tự với scan code của bàn phím 83/84 . Tổ hợp
các phím mở rộng sẽ tạo thành một chuỗi các scan code với ý nghóa tương tự trên bàn phím 83/84
Bảng B.8.2 : Scan code của các phím mở rộng trên bàn phím 101/102
---------------------------------------------Ú----------------------------
Key Hex Sequence Key Hex Sequence|
F11.............................................57 Home .....................e0 47 |
F12 ............................................58 Shft-Home..............e0 aa e0 47 |
Right-Alt ...................................e0 38 End.........................e0 4f |
Right-Ctrl...................................e0 1d Shft-End.................e0 aa e0 4f |
PrintScreen................................e0 2a e0 37 Up...........................e0 48 |
Shft-PrintScreen (SysReq)........e0 37 Shft-Up...................e0 aa e0 48 |
Ctrl-PrintScreen (SysReq)........e0 37 Down......................e0 50 |
Alt-PrintScreen.........................54 Shft-Down..............e0 aa e0 50 |
Pause.........................................e1 1d 45 e1 9d c5 PageUp...................e0 49 |
Ctrl-Pause (Break).................... e0 46 e0 c6 Shft-PageUp...........e0 aa e0 49 |
Insert..........................................e0 53 PageDown..............e0 51 |

Shft-Insert..................................e0 aa e0 52 Shft-PageDown .....e0 aa e0 51 |
Delete........................................e0 53 Right.......................e0 4d |
Shft-Delete................................e0 aa e0 53 Shft-Right...............e0 aa e0 4d |
Left............................................e0 4b K Enter...................e0 1c |
Shft-Left....................................e0 aa e0 4b K / ..........................e0 35 |
Shft- K / ....................................e0 aa e0 35

Chú ý : các tên phím trong bảng B.8.1 và B.8.2 có ký hiệu K đi trước là các phím thuộc phần Key
Pad của bàn phím (bảng số bên tay phải)
8.1.2 I/O control
Liên lạc giữa bàn phím và computer được thực hiện thông qua keyboard controller .
Giao tiếp với bàn phím có thể được chia thành hai loại chính :
a.Tiếp nhận scan code
Khi nhận được thông tin từ bàn phím,keyboard controller sẽ phát động interrupt 09h. Scan code gởi
đến được đặt tại port 060h. Đoạn chương trình của interrupt 09h có nhiệm vụ đọc giá trò ấy từ port 060h
vàdiễn giải thành các thông tin hữu dụng .
b.Thiết lập các thông số cho bàn phím.
Có thể thiết lập các trạng thái làm việc khác nhau của bàn phím bằng cách gởi một control code ra
port 060h và kế tiếp là các thông số tương ứng. Các control code hợp lệ là :
v 0FFh : Reset the keyboard and start internal diagnostics.
v 0FEh : Resend the last transmission.
v 0FDh-0F7h : No operator (NOP).
v 0F6h : Set keyboard to defaults and continue scanning.
v 0F5h : Set keyboard to defaults and disable keyboard scanning.
v 0F4h : Enable the keyboard. KBD sends ‘ACK’, clears buffer, and starts scanning.
v 0F3h : Set typematic rate and delay. First send 0F3h, then send data byte:

7 6 5 4 3 2 1 0
0 delay Rept rate
bits 0-4 set the repeat rate

48
bits 5-6 set initial delay before first repeat:
00=250ms;01=500ms; 10=750ms; 11=1000ms
bit 7 is always 0
Repeat rate setting (bits 0-4)
Value Character/sec Value Character/sec
0 30.0 0Ah 10.0
1 26.7 0Dh 9.2
2 24.0 10h 7.5
4 20.0 14h 5.0
8 15.0 1Fh 2.0
v 0F2h-0EFh : No operator (NOP).
v 0EEh : Echo. Diagnostics aid. Simply sends 0EEh right back.
v 0EDh Turn LED ‘lock key’ lights on or off. First send 0EDh, then send data byte:

7 6 5 4 3 2 1 0
Not used c n s
ScrollLock LED 0=OFF, 1=ON
NumLock LED 0=OFF, 1=ON
CapsLock LED 0=OFF, 1=ON

Lưu ý : sau khi gởi control code ra port 060h,phải có một khoảng thời gian trễ (nên lớn hơn 10ms)
trước khi gởi tiếp data byte.
Thí dụ :
mov al,Ctrl-code
out 060h,al
xor cx,cx ;
Delay:
loop Delay
mov al,Data-byte

out 060h,al
8.2INTERRUPT 09H
8.2.1Shift và Toggle key
Interrupt 09h quy dònh hai loại phím đặc biệt :
1. Shift key : bao gồm Ctrl, Shift và Alt . Trạng thái của các phím này quyết đònh giá trò của các
phím khác . Thí dụ : khi nhấn phím C ta nhận được ký tự ‘c’, nếu nhấn Shift-C ta nhận được ký
tự ‘C’ . Một phím shift khi được nhấn xuống sẽ bắt đầu ảnh hưởng đến các phím gõ sau đó cho
đến khi phím shift được buông ra .
2. Toggle key : gồm Caps Lock và Num Lock . Đây là các công tắc hai chiều . Khi Caps Lock được
bật lên, trạng thái shift của các phím ký tự sẽ đảo ngược . Khi Num Lock được bật lên, các phím
mũi tên trên bảng số bên phải sẽ mất tác dụng.
Tình trạng của các phím shift và toggle được interrupt 09h ghi nhớ tại đòa chỉ 040:017. Mỗi lần nhận
được một scan code, interrupt 09h đối chiếu với tình trạng hiện thời của các phím shift và toggle để suy ra
mã ASCII đích thực của phím được gõ vào .ý nghóa các bit của byte tại đòa chỉ 040:017 ( hay 0000:0417 )
7 6 5 4 3 2 1 0
X Insert state : 1 = ON ; 0 = OFF
49
X Caps Lock : 1 = ON ; 0 = OFF
X Num Lock : 1 = ON ; 0 = OFF
X Scroll Lock : 1 = ON ; 0 = OFF
X 1 = Alt pressed
X 1 = Crtl pressed
X 1 = Left shift pressed
X 1 = Right shift pressed
8.2.2Thủ tục cập nhật keyboard status byte (040:017)
; Thủ tục sau được thực hiện ngay sau khi interrupt 09h được gọi
Update-KBD-Flag proc near

push ds
mov ax,040h

mov ds,ax

in al,060h ; Port 060h : keyboard data
mov ah,al
and al,07Fh ; Xóa bit 7

push cs
pop es ; ES = CS
lea di,KBD-Table-1 ;
mov cx,8
cld
repne scansb ; Dò KBD-Table-1
jne UKF-end ; Không phải là shift key hay toggle key
mov al,1 ; CX = bit-no của Keyboard status byte
shl al,cl

cmp cx,3 ; Nếu bit-no > 3 --> Toggle key
jbe UKF-Shift ; --> Không xét released-key
UKF-Toggle:
test ah,080h ;
jnz UKF-end ; Released-key

xor byte ptr ds:[017h],al ; switch bit
jmp UKF-end
UKF-Shift:
test ah,080h ;
jnz UKF-Shift-Clear ; Released-key
UKF-Shift-Set:
or byte ptr ds:[017h],al ; set bit
jmp UKF-end

UKF-Shift-Clear:
not al
and byte ptr ds:[017h],al ; clear bit
50
UKF-end:
pop ds
ret
Update-KBD-Flag endp

KBD-Table-1 db 052h ; Insert scan-code ; 7
db 03Ah ; Caps Lock scan-code ; 6
db 045h ; Num Lock scan-code ; 5
db 046h ; Scroll Lock scan-code ; 4
db 038h ; Alt scan-code ; 3
db 01Dh ; Ctrl scan-code ; 2
db 02Ah ; Left shift scan-code ; 1
db 036h ; Right shift scan-code ; 0
db 0
8.2.3Keyboard buffer
Scan code của các phím khác với hai loại phím trên (Shift key và Togglekey),ngoại trừ Insert,được
chuyển thành hai byte theo hai trường hợp :
Trường hợp phím được gõ vào là một phím bình thường, byte thấp chứa mã ASCII của phím được
gõ,byte cao chứa scan code.
Trường hợp phím gõ vào là một phím đặc biệt như các phím F1 đến F10 các phím mũi tên (cursor
key), các phím Home,End,PgUp,PgDn,Delete, Insert thì byte thấp sẽ bằng 0, byte cao chứa scan code.
Cặp giá trò trên được interrupt 09h đặt vào một “hàng đợi” tại đòa chỉ040:01Eh.Hàng đợi này là một
buffer có kích thước 020h byte được đánh dấu bằng hai vò trí : đầu (KBD-head) và cuối (KBD-tail) . Các
giá trò này đặt tại :
040:01Ah : offset của điểm đầu ( 1 word ), Segment=040h
040:01Ch : offset của điểm cuối ( 1 word ), Segment=040h

Khởi đầu, khi keyboard buffer còn trống, điểm đầu được cho trùng với điểm cuối . Khi một phím
được gõ, scan code và ascii code được đặt vào vò trí điểm cuối đang chỉ đến, sau đó điểm cuối được tăng
thêm 2 . Nếu điểm cuối đang chỉ đến vò trí cuối cùng của buffer (về mặt vật lý), nó sẽ được đặt lại cho
trùng với vò trí đầu tiên của buffer (về mặt vật lý)
Nếu như vò trí kế tiếp của điểm cuối bằng với vò trí hiện tại của điểm đầu : keyboard buffer đã đầy,
các phím được gõ kế tiếp sẽ không được đặt vào keyboard buffer .
Khi có yêu cầu đọc bàn phím, cặp giá trò đang được điểm đầu chỉ đến sẽ được lấy ra (xem như là
mới do bàn phím gởi đến), sau đó điểm đầu được tăng thêm 2 . Nếu điểm đầu chỉ đến vò trí cuối cùng của
buffer (về mặt vật lý), nó sẽ được đặt lại cho trùng với vò trí đầu tiên của buffer (về mặt vật lý) . Lẽ dó
nhiên nếu điểm đầu đang trùng với điểm cuối,sẽ không có phím nào được đọc.
Tóm lại bàn phím được khai thác theo nguyên lý : giá trò của các phím được gởi đến từ bàn phím
được interrupt 09h ghi nhớ và sắp xếp theo thứ tự trước sau trong một buffer riêng,khi các chương trình
ứng dụng “đọc bàn phím”, giá trò cũ nhất trong buffer sẽ được chuyển giao.

Minh họa về cách quản lý keyboard buffer :
a.Khởi đầu KBD-head và KBD-tail đang trùng nhau : Keyboard buffer đang trống
KBD-head

KBD-tail
b.Phím ‘T’ được gõ :

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×