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ímlà chip điều khiển 8049 và 8042. Khi một phím được nhấn (up-to-down) hay được thả (down-toup),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.
Nội dung trích xuất từ tài liệu:
Bài thực hành số 6: Lập trình bàn phím Bài thực hành số 6 Lập trình bàn phímMụ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ímlà 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ímcó 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 đếngiá 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ấuchấ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ấnthuộ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ã ASCIItươ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àycó đị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), khilầ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 00 2E 2E 00 E0 1E 44 34 53 53 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. Haiphí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ù đượcnhấ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ộtphí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ầnsố 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 ngắ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ộngthì 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 ...