.c Phương pháp lập trình bàn phím và một số chương trình mẫu

Một phần của tài liệu Ghép Nối Cấu Trúc Máy Tính ppt (Trang 35 - 40)

.II Một số kỹ thuật lập trình ghép nối cơ bản .1 Lập trình phối ghép với bàn phím

.c Phương pháp lập trình bàn phím và một số chương trình mẫu

− Lập trình hệ thống, truy nhập lập trình qua các bộ vi điều khiển 8042, 8044 qua các cổng 60H, 61H và 64H.

− Lập trình ứng dụng, dùng các hàm BIOS (int 9h, Int 16H) hoặc các hàm 0Ah, 0Bh, 0Ch của int 21h.

Cổng 60H là cổng A của 8255A và là nơi để CPU và bàn phím trao đổi thông tin bao gồm các lệnh (thường là của chương trình con ngắt) điều khiển bàn phím hoặc ký tự từ bàn phím vào. Đối với người lập trình thì cổng 60H được coi như thanh ghi mã lệnh của bàn phím.

Mã lệnh EDH là mã lệnh tắt, bật đèn. Ví dụ 1:

Viết chương trình tự động bật phím CapLock (sau khi chạy chương trình này phím Caplock sẽ được bật lên). Ta hãy xem cấu trúc của cờ bàn phím (chi tiết xem phần 3.4.1): 7 6 5 4 3 2 1 0 1: chế độ Insert 1: chế độ Cap Lock 1: Num Lock bị ấn 1: Scroll Lock bị ấn 1: Alt bị ấn 1: Ctrl bị ấn 1: Shift trái bị ấn 1: Shift phải bị ấn

Cờ bàn phím là byte ở tại địa chỉ 40:0017 trong vùng đệm bàn phím. Để đèn của phím CapLock là ON thì giá trị của cờ bàn phím được đặt bằng: 01000000 = 40h. ta chỉ cần gán giá trị 40h vào byte có địa chỉ 40:0017.

--- Code--- .MODEL Tiny

Mov AX,40h ; AX chứa địa chỉ đoạn dữ liệu DTA Mov DS, AX ; cho DS trỏ tới vùng DTA

Mov BX,0017h ; DS:BX chứa địa chỉ của byte chứa cờ ; trạng thái bàn phím Mov byte PTR[BX] ,40h ; đặt cờ bàn phím bằng 40h

Int 20h ; trở về DOS End Start

---

Ví dụ 2:

Viết chương trình tự động bật phím CapLock , NumLock, ScollLock (sau khi chạy chương trình này phím Caplock, NumLock, ScollLock sẽ được bật lên). Yêu cầu chương trình thực hiện qua các cổng 60H, 61H và 64H. Chương trình sẽ kiểm tra trạng thái nhấn phím hay chưa.

Cấu trúc của byte điều khiển các đèn LED trên bàn phím như sau:

7 6 5 4 3 2 1 0

Cap lock Num lock Scroll lock

Để các đèn Caplock, NumLock, ScollLock sẽ được bật lên thì ta phải gửi giá trị 00000111 =07h ra cổng 60H. --- Code --- .MODEL Tiny .CODE Org 100h Jmp Start Start: Mov AL,EDHh ; lệnh tắt/bật đèn Out 60H, AL ; đưa ra cổng bàn phím Kiemtra:

In AL,64h; Kiểm tra trạng thái bàn phím Test AL,02h; Nếu bộ đệm bàn phím bằng đầy jnz Kiemtra ; kiểm tra lại

Mov Al,07 ; Nếu bộ đệm trống sẽ bật đèn

Out 60H, AL ; đưa ra mã bật đèn ra cổng bàn phím Int 20h ; trở về DOS End Start

---

Viết chương trình cấm bàn phím hoạt động. Biết rằng lệnh khóa ADH là lệnh cấm bàn phím. Kiểm tra trạng thái bàn phím trước khi cấm.

--- Code --- .MODEL Tiny .CODE Org 100h Jmp Start Start: Kiemtra: In AL,64H ; đọc trạng thái

Test AL,02h ; Nếu bộ đệm bàn phím bằng đầy Jnz Kiemtra ; kiểm tra lại

Mov Al,ADh ; Nếu bộ đệm trống sẽ bật đèn Out 64H, AL ; đưa ra cấm bàn phím ra cổng 64h Int 20h ; trở về DOS

End Start

---

Ví dụ 4:

Viết chương trình xử lý bàn phím đơn giản. Chương trình kiểm tra các phím chữ cái và phân biệt chữ hoa, chữ thường

.MODEL small .STACK 100h .DATA

Table db 16 dup(0) (adsbygoogle = window.adsbygoogle || []).push({});

db ‘qwertyuiop’,0,0,0,0 ; hang tren db ‘asdfghjkl’,0,0,0,0 ; hang giua db ‘zxcvbnm’; hang duoi

db 16 dup(0) ; vung danh cho chu hoa

db ‘QERTYUIOP’,0,0,0,0 ; chu hoa cho hang tren db ‘ASDFGHJKL’,0,0,0,0,0 ; chu hoa cho hang giua db ‘ZXCVBNM’; chu hoa cho hang duoi

Cli; xoa ngat Push DS ;

Mov AX, seg TryKB ; DS:AX tro den Checkbanphim Mov DS,AX

Mov DX, offset TryKB ; Checkbanphim Mov Al,9

Mov Ah,25H ; dat lai dia chi vector ngat Int 21h

Pop DS

Sti ; cho phep ngat

;--- Chuong trinh xu ly ngat ban phim--- TryKB proc far

Push AX Push BX Push CX Push DI Push ES

; nhan ma Scan va tra loi ban phim In Al,60h ; nhan ma Scan Mov AH,AL ; chuyen vao AH

Push AX ; dua vao stack

In AL,61h ; doc cong PB cua 8255A Or AL,10000000b ; dua bit 7 len bit 1 Out 61h,AL ; dua ra cong PB

; Cho ES tro den doan du lieu

Mov AX,40H ; dua AX den cuoi bo nho Mov ES,AX

Pop AX; AL= ma scan ; kiem tra phim shift

Cmp Al,42 ; co nhan phim shift ko? Jnz checkkey ; neu khong thi kiem tra tiep Mov BL,1

Or ES:[17h],BL đat bit 1 của byte trang thai =1 Jmp Thoat ; thoat khoi

PhimKetiep:

Test AL,10000000b; ma nha phim Jnz Thoat

Mov BL,ES:[17h] ; neu ko doc dc trang thai phim shift Test BL,00000011b; nhan phim shift?

Jz DoiMa ; neu ko doi lai ma

Add AL,100 ;doi ra ki tu hoa(dia chi 100 byte ke tiep) DoiMa:

Mov BX, offset table ;

Xlat table ; doi ma scan sang ma ASCII Cmp Al,0 ; tra ve 0? Jz Thoat

; Kiem tra do dem ban phim da day cua?

Mov BX, 1AH ; nap con tro bo dem ban phim Mov CX,ES:[BX] Mov DI,ES:[BX]+2 Cmp CX,60 Jz Tieptuc Add, CX,2 Cmp CX,DI Jz Thoat

; Bo dem chua day, nap the ki tu vao Tieptuc:

Mov ES:[DI],AL Cmp DI,60H Jnz Naptiep (adsbygoogle = window.adsbygoogle || []).push({});

Mov DI,28 ; dua dia chi hien tai ve 28+2=30 Naptiep: Add DI,2 Mov ES:[BX],DI ; ket thuc Thoat: Pop ES Pop DI Pop CX Pop BX Pop AX

;--- End Start

.2 Lập trình phối ghép với màn hình

Một phần của tài liệu Ghép Nối Cấu Trúc Máy Tính ppt (Trang 35 - 40)