You are on page 1of 130

Bách Khoa Online

Giao lưu - Học hỏi - Chia sẻ kinh nghiệm


của các thế hệ sinh viên Bách Khoa
hutonline.net
Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

Chương 1
KIẾN TRÚC VÀ HOẠT ĐỘNG CỦA HỆ VI XỬ LÝ /
MÁY TÍNH

1. Cấu trúc luận lý


Máy tính số (Digital computer) là máy giải quyết các vấn đề bằng cách thực hiện
các chỉ thị do con người cung cấp. Chuỗi các chỉ thị này gọi là chương trình (program).
Các mạch điện tử trong một máy tính số sẽ thực hiện một số giới hạn các chỉ thị đơn giản
cho trước. Tập hợp các chỉ thị này gọi là tập lệnh của máy tính. Tất cả các chương trình
muốn thực thi đều phải được biến đổi sang tập lệnh trước khi được thi hành. Các lệnh cơ
bản là:
- Cộng 2 số.
- So sánh với 0.
- Di chuyển dữ liệu.
Tập lệnh của máy tính tạo thành một ngôn ngữ giúp con người có thể tác động lên
máy tính, ngôn ngữ này gọi là ngôn ngữ máy (machine language). Tuy nhiên, hầu hết các
ngôn ngữ máy đều đơn giản nên để thực hiện một yêu cầu nào đó, người thiết kế phải
thực hiện một công việc phức tạp. Đó là chuyển các yêu cầu này thành các chỉ thị có chứa
trong tập lệnh của máy. Vấn đề này có thể giải quyết bằng cách thiết kế một tập lệnh mới
thích hợp cho con người hơn tập lệnh đã cài đặt sẵn trong máy (built-in). Ngôn ngữ máy
sẽ được gọi là ngôn ngữ cấp 1 (L1) và ngôn ngữ vừa được hình thành gọi là ngôn ngữ cấp
2 (L2).
Tuy nhiên, trong thực tế, để có thể thực hiện được, các ngôn ngữ L1 và L2 không
được khác nhau nhiều. Như vậy, ngôn ngữ L2 cũng không thật sự giúp ích nhiều cho
người thiết kế. Do đó, một tập lệnh kế tiếp được hình thành sẽ hướng về con người nhiều
hơn là máy tính, tập lệnh này sẽ tạo thành một ngôn ngữ và ta gọi là ngôn ngữ L3. Ta có
thể viết các chương trình trong L3 như là đã tồn tại máy tính sử dụng ngôn ngữ L3 (máy
ảo L3). Các chương trình này sẽ được dịch sang ngôn ngữ L2 và được thực thi bằng một
chương trình dịch L2.
Việc xây dựng toàn bộ chuỗi các ngôn ngữ, mỗi ngôn ngữ được tạo ra sẽ thích hợp
hơn ngôn ngữ trước đó sẽ có thể tiếp tục cho đến khi nhận được ngôn ngữ thích hợp nhất.
Sơ đồ một máy ảo n cấp có thể biểu diễn như sau:

Phạm Hùng Kim Khánh Trang 1


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

Cấp n Máy ảo Mn dùng ngôn Chương trình trong Ln được dịch thành
ngữ máy Ln ngôn ngữ của máy cấp thấp hơn

Cấp 3 Máy ảo M3 dùng ngôn Chương trình trong L3 được dịch thành
ngữ máy L3 ngôn ngữ L2 hay L1

Cấp 2 Máy ảo M2 dùng ngôn Chương trình trong L2 được dịch thành
ngữ máy L2 ngôn ngữ máy L1

Cấp 1 Máy tính số M1 dùng Chương trình trong L1 được thực thi trực
ngôn ngữ máy L1 tiếp bằng các mạch điện tử

Hình 1.1. Máy ảo n cấp

Một máy tính số có n cấp có thể xem như có n-1 máy ảo khác nhau, mỗi máy ảo có
một ngôn ngữ máy riêng. Các chương trình viết trên các máy ảo này không thể thực thi
trực tiếp mà phải dịch thành các ngôn ngữ máy cấp thấp hơn. Chỉ có máy thật dùng ngôn
ngữ máy L1 mới có thể thực thi trực tiếp bằng các mạch điện tử. Một lập trình viên sử
dụng máy ảo cấp n không cần biết tất cả các trình dịch này. Chương trình trong máy ảo
cấp n sẽ được thực thi bằng cách dịch thành ngôn ngữ máy cấp thấp hơn và ngôn ngữ máy
này sẽ được dịch thành ngôn ngữ máy thấp hơn nữa hay dịch trực tiếp thành ngôn ngữ
máy L1 và thực thi trực tiếp trên các mạch điện tử.

Phạm Hùng Kim Khánh Trang 2


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

Về cơ bản, máy tính gồm có 6 cấp:

Cấp 5 Cấp ngôn ngữ hướng vấn đề

Dịch (chương trình dịch)

Cấp 4 Cấp ngôn ngữ hợp dịch

Dịch (hợp dịch)

Cấp 3 Cấp hệ điều hành

Dịch 1 phần (hệ điều hành)

Cấp 2 Cấp máy quy ước

Thông dịch (vi chương trình)

Cấp 1 Cấp vi lập trình

Vi chương trình (phần cứng)

Cấp 0 Cấp logic số

Hình 1.2 – Các cấp trên máy tính số

Cấp 0 chính là phần cứng của máy tính. Các mạch điện tử của cấp này sẽ thực thi
các chương trình ngôn ngữ máy của cấp 1. Trong cấp logic số, đối tượng quan tâm là các
cổng logic. Các cổng này được xây dựng từ một nhóm các transistor.
Cấp 1 là cấp ngôn ngữ máy thật sự. Cấp này có một chương trình gọi là vi chương
trình (microprogram), vi chương trình có nhiệm vụ thông dịch các chỉ thị của cấp 2. Hầu
hết các lệnh trong cấp này là di chuyển dữ liệu từ phần này đến phần khác của máy hay
thực hiện việc một số kiểm tra đơn giản.
Mỗi máy cấp 1 có một hay nhiều vi chương trình chạy trên chúng. Mỗi vi chương
trình xác định một ngôn ngữ cấp 2. Các máy cấp 2 đều có nhiều điểm chung ngay cả các
máy cấp 2 của các hãng sản xuất khác nhau. Các lệnh trên máy cấp 2 được thực thi bằng
cách thông dịch bởi vi chương trình mà không phải thực thi trực tiếp bằng phần cứng.
Cấp thứ 3 thường là cấp hỗn hợp. Hầu hết các lệnh trong ngôn ngữ của cấp máy
này cũng có trong ngôn ngữ cấp 2 và đổng thời có thêm một tập lệnh mới, một tổ chức bộ

Phạm Hùng Kim Khánh Trang 3


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

nhớ khác và khả năng chạy 2 hay nhiều chương trình song song. Các lệnh mới thêm vào
sẽ được thực thi bằng một trình thông dịch chạy trên cấp 2, gọi là hệ điều hành. Nhiều
lệnh cấp 3 được thực thi trực tiếp do vi chương trình và một số lệnh khác được thông dịch
bằng hệ điều hành (do đó, cấp này là cấp hỗn hợp).
Cấp 4 thật sự là dạng tượng trưng cho một trong các ngôn ngữ. Cấp này cung cấp
một phương pháp viết chương trình cho các cấp 1, 2, 3 dễ dàng hơn. Các chương trình
viết bằng hợp ngữ được dịch sang các ngôn ngữ của cấp 1, 2, 3 và sau đó được thông dịch
bằng các máy ảo hay thực tương ứng.
Cấp 5 bao gồm các ngôn ngữ được thiết kế cho người lập trình nhằm giải quyết
một vấn đề cụ thể. Các ngôn ngữ này được gọi là cấp cao. Một số ngôn ngữ cấp cao như
Basic, C, Cobol, Fortran, Lisp, Prolog, Pascal và các ngôn ngữ lập trình hướng đối tượng
như C++, J++, … Các chương trình viết bằng các ngôn ngữ này thường được dịch sang
cấp 3 hay 4 bằng các trình biên dịch (compiler).

2. Giao tiếp ngoại vi


Ta phân biệt tất cả 3 phương pháp xuất / nhập dữ liệu:
- Nhập / xuất bằng cách hỏi trạng thái của thiết bị ngoại vi (polling)
- Nhập / xuất bằng ngắt (interrupt).
- Nhập / xuất bằng cách truy xuất trực tiếp vào bộ nhớ dùng các phần cứng phụ
trợ (DMA).
2.1. Nhập / xuất dữ liệu bằng cách hỏi vòng (polling)
Ta biết rằng vấn đề điều khiển nhập / xuất dữ liệu sẽ rất đơn giản trong trường hợp
thiết bị ngoại vi lúc nào cũng có thể làm việc với μP. Ta có thể ví dụ như bộ hiển thị Led
7 đoạn lúc nào cũng sẵn sàng hiển thị dữ liệu khi mà μP gởi dữ liệu ra. Tuy nhiên, trong
thực tế, không phải lúc nào μP cũng làm việc với các thiết bị ngoại vi có tính năng như
trên. Ví dụ như khi làm việc với một máy in, μP yêu cầu in nhưng máy in không sẵn sàng
(giả sử như hết giấy, kẹt giấy, …). Khi đó, μP phải kiểm tra xem một thiết bị mà nó cần
giao tiếp có sẵn sàng hay không nếu thiết bị sẵn sàng thì mới thực hiện trao đổi dữ liệu.
Để kiểm tra các thiết bị ngoại vi, μP phải sử dụng các tín hiệu bắt tay (handshake) xác
định tuần tự từng thiết bị, xem thiết bị nào có yêu cầu trao đổi dữ liệu. Các tín hiệu này
lấy từ các mạch giao tiếp do người thiết kế tạo ra.
Giả sử hệ thống có 2 thiết bị ngoại vi, nếu thiết bị 1 có dữ liệu cần truyền đến μP
thì nó sẽ gởi 1 xung để chốt dữ liệu đồng thời tạo tín hiệu sẵn sàng cho thiết bị. Khi μP
kiểm tra tín hiệu sẵn sàng của thiết bị 1 thì nó sẽ đọc dữ liệu vào từ mạch chốt và xoá tín
hiệu sẵn sàng.
Trong trường hợp μP muốn gởi dữ liệu ra thiết bị 2, nó sẽ đọc tín hiệu sẵn sàng của
thiết bị 2, nếu thiết bị 2 có thể nhận dữ liệu thì μP sẽ gởi dữ liệu ra mạch chốt và thiết bị 2
sẽ đọc dữ liệu vào.

Phạm Hùng Kim Khánh Trang 4


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

2.2. Ngắt và xử lý ngắt


Trong cách thức thực hiện trao đổi dữ liệu bằng cách hỏi vòng như trên, trước khi
tiến hành thực hiện thì μP phải kiểm tra trạng thái sẵn sàng của thiết bị ngoại vi. Tuy
nhiên trong thực tế ta cần phải tận dụng khả năng của μP để làm các công việc khác mà
không phải tốn thời gian kiểm tra thiết bị, chỉ khi nào có yêu cầu trao đổi dữ liệu thì mới
tạm dừng công việc hiện tại. Cách làm việc như vậy gọi là ngắt μP, khi có một ngắt xảy ra
thì ta phải thực hiện gọi các chương trình phục vụ ngắt tại các địa chỉ xác định của μP.
Các tín hiệu ngắt từ thiết bị ngoại vi đưa vào μP thông qua các chân NMI hay INTR.
2.2.1. Các loại ngắt
™ Ngắt cứng: là các yêu cầu ngắt từ các chân NMI hay INTR.
Ngắt cứng NMI là ngắt không che được còn ngắt cứng INTR có thể che được. Các
lệnh CLI (Clear Interrupt) và STI (Set Interrupt) chỉ ảnh hưởng đến việc μP có chấp nhận
yêu cầu ngắt tại chân INTR hay không. Yêu cầu ngắt tại chân INTR có thể có các kiểu
ngắt từ 00h ÷ FFh. Kiểu ngắt này sẽ được đưa vào bus dữ liệu để μP xác định kiểu ngắt
(dùng cho các thiết bị ngoại vi khác nhau).

1 40
2 GND VCC 39
3 AD14 AD15 38
4 AD13 A16/S3 37
74LS245 5 AD12 A17/S4 36
VCC 1 6 AD11 A18/S5 35
19 DIR 7 AD10 A19/S6 34
G 8 AD9 BHE/S7 33
9 11 9 AD8 MN/MX 32
8 A8 B8 12 10 AD7 RD 31
7 A7 B7 13 11 AD6 HOLD (RQ/GT0) 30
6 A6 B6 14 12 AD5 HLDA (RQ/GT1) 29
5 A5 B5 15 13 AD4 WR (LOCK) 28
4 A4 B4 16 14 AD3 IO/M (S2) 27
3 A3 B3 17 15 AD2 DT/R (S1) 26
2 A2 B2 18 16 AD1 DEN (S0) 25
A1 B1 17 AD0 ALE (QS0) 24
1 18 NMI INTA (QS1) 23
INT7 INTR TEST
2 19 22
INT6 CLK READY
3 20 21
INT5 GND RESET
4
INT4
8 8086
5
INT3
6
INT2
11
INT1
12
INT0

Hình 1.3 – Kết nối ngắt đơn giản


™ Ngắt mềm: là các ngắt thực hiện bằng phần mềm tác động do người sử dụng.
2.2.2. Đáp ứng của μP khi có yêu cầu ngắt
Khi có yêu cầu ngắt đến μP và nếu được phép ngắt, μP sẽ thực hiện các công việc
sau:
- [SP] ← SP – 2, [SP] ← FR (Flag Register): cất thanh ghi cờ vào stack.
- IF ← 0, TF ← 0: không cho thực hiện các ngắt khác.
- SP ← SP – 2, [SP] ← CS: cất địa chỉ đoạn mã vào stack.
- SP ← SP – 2, [SP] ← IP: cất địa chỉ trở về sau khi phục vụ ngắt

Phạm Hùng Kim Khánh Trang 5


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

- IP ← [Số_hiệu_ngắt*4], CS ← [Số_hiệu_ngắt*4 + 2]: lấy lệnh tại địa chỉ phục


vụ ngắt tương ứng
- Sau khi kết thúc chương trình con phục vụ ngắt (khi gặp lệnh IRET):
+ IP ← [SP], SP ← SP + 2
+ CS ← [SP], SP ← SP + 2: lấy lại địa chỉ trước khi gọi chương trình phục vụ
ngắt
+ FR ← [SP], SP ← SP + 2: lấy lại giá trị thanh ghi cờ
2.2.3. Xử lý ưu tiên ngắt
Như ta đã biết ở trên, khi μP đang thực hiện lệnh, nếu có ngắt xảy ra thì μP sẽ tạm
ngừng chương trình và thực thi chương trình con phục vụ ngắt. Trong thực tế sẽ có trường
hợp có nhiều yêu cầu ngắt khác nhau cùng một lúc, khi đó μP sẽ phục vụ cho ngắt theo
thứ tự ưu tiên với nguyên tắc là ngắt nào có mức ưu tiên cao nhất thì sẽ phục vụ cho ngắt
đó trước.
Các mức ưu tiên của các ngắt (từ mức thấp nhất đến mức cao nhất):
- Ngắt thực hiện chạy từng lệnh (INT 1)
- Ngắt che được INTR
- Ngắt không che được NMI
- Ngắt nội bộ (INT 0: xảy ra do phép chia số 0, ngắt mềm)
2.3. Nhập / xuất dữ liệu bằng DMA (Direct Memory Access)
Trong các phương thức trao đổi dữ liệu như hai phần trên đã trình bày thì việc trao
đổi dữ liệu giữa thiết bị ngoại vi và hệ thống thường theo trình tự sau: từ ngoại vi đến vi
xử lý rồi đi vào bộ nhớ hay từ bộ nhớ đến vi xử lý rồi ghi ra ngoại vi. Trong thực tế sẽ
có trường hợp ta cần thực hiện trao đổi dữ liệu ngay giữa ngoại vi và bộ nhớ. Khi đó
người ta đưa ra cơ chế truy xuất bộ nhớ trực tiếp (DMA). Để thực hiện được vấn đề này,
các hệ vi xử lý thông thường dùng thêm các mạch chuyên dụng để điều khiển quá trình
truy xuất bộ nhớ trực tiếp (DMAC – Direct Memory Access Controller). Có tất cả 3 cơ
chế hoạt động:
¾ Tận dụng thời gian CPU không dùng bus:
Ta phải dùng thêm mạch phát hiện các chu kỳ xử lý nội của CPU và tận dụng các
chu kỳ này để thực hiện trao đổi dữ liệu.
¾ Treo CPU để trao đổi từng byte:
CPU không bị treo trong khoảng thời gian dài mà chỉ bị treo trong thời gian ngắn
đủ để trao đổi 1 byte dữ liệu giữa bộ nhớ và ngoại vi. Do đó, công việc của CPU không bị
gián đoạn mà chỉ bị chậm đi.
¾ Treo CPU một khoảng thời gian để trao đổi một khối dữ liệu:
Trong cơ chế này, CPU bị treo trong suốt quá trình trao đổi dữ liệu.
- CPU ghi từ lệnh và từ chế độ làm việc vào DMAC.
- Khi thiết bị ngoại vi có yêu cầu trao đổi dữ liệu, nó gởi tín hiệu DRQ = 1
(DMA Request) đến DMAC.

Phạm Hùng Kim Khánh Trang 6


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

- DMAC gởi tín hiệu HRQ (Hold Request) đến chân HOLD của CPU để yêu cầu
treo CPU. Tín hiệu này sẽ giữ ở mức cao cho đến hết quá trình trao đổi dữ liệu.
- Sau khi nhận yêu cầu treo, CPU sẽ thực hiện hết chu kỳ bus của m?nh rồi treo
các bus và gởi tín hiệu HLDA (Hold Acknowledge) để báo cho DMAC biết có
thể sử dụng các bus.
- DMAC chuyển dữ liệu từ bộ nhớ đến ngoại vi bằng cách: đưa địa chỉ byte đầu
tiên ra bus địa chỉ và đưa tín hiệu MEMR để đọc 1 byte từ bộ nhớ, kế tiếp
DMAC đưa tín hiệu IOW để ghi dữ liệu ra ngoại vi. Sau đó, DMAC giảm số
byte cần truyền, cập nhật địa chỉ bộ nhớ và lặp lại quá trình cho đến khi hết
byte cần truyền.
Address bus
μP
Data bus

DMAC I/O Memory


HOLD
HRQ DRQ DRQ
HLDA
HACK DACK DACK

Control bus

Hình 1.4 – Giao tiếp DMAC với hệ vi xử lý


Hai tín hiệu dùng để yêu cầu treo và chấp nhận yêu cầu treo CPU dùng cho cơ chế
DMA là HOLD và HLDA có thể mô tả như sau:
T4 hay T1

CLK

HOLD

HLDA

Hình 1.5 – Tín hiệu HOLD và HLDA

Phạm Hùng Kim Khánh Trang 7


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

3. Bus

CPU
Registers Bus hệ thống (system bus)

ALU Memory I/O


board board

Bus nội (on-chip bus)

Bus cục bộ
(local bus)
Đồng xử lý

Hình 1.6 - Các bus trong một hệ thống máy tính


Bus là đường truyền tín hiệu điện nối các thiết bị khác nhau trong một hệ thống
máy tính. Bus thường có từ 50 đến 100 dây dẫn được gắn trên mainboard, trên các dây
này có các đầu nối đưa ra, các đầu này được sắp xếp và cách nhau những khoảng quy
định để có thể cắm vào đó những I/O board hay board bộ nhớ (bus hệ thống – system
bus).
Cũng có những bus dùng cho mục đích chuyên biệt, thí dụ nối 1 vi xử lý với 1 hay
nhiều vi xử lý khác hoặc nối với bộ nhớ cục bộ (local bus).
Trong vi xử lý cũng có một số bus để nối các thành phần bên trong của bộ vi xử lý
với nhau. Người thiết kế chip vi xử lý có thể tuỳ ý lựa chọn loại bus bên trong nó, còn với
các bus liên hệ bên ngoài cần phải xác định rõ các quy tắc làm việc cũng như các đặc
điểm kỹ thuật về điện và cơ khí của bus để người thiết kế mainboard có thể ghép nối chip
vi xử lý với các thiết bị khác. Nói cách khác, các bus này phải tuân theo 1 chuẩn nào đó.
Tập các quy tắc của chuẩn còn được gọi là giao thức bus (bus protocol)
Thường có nhiều thiết bị nối với bus, một số thiết bị là tích cực (active) có thể đòi
hỏi truyền thông trên bus, trong khi đó có các thiết bị thụ động chờ yêu cầu từ các thiết bị
khác. Các thiết bị tích cực được gọi là chủ (master) còn thiết bị thụ động là tớ (slave).
Ví dụ: Khi CPU ra lệnh cho bộ điều khiển đĩa đọc/ghi một khối dữ liệu thì CPU là
master còn bộ điều khiển đĩa là slave. Tuy nhiên, bộ điều khiển đĩa ra lệnh cho bộ nhớ
nhận dữ liệu thì nó lại giữ vai trò master.

Phạm Hùng Kim Khánh Trang 8


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

3.1. Bus Driver và Bus Receiver


Tín hiệu điện trong máy tính phát ra thường không đủ để điều khiển bus, nhất là
khi bus khá dài và có nhiều thiết bị nối với nó. Chính vì thế mà hầu hết các bus master
được nối với bus thông qua 1 chip gọi là bus driver, về cơ bản nó là một bộ khuếch đại tín
hiệu số. Tương tự như vậy, hầu hết các slave được nối với bus thông qua bus receiver.
Đối với các thiết bị khi thì đóng vai trò master, khi thì đóng vai trò slave, người ta sử
dụng 1 chip kết hợp gọi là transceiver. Các chip này đóng vai trò ghép nối và là các thiết
bị 3 trạng thái, cho phép nó có thể ở trạng thái thứ 3 – hở mạch (thả nổi).
Giống như vi xử lý, bus có các đường địa chỉ, đường số liệu và đường điều khiển.
Tuy nhiên, không nhất thiết có ánh xạ 1 – 1 giữa các tín hiệu ở các chân ra của vi xử lý và
các đường dây của bus. Thí dụ: một số chíp vi xử lý có 3 chân ra, truyền ra các tín hiệu
báo chíp vi xử lý đang thực hiện các thao tác MEMR , MEMW , IOR , IOW hay thao
tác khác. Một bus điển hình thường có 4 đường trên.
Các vấn đề quan trọng nhất liên quan đến thiết kế bus là: xung clock bus (sự phân
chia thời gian, hay còn gọi là bus blocking), cơ chế phân xử bus (bus arbitration), xử lý
ngắt và xử lý lỗi.
Các bus có thể được chia theo giao thức truyền thông thành hai loại riêng biệt là
bus đồng bộ và bus không đồng bộ phụ thuộc vào việc sử dụng clock bus.
3.2. Bus đồng bộ (Synchronous bus)
Mỗi chu kỳ bus bắt đầu bằng việc xuất địa chỉ bộ nhớ hoặc I/O port (chu kỳ xung
nhịp T1). Bus điều khiển có 4 tín hiệu tác động mức thấp là MEMR , MEMW , IOR và
IOW .
Các chuỗi sự kiện xảy ra trong một chu kỳ bus đọc bộ nhớ:
T1: μP xuất địa chỉ bộ nhớ 20 bit. Các đường dữ liệu không hoạt động và các
đường điều khiển bị cấm
T2: Đường điều khiển MEMR xuống mức thấp. Đơn vị bộ nhớ ghi nhận chu kỳ
bus này là quá trình đọc bộ nhớ và đặt byte hay word có địa chỉ đó lên data bus.
T3: μP đặt cấu hình để các đường data bus là nhập. Trạng thái này chủ yếu để bộ
nhớ có thời gian tìm kiếm byte hay word dữ liệu
T4: μP đợi dữ liệu trên data bus. Do đó, nó thực hiện chốt data bus và giải phóng
các đường điều khiển đọc bộ nhớ. Quá trình này sẽ kết thúc chu kỳ bus.

Phạm Hùng Kim Khánh Trang 9


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

T1 T2 T3 T4

Clk

Address
bus Địa chỉ

IOR hay Đọc bộ


nhớ hay
MEMR I/O

Data bus Dữ liệu vào

Address
Địa chỉ
bus
Ghi bộ
IOW hay nhớ hay
MEMW I/O

Dữ liệu ra
Data bus

Hình 1.7 – Định thì chu kỳ bus đồng bộ

Trong một chu kỳ bus, μP có thể thực hiện đọc I/O, ghi I/O, đọc bộ nhớ hay ghi bộ
nhớ. Các đường address bus và control bus dùng để xác định địa chỉ bộ nhớ hay I/O và
hướng truyền dữ liệu trên data bus.
Chú ý rằng μP điều khiển tất cả các quá trình trên nên bộ nhớ bắt buộc phải cung
cấp được dữ liệu vào lúc MEMR lên mức cao trong trạng thái T4. Nếu không, μP sẽ đọc
dữ liệu ngẫu nhiên không mong muốn trên data bus. Để giải quyết vấn đề này, ta có thể
dùng thêm các trạng thái chờ (wait state).
™ Truyền theo khối:
Ngoài các chu kỳ đọc/ghi, một số bus truyền dữ liệu đồng bộ còn hỗ trợ truyền dữ
liệu theo khối. Khi bắt đầu thao tác đọc khối, bus master báo cho slave biết số byte cần
được truyền đi, thí dụ truyền con số này đi trong chu kỳ T1, sau đó đáng lẽ truyền đi 1
byte, slave đưa ra trong mỗi chu kỳ 1 byte cho tới khi đủ số byte được thông báo. Như
vậy, khi đọc dữ liệu theo khối, n byte dữ liệu cần n+2 chu kỳ clock chứ không phải 3n
chu kỳ.
Một cách khác để cho truyền dữ liệu nhanh hơn là giảm chu kỳ. Tuy nhiên, giảm
chu kỳ bus dẫn đến khó khăn về mặt kỹ thuật, các tín hiệu truyền trên các đường khác
nhau không phải luôn có cùng tốc độ, dẫn đến hiệu ứng bus skew. Điều quan trọng là thời

Phạm Hùng Kim Khánh Trang 10


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

gian chu kỳ phải dài hơn so với skew để tránh việc những khoảng thời gian được số hoá
lại trở thành các đại lượng biến thiên liên tục.
3.3. Bus bất đồng bộ( Asynchronous bus)
Bus bất đồng bộ không sử dụng xung clock đồng bộ, chu kỳ của nó có thể kéo dài
tuỳ ý và có thể khác nhau đối với các cặp thiết bị khác nhau. Làm việc với các bus đồng
bộ dễ dàng hơn do nó được định thời một cách gián đoạn , tuy vậy chính đặc điểm này
cũng dẫn đên nhược điểm. Mọi công việc được tiến hành trong khoảng thời gian là bội số
của xung clock, nếu 1 thao tác nào đó của vi xử lý hay bộ nhớ hoàn thành trong 3.1 chu
kỳ thì nó cũng sẽ phải kéo dài trong 4 chu kỳ. Khi đã chọn chu kỳ bus và đã xây dựng bộ
nhớ, I/O card cho bus này thì khó có thể tận dụng những tiến bộ của công nghệ. Chẳng
hạn sau khi đã xây bus với sự định thời như trên, công nghệ mới đưa ra các vi xử lý và bộ
nhớ có thời gian chu kỳ là 100ns chứ không còn là 750ns như cũ, thì chúng vẫn chạy với
tốc độ thấp như các vi xử lý, bộ nhớ loại cũ, bởi vì giao thức bus đòi hỏi bộ nhớ phải đưa
được dữ liệu ra và ổn định trước thời điểm cạnh âm của T3. Nếu có nhiều thiết bị khác
nhau cùng nối với 1 bus, trong đó có thể có một số thiết bị hoạt động nhanh hơn hơn các
thiết bị khác thì cần phải đặt bus hoạt động phù hợp với thiết bị có tốc độ thấp nhất.
Bus bất đồng bộ ra đời nhằm khắc phục những nhược điểm của bus đồng bộ.
Trước hết master phát ra địa chỉ nhớ mà nó muốn truy cập, sau đó phát tín hiệu MEMR
tích cực để xác định cần truy xuất bộ nhớ và yêu cầu quá trình truy xuất là READ để xác
định chiều truyền dữ liệu. Tín hiệu MEMR được đưa ra sau tín hiệu địa chỉ một khoảng
thời gian phụ thuộc tốc độ hoạt động của master. Sau khi 2 tín hiệu này đã ổn định, master
sẽ phát ra tín hiệu MSYN (master synchrization) ở mức tích cực để báo cho slave biết
rằng các tín hiệu cần thiết đã sẵn sàng trên bus, slave có thể nhận lấy. Khi slave nhận
được tín hiệu này, nó sẽ thực hiện công việc với tốc độ nhanh nhất có thể được, đưa dữ
liệu của ô nhớ được yêu cầu lên bus dữ liệu. Khi hoàn thành slave sẽ phát tín hiệu SSYN
(slave synchronization) tích cực.
Address

MEMR
(Control)

MSYN

Data

SSYN

Hình 1.8 – Định thì chu kỳ bus bất đồng bộ

Phạm Hùng Kim Khánh Trang 11


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

Master nhận được tín hiệu SSYN tích cực thì xác định được dữ liệu của slave đã
sẵn sàng nên thực hiện việc chốt dữ liệu, sau đó đảo các đường địa chỉ cũng như các tín
hiệu MEMR và MSYN . Khi slave nhận được tín hiệu MSYN không tích cực, nó xác
định kết thúc chu kỳ và đảo tín hiệu SSYN làm bus trở lại trạng thái ban đầu, mọi tín hiệu
đều không tích cực, chờ bus master mới.
Trên giản đồ thời gian của bus bất đồng bộ, ta sử dụng mũi tên để thể hiện nguyên
nhân và kết quả. MSYN tích cực dẫn đến việc truyền dữ liệu ra bus dữ liệu và đồng thời
cũng dẫn đến việc slave phát ra tín hiệu SSYN tích cực, đến lượt mình tín hiệu SSYN lại
gây ra sự đảo mức của các đường địa chỉ, MEMR và MSYN . Cuối cùng sự đảo mức của
MSYN lại gây ra sự đảo mức tín hiệu SSYN và kết thúc chu kỳ. Tập các tín hiệu phối
hợp với nhau như vậy được gọi là bắt tay toàn phần (full handshake), chủ yếu gồm 4 tín
hiệu sau:
- MSYN tích cực.
- SSYN tích cực để đáp lại tín hiệu MSYN .
- MSYN được đảo để đáp lại tín hiệu SSYN (tích cực).
- SSYN được đảo để đáp lại tín hiệu MSYN không tích cực.
Ta có thể nhận thấy bắt tay toàn phần là độc lập thời gian, mỗi sự kiện được gây ra
bởi 1 sự kiện trước đó chứ không phải bởi xung clock. Nếu 1 cặp master-slave nào đó
hoạt động chậm thì cặp master-slave kế tiếp không hề bị ảnh hưởng.
Tuy ưu điểm của bus bất đồng bộ rất rõ ràng, nhưng trong thực tế phần lớn các bus
đang sử dụng là loại đồng bộ. Nguyên nhân là các hệ thống sử dụng bus đồng bộ dễ thiết
kế hơn. Vi xử lý chỉ cần chuyển các mức tín hiệu cần thiết sang trạng thái tích cực là bộ
nhớ đáp ứng ngay, không cần tín hiệu phản hồi. Chỉ cần các chọn phù hợp thì mọi hoạt
động đều trôi chảy, không cần phải bắt tay.
3.4. Xử lý ngắt
Ở trên, ta chỉ khảo sát các chu kỳ bus thông thường, trong đó master nhận hay gởi
thông tin từ / đến slave. Một ứng dụng quan trọng nữa của bus là dùng để xử lý ngắt. Khi
CPU ra lệnh cho thiết bị I/O làm một việc gì đó, nó thường chờ đợi tín hiệu ngắt do thiết
bị I/O phát ra khi hoàn thành công việc được CPU yêu cầu. Khi nhận được tín hiệu ngắt,
CPU sẽ đáp ứng ngay, có thể nhận dữ liệu do thiết bị I/O truyền về, hay gởi tiếp dữ liệu ra
thiết bị I/O, hay CPU sẽ sử dụng bus cho một thao tác khác…. Như vậy chính ngắt phát ra
tín hiệu yêu cầu sử dụng bus.
Vì có thể nhiều thiết bị ngoại vi cùng phát ra ngắt, cho nên cần có 1 cơ chế phân
xử giống như đối với các bus thông thường. Giải pháp thường dùng là gán các mức độ ưu
tiên cho các thiết bị và sử dụng 1 arbiter tập trung để trao quyền ưu tiên cho các thiết bị
quan trọng thường xuyên được sử dụng. Hiện trên thị trường có những chip điều khiển
ngắt được tiêu chuẩn hóa và được sử dụng rộng rãi là chip 8259A. Có thể nối 8 chip điều
khiển I/O tới các đầu IRx (Interrupt request) của 8259A. Khi có 1 thiết bị nào đó muốn
ngắt, nó đặt mức tích cực lên chân Irx, 8259A nhận được tín hiệu tích cực ở 1 hay một số

Phạm Hùng Kim Khánh Trang 12


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

đầu vào Irx thì sẽ đặt mức tích cực lên đầu dây INT. Tín hiệu INT sẽ truyền trực tiếp đến
chân Interrupt của CPU. Khi CPU có thể xử lý được ngắt, nó gởi lại 1 tín hiệu chấp nhận
ngắt cho 8259A. Lúc này, CPU chờ 8259A chỉ ra I/O nào yêu cầu ngắt, bằng cách gởi số
hiệu của I/O đó lên bus dữ liệu (D0-D7) để đi đến CPU. Sau đó, phần cứng CPU sẽ sử
dụng con số đó để tính chỉ số trong 1 bảng con trỏ -bảng vector ngắt (interrupt vector) để
tìm địa chỉ chương trình con, cho chạy chương trình này để phục vụ ngắt. Các chương
trình con này gọi là chương trình con xử lý ngắt.

4. Các chip hỗ trợ cho bộ xử lý trung tâm


4.1. Mạch tạo xung clock 8284
1 18
2 CSY NC VCC 17
3 PCLK X1 16
4 AEN1 X2 15
5 RDY 1 ASY NC 14
6 READY EFI 13
7 RD2 F/C 12
8 AEN2 OSC 11
9 CLK RES 10
GND RESET
8284
Hình 1.9 – Mạch tạo xung clock 8284
PCLK (Peripheral Clock): xung clock f = fX/6 (fX là tần số thạch anh) với chu kỳ
bổn phận 50%.
CSYNC (Clock Synchronisation): ngõ vào xung đồng bộ chung khi hệ thống có
các 8284 dùng dao động ngoài tại chân EFI. Khi dùng mạch dao động trong thì phải nối
GND.
AEN 1 , AEN 2 (Address Enable): cho phép chọn các chân tương ứng RDY1,
RDY2 báo hiệu trạng thái sẵn sàng của bộ nhớ hay thiết bị ngoại vi.
RDY1, RDY2 (Bus ready): kết hợp với AEN1 , AEN2 tạo các chu kỳ đợi ở CPU
READY: nối đến chân READY của μP.
CLK (Clock): xung clock f = fX/3, nối với chân CLK của CPU.
RESET: nối với chân RESET của CPU, là tín hiệu khởi động lại toàn hệ thống.
RES (Reset Input): chân khởi động cho 8284, được nối với mạch RC để tự khởi
động khi bật nguồn.
OSC: ngõ ra xung clock có tần số fX.
F/ C (Frequency / Crystal): chọn nguồn tín hiệu chuẩn cho 8284, nếu ở mức cao
thì chọn tần số xung clock bên ngoài, ngược lại thì dùng xung clock từ thạch anh.
EFI (External Frequency Input): xung clock từ bộ dao động ngoài.

Phạm Hùng Kim Khánh Trang 13


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

ASYNC : chọn chế độ làm việc cho tín hiệu RDY. Nếu ASYNC = 1, tín hiệu
RDY có ảnh hưởng đến tín hiệu READY cho đến khi có xung âm của xung clock. Ngược
lại thì RDY chỉ ảnh hưởng khi xuất hiện xung âm.
X1,X2: ngõ vào của thạch anh, dùng để tạo xung chuẩn cho hệ thống.
18 1
17 VCC CSY NC 2
16 X1 PCLK 3
15 X2 AEN1 4
14 ASY NC RDY 1 5
13 EFI READY 6
12 F/C RD2 7
11 OSC AEN2 8
10 RES CLK 9
RESET GND

Vcc
8284

Hình 1.10 – Mạch khởi động cho 8284


4.2. Mạch định thời PIT – 8253 / 8254 (Programmable Interval Timer)

19 10
20 A0 OUT0 13
A1 OUT1 17
11 OUT2
14 G0 8
16 G1 D0 7
G2 D1 6
9 D2 5
15 CLK0 D3 4
18 CLK1 D4 3
CLK2 D5 2
22 D6 1
23 RD D7
21 WR
CS

8253

Hình 1.11 – Sơ đồ chân của PIT 8253

Phạm Hùng Kim Khánh Trang 14


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

OUT0
D7 ÷ D0 Đệm dữ Bộ đếm
liệu 0 CLK0
GATE0

RD OUT1
Điều Bộ đếm

BUS NỘI
WR khiển 1 CLK1
A1 đọc/ghi GATE1
A0
CS

OUT2
Thanh Bộ đếm
ghi từ 2 CLK2
điều GATE2
khiển

Hình 1.12 – Sơ đồ khối của PIT 8253

D7 ÷ D0: bus dữ liệu


CLK0 ÷ CLK2: ngõ vào xung clock cho các bộ đếm
OUT0 ÷ OUT2: ngõ ra bộ đếm
RD , WR : cho phép CPU đọc / ghi dữ liệu từ / đến các thanh ghi của 8253
A1, A0: giải mã chọn bộ đếm hay thanh ghi điều khiển, thường được nối với bus
địa chỉ của CPU
A1 A0 Chọn
0 0 Bộ đếm 0
0 1 Bộ đếm 1
1 0 Bộ đếm 2
1 1 Thanh ghi từ điều khiển

G0 ÷ G2 (Gate): cho phép hay cấm các bộ đếm hoạt động ( =1: cho phép, =0:
cấm).

PIT 8253 có tất cả 5 chế độ đếm tùy thuộc vào giá trị trong thanh ghi điều khiển.

Phạm Hùng Kim Khánh Trang 15


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

SC1 SC0 RW1 RW0 M2 M1 M0 BCD

Chọn bộ đếm Định dạng đếm


00: bộ đếm 0 0: đếm nhị phân
01: bộ đếm 1 1: đếm BCD (0 ÷ 999)
10: bộ đếm 2
11: đọc CWR trong 8254

Quy định phương thức Chế độ đếm


đọc/ghi 000: chế độ 0
00: chốt bộ đếm 001: chế độ 1
01: đọc/ghi byte thấp 010: chế độ 2
10: đọc/ghi byte cao 011: chế độ 3
11: đọc/ghi byte thấp 100: chế độ 4
trước, byte cao sau 101: chế độ 5

Hình 1.13 – Dạng từ điều khiển của 8253

PIT 8253 có 3 bộ đếm lùi 16 bit có thể lập trình và độc lập với nhau. Mỗi bộ đếm
có tín hiệu xung clock riêng (8254 tương tự như 8253 nhưng có thêm lệnh đọc thanh ghi
từ điều khiển CWR).
™ Các chế độ đếm:
Chế độ 0 (Interrupt on Terminal Count): tín hiệu ngõ ra ở mức thấp cho tới khi bộ
đếm tràn thì sẽ chuyển lên mức cao.
Chế độ 1 (Programmable Monoflop): tín hiệu ngõ ra chuyển xuống mức thấp tại
cạnh âm của xung clock đầu tiên và sẽ chuyển lên mức cao khi bộ đếm kết thúc.
Chế độ 2 (Rate Generator): tín hiệu ngõ ra xuống mức thấp trong chu kỳ đầu tiên
và sau đó chuyển lên mức cao trong các chu kỳ còn lại.
Chế độ 3 (Square-Wave Generator): tương tự như chế độ 2 nhưng xung ngõ ra là
sóng vuông khi giá trị đếm chẵn và sẽ thêm một chu kỳ ở mức cao khi giá trị đếm lẻ.
Chế độ 4 (Software-triggered Pulse): giống như chế độ 2 nhưng xung Gate không
khởi động quá trình đếm mà sẽ đếm ngay khi số đếm ban đầu được nạp. Ngõ ra ở mức
cao để đếm và xuống mức thấp trong chu kỳ xung đếm. Sau đó, ngõ ra sẽ trở lại mức cao.
Chế độ 5 (Hardware-triggered Pulse): giống như chế độ 2 nhưng xung Gate không
khởi động quá trình đếm mà được khởi động bằng cạnh dương của xung clock ngõ vào.
Ngõ ra ở mức cao và xuống mức thấp sau một chu kỳ clock khi quá trình đếm kết thúc.

Phạm Hùng Kim Khánh Trang 16


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

™ Ba chức năng của 8253 trong PC:


Cập nhật đồng hồ hệ thống: bộ đếm 0 của PIT phát tuần hoàn một ngắt cứng qua
IRQ0 của 8259 để CPU có thể thay đổi đồng hồ hệ thống. Bộ đếm hoạt động trong chế độ
2. Ngõ vào được cấp xung clock tần số 1.19318 MHz. G0 = 1 để bộ đếm luôn được phép
đếm. Giá trị ban đầu được nạp là 0 cho phép PIT phát ra xung chính xác với tần
số:1.19318/65536 = 18.206Hz. Cạnh dương của mỗi xung này sẽ tạo ra một ngắt cứng
trong 8259. Yêu cầu này sẽ dẫn tới ngắt 08h để cập nhật đồng hổ hệ thống 18.206 lần
trong 1 giây.
Làm tươi bộ nhớ: PIT nối với chip DMAC dùng làm tươi bộ nhớ DRAM. Bộ đếm
1 sẽ định kỳ kích hoạt kênh 0 của DMAC-8237A để tiến hành 1 chu trình đọc giả làm
tươi bộ nhớ. Bộ nhớ 1 hoạt động trong chế độ 3 phát sóng vuông với giá trị nạp ban đầu là
18. Do đó sóng vuông được phát ra có tần số 1,19318 MHz/18 = 66288 Hz (chu kỳ bằng
0.015s). Như vậy cứ sau 15 ms cạnh dương của sóng vuông này sẽ tạo 1 chu kỳ đọc giả
để làm tươi bộ nhớ.
Phát sóng âm với tần số biến đổi ra loa của PC: Bộ đếm 2 của PIT được dùng để
phát sóng âm ra loa của PC.
4.3. Mạch điều khiển bus 8288
Mạch điều khiển bus 8288 lấy một số tín hiệu điều khiển của CPU và cung cấp các
tín hiệu điều khiển cần thiết cho hệ vi xử lý.
1 20
2 IOB VCC 19
3 CLK S0 18
4 S1 S2 17
5 DT/R MCE/PDEN 16
6 ALE DEN 15
7 AEN CEN 14
8 MRDC INTA 13
9 AMWC IORC 12
10 MWTC AIOWC 11
GND IOWC
8288
Hình 1.14 – Mạch điều khiển bus 8288
IOB (Input / Output Bus Mode): điều khiển để 8288 làm việc ở các chế độ bus
khác nhau.
CLK (Clock): ngõ vào lấy từ xung clock hệ thống (từ 8284) và dùng để đồng bộ
toàn bộ các xung điều khiển đi ra từ mạch 8288.
DT/ R (Data Transmit/Receive): CPU truyền (1) hay nhận (0) dữ liệu.
ALE (Address Latch Enable): tín hiệu cho phép chốt địa chỉ, tín hiệu này thường
được nối với chân G của 74573 để điếu khiển chốt địa chỉ.
AEN (Address Enable): chờ thời gian trễ khoảng 150 ns sẽ tạo các tín hiệu điều
khiển ở đầu ra của 8288 để đảm bảo rằng địa chỉ sử dụng đã hợp lệ.
S 2 , S1 , S0 : các tín hiệu trạng thái lấy trực tiếp từ CPU. Tuỳ theo các giá trị nhận
được mà 8288 sẽ đưa các tín hiệu theo bảng:

Phạm Hùng Kim Khánh Trang 17


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

S2 S1 S0 Tạo tín hiệu


0 0 0 INTA
0 0 1 IORC
0 1 0 IOWC , AIOWC
0 1 1 Không
1 0 0 MRDC
1 0 1 MRDC
1 1 0 MWTC , AMWC
1 1 1 Không
MRDC (Memory Read Command): điều khiển đọc bộ nhớ
MWTC (Memory Write Command): điều khiển ghi bộ nhớ
AMWC (Advanced MWTC),: giống như MWTC nhưng hoạt động sớm hơn một
chút dùng cho các bộ nhớ chậm đáp ứng kịp tốc độ CPU.
IOWC (I/O Write Command): điều khiển ghi ngoại vi
AIOWC (Advanced IOWC),: giống như IOWC nhưng hoạt động sớm hơn một
chút dùng cho các ngoại vi chậm đáp ứng kịp tốc độ CPU.
IORC (I/O Read Command): điều khiển đọc ngoại vi
INTA (Interrupt Acknowledge): ngõ ra thông báo CPU chấp nhận yêu cầu ngắt
của thiết bị ngoại vi
CEN (Command Enable): cho phép đưa ra tín hiệu DEN và các tín hiệu điều khiển
khác của 8288.
DEN (Data Enable): điều khiển bus dữ liệu thành bus cục bộ hay bus hệ thống.
MCE / PDEN (Master Cascade Enable / Peripheral Data Enable): định chế độ làm
việc cho mạch điều khiển ngắt PIC 8259 để nó làm việc ở chế độ master.

Phạm Hùng Kim Khánh Trang 18


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

4.4. Chip điều khiển ngắt ưu tiên PIC 8259A (Priority Interrupt Controller)
18 11
19 IR0 D0 10
20 IR1 D1 9
21 IR2 D2 8
22 IR3 D3 7
23 IR4 D4 6
24 IR5 D5 5
25 IR6 D6 4
IR7 D7
27 12
A0 CAS0 13
26 CAS1 15
3 INTA CAS2
2 RD 16
1 WR SP/EN
CS 17
INT

8259A

Hình 1.15 – Sơ đồ chân của 8259A


Trong trường hợp nhiều yêu cầu ngắt cần phải phục vụ, ta thường dùng vi mạch
8259A để giải quyết vấn đề ưu tiên. 8259A có thể giải quyết được 8 yêu cầu ngắt với 8
mức ưu tiên khác nhau.
™ Các khối chức năng:
IRR (thanh ghi yêu cầu ngắt): lưu trữ các yêu cầu ngắt tại ngõ vào
ISR (thanh ghi phục vụ ngắt): lưu trữ các yêu cầu ngắt đang phục vụ
IMR (thanh ghi mặt nạ ngắt): lưu trữ mặt nạ của các yêu cầu ngắt tại ngõ vào
Control logic (logic điều khiển): gởi yêu cầu ngắt tới chân INTR của CPU khi có
tín hiệu ngắt tại ngõ vào của 8259A và nhận trả lời chấp nhận yêu cầu ngắt hay không
INTA từ CPU để đưa kiểu ngắt vào CPU.
Data bus buffer (đệm bus dữ liệu): giao tiếp giữa 8259A với bus dữ liệu của CPU.
Cascade buffer / comparator (đệm nối tầng và so sánh): lưu trữ và so sánh số hiệu
của các kiểu ngắt trong trường hợp dùng nhiều mạch 8259A.

Phạm Hùng Kim Khánh Trang 19


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

INTA INT

Data bus
buffer Control logic

RD ISR PR IRR IR0


Read /
WR (Interrupt (Priority (Interrupt
Write IR1
Service Resolver) Request
A0 Logic
Register) Register)

IR7
INTERNAL BUS

CS

CAS0
Cascade
CAS1
buffer / IMR (Interrupt Mask Register)
CAS2 comparator

SP / EN

Hình 1.16 – Sơ đồ khối của PIC 8259A

™ Các tín hiệu điều khiển:


CAS0 ÷ 2 (In, Out): các ngõ vào chọn mạch 8259A tớ (slave) từ mạch 8259A chủ
(master) trong trường hợp dùng nhiều mạch 8259A để tăng yêu cầu ngắt.
SP / EN (In, Out) (Slave Program / Enable Buffer): nếu 8259A hoạt động ở chế
độ không dùng đệm dữ liệu thì tín hiệu này dùng để xác định mạch 8259A là mạch chủ
( SP = 1) hay tớ ( SP = 0). Nếu 8259A hoạt động ở chế độ có đệm dữ liệu thì tín hiệu này
dùng để cho phép giao tiếp giữa 8259A và CPU, khi đó mạch 8259A là master hay slave
phải dựa vào từ lệnh khởi động ICW4.
INT (Out): tín hiệu yêu cầu ngắt đưa đến CPU (chân INTR).
INTA (In): nhận trả lời chấp nhận ngắt hay không từ CPU (chân INTA )
A0: cho phép chọn các từ điều khiển của 8259A.
8259A cho phép xử lý 8 ngắt với 8 mức ưu tiên khác nhau. Trong trường hợp hệ
thống có số lượng ngắt lớn hơn thì có thể mắc nhiều 8259A liên tầng.

Phạm Hùng Kim Khánh Trang 20


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

18 11 18 11 1 40
19 IR0 D0 10 19 IR0 D0 10 2 GND VCC 39
20 IR1 D1 9 20 IR1 D1 9 3 AD14 AD15 38
21 IR2 D2 8 21 IR2 D2 8 4 AD13 A16/S3 37
22 IR3 D3 7 22 IR3 D3 7 5 AD12 A17/S4 36
23 IR4 D4 6 23 IR4 D4 6 6 AD11 A18/S5 35
24 IR5 D5 5 24 IR5 D5 5 7 AD10 A19/S6 34
25 IR6 D6 4 25 IR6 D6 4 8 AD9 BHE/S7 33
IR7 D7 IR7 D7 9 AD8 MN/MX 32
27 27 10 AD7 RD 31
A0 1 A0 1 11 AD6 HOLD (RQ/GT0) 30
CS 3 CS 3 12 AD5 HLDA (RQ/GT1) 29
RD 2 RD 2 Vcc 13 AD4 WR (LOCK) 28
12 WR 16 12 WR 16 14 AD3 IO/M (S2) 27
13 CAS0 SP/EN 17 13 CAS0 SP/EN 17 15 AD2 DT/R (S1) 26
15 CAS1 INT 26 15 CAS1 INT 26 16 AD1 DEN (S0) 25
CAS2 INTA CAS2 INTA 17 AD0 ALE (QS0) 24
18 NMI INTA (QS1) 23
8259A - Slave 8259A - Master 19 INTR TEST 22
20 CLK READY 21
GND RESET
8086

Hình 1.17 – 8259A mắc liên tầng

4.5. Chip điều khiển truy nhập bộ nhớ trực tiếp DMAC 8237 (Direct Memory
Access Controller)
DMAC 8237 có thể thực hiện truyền dữ liệu theo 3 kiểu: kiểu đọc (từ bộ nhớ ra
thiết bị ngoại vi), kiểu ghi (từ thiết bị ngoại vi đến bộ nhớ) và kiểu kiểm tra.

32 30
33 A0 DB0 29
34 A1 DB1 28
35 A2 DB2 27
37 A3 DB3 26
38 A4 DB4 23
39 A5 DB5 22
40 A6 DB6 21
A7 DB7
12 25
CLK DAK0 24
19 DAK1 14
18 DRQ0 DAK2 15
17 DRQ1 DAK3
16 DRQ2 3
DRQ3 MEMR 4
36 MEMW
7 EOP 9
1 HLDA AEN 8
2 IOR ASTB 10
6 IOW HRQ
13 READY
5 RESET
11 VX
CS

8237

Phạm Hùng Kim Khánh Trang 21


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

EOP Decrementor Incrementor


A0 – A3
RESET Temp word Temp address I/O buffer
count register register
CS
Bus 16 bit A4 – A7
READY Output buffer
CLK Timing and
control Read buffer R/W buffer
AEN
Base Base word Current Current
ADSTB address
count
address
word count

Command
MEMW control
MEMR
Write buffer Read buffer
IOW

A8 – A15
IOR

D0 – D1
DB0 – DB7
DRQ0 – DRQ3 Command
RD I/O buffer
Priority encoder
DACK0 – DACK3
and rotating
Mask
prority logic
HLDA
R/W Status Temp
HRQ Request Mode

Hình 1.18 – Sơ đồ chân và sơ đồ khối của DMAC 8237A


™ Khối Timing and Control (định thời và điều khiển):
Tạo các tín hiệu định thời và điều khiển cho bus ngoài (external bus). Các tín hiệu
này được đồng bộ với xung clock đưa vào DMAC (tần số xung clock tối đa là 5 MHz).
™ Khối Priority encoder and rotating priority logic (mã hóa ưu tiên và
quay mức ưu tiên):
DMAC 8237A có 2 mô hình ưu tiên: mô hình ưu tiên cố định (fixed priority) và
mô hình ưu tiên quay (rotating priority). Trong mô hình ưu tiên cố định, kênh 0 sẽ có
mức ưu tiên cao nhất còn kênh 3 có mức ưu tiên thấp nhất. Còn đối với mô hình ưu tiên
quay thì mức ưu tiên khi khởi động giống như mô hình ưu tiên cố định nhưng khi yêu cầu
DMA tại một kênh nào đó được phục vụ thì sẽ được đặt xuống mức ưu tiên thấp nhất.
™ Khối Command Control (điều khiển lệnh):
Giải mã các thanh ghi lệnh (xác định thanh ghi sẽ được truy xuất và loại hoạt động
cần thực hiện).

Phạm Hùng Kim Khánh Trang 22


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

™ Các thanh ghi:


DMAC 8237A có tất cả 12 loại thanh ghi nội khác nhau:

Tên Kích thước (bit) Số lượng


Thanh ghi địa chỉ cơ sở (Base Address Register) 16 4
Thanh ghi đếm từ cơ sở (Base Word Count Register) 16 4
Thanh ghi địa chỉ hiện hành (Current Address Register) 16 4
Thanh ghi đếm từ hiện hành (Current Word Count Register) 16 4
Thanh ghi địa chỉ tạm (Temporary Address Register) 16 1
Thanh ghi đếm từ tạm (Temporary Word Count Register) 16 1
Thanh ghi trạng thái (Status Register) 8 1
Thanh ghi lệnh (Command Register) 8 1
Thanh ghi tạm (Temporary Register) 8 1
Thanh ghi chế độ (Mode Register) 6 4
Thanh ghi mặt nạ (Mask Register) 4 1
Thanh ghi yêu cầu (Request Register) 4 1

™ Chức năng các chân của 8237A:


CLK (Input): tín hiệu xung clock của mạch. Tín hiệu này thường được lấy từ 8284
sau khi qua cổng đảo.
CS (Input): thường được nối với bộ giải mã địa chỉ.
RESET (Input): khởi động 8237A, được nối với ngõ RESET của 8284. Khi Reset
thì thanh ghi mặt nạ được lập còn các phần sau bị xóa:
+ Thanh ghi lệnh
+ Thanh ghi trạng thái
+ Thanh ghi yêu cầu
+ Thanh ghi tạm
+ Flip-flop đầu/cuối (First/Last flip-flop)
READY (Input): nối với READY của CPU để tạo chu kỳ đợi khi truy xuất các thiết
bị ngoại vi hay bộ nhớ chậm.
HLDA (Hold Acknowledge)(Input): tín hiệu chấp nhận yêu cầu treo từ CPU
DRQ0 – DRQ3 (DMA Request)(Input): các tín hiệu yêu cầu treo từ thiết bị ngoại
vi.
DB0 – DB7 (Input, Output): nối đến bus địa chỉ và dữ liệu của CPU

Phạm Hùng Kim Khánh Trang 23


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

IOR , IOW (Input, Output): sử dụng trong các chu kỳ đọc và ghi
EOP (End Of Process)(Input,Output): bắt buộc DMAC kết thúc quá trình DMA
nếu là ngõ vào hay dùng để báo cho một kênh biết là dữ liệu đã chuyển xong
(Terminal count – TC), thường dùng như yêu cầu ngắt để CPU kết thúc quá trình
DMA.
A0 – A3 (Input, Output): chọn các thanh ghi trong 8237A khi lập trình hay dùng để
chứa 4 bit địa chỉ thấp.
A4 – A7 (Output): chứa 4 bit địa chỉ
HRQ (Hold Request)(Output): tín hiệu yêu cầu treo đến CPU
DACK0 – DACK3 (DMA Acknowledge)(Output): tín hiệu trả lời yêu cầu DMA cho
các kênh.
AEN (Output): cho phép lấy địa chỉ vùng nhớ cần trao đổi
ADSTB (Address Strobe)(Output): chốt các bit địa chỉ cao A8 – A15 chứa trong
các chân DB0 – DB7
MEMR , MEMW (Output): dùng để đọc / ghi bộ nhớ.
™ Các thanh ghi nội:
Các thanh ghi nội trong DMAC 8237A được truy xuất nhờ các bit địa chỉ thấp A0
– A3.
Bit địa chỉ Địa
Chọn chức năng R/W?
A3 A2 A1 A0 chỉ
0 0 0 0 X0 Thanh ghi địa chỉ bộ nhớ kênh 0 R/W
0 0 0 1 X1 Thanh ghi đếm từ kênh 0 R/W
0 0 1 0 X2 Thanh ghi địa chỉ bộ nhớ kênh 1 R/W
0 0 1 1 X3 Thanh ghi đếm từ kênh 1 R/W
0 1 0 0 X4 Thanh ghi địa chỉ bộ nhớ kênh 2 R/W
0 1 0 1 X5 Thanh ghi đếm từ kênh 2 R/W
0 1 1 0 X6 Thanh ghi địa chỉ bộ nhớ kênh 3 R/W
0 1 1 1 X7 Thanh ghi đếm từ kênh 3 R/W
1 0 0 0 X8 Thanh ghi trạng thái / lệnh R/W
1 0 0 1 X9 Thanh ghi yêu cầu W
1 0 1 0 XA Thanh ghi mặt nạ cho một kênh W
1 0 1 1 XB Thanh ghi chế độ W
1 1 0 0 XC Xóa flip-flop đầu/cuối W
1 1 0 1 XD Xóa toàn bộ các thanh ghi / đọc thanh ghi tạm W/R
1 1 1 0 XE Xóa thanh ghi mặt nạ W
1 1 1 1 XF Thanh ghi mặt nạ W

Phạm Hùng Kim Khánh Trang 24


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

Địa chỉ các thanh ghi nội dùng ghi / đọc địa chỉ:
Kênh IOR IOW A3 A2 A1 A0 Thanh ghi R/W?

0 1 0 0 0 0 0 Địa chỉ cơ sở và địa chỉ hiện hành W


0 1 0 0 0 0 Địa chỉ hiện hành R
1 0 0 0 0 1 Bộ đếm cơ sở và bộ đếm hiện hành W
0 1 0 0 0 1 Bộ đếm hiện hành R
1 1 0 0 0 1 0 Địa chỉ cơ sở và địa chỉ hiện hành W
0 1 0 0 1 0 Địa chỉ hiện hành R
1 0 0 0 1 1 Bộ đếm cơ sở và bộ đếm hiện hành W
0 1 0 0 1 1 Bộ đếm hiện hành R
2 1 0 0 1 0 0 Địa chỉ cơ sở và địa chỉ hiện hành W
0 1 0 1 0 0 Địa chỉ hiện hành R
1 0 0 1 0 1 Bộ đếm cơ sở và bộ đếm hiện hành W
0 1 0 1 0 1 Bộ đếm hiện hành R
3 1 0 0 1 1 0 Địa chỉ cơ sở và địa chỉ hiện hành W
0 1 0 1 1 0 Địa chỉ hiện hành R
1 0 0 1 1 1 Bộ đếm cơ sở và bộ đếm hiện hành W
0 1 0 1 1 1 Bộ đếm hiện hành R
Địa chỉ các thanh ghi trạng thái và điều khiển:

IOR ` IOW A3 A2 A1 A0 Thanh ghi


1 0 1 0 0 0 Ghi thanh ghi lệnh
0 1 1 0 0 0 Đọc thanh ghi trạng thái
1 0 1 0 0 1 Ghi thanh ghi yêu cầu
1 0 1 0 1 0 Ghi thanh ghi mặt nạ
1 0 1 0 1 1 Ghi thanh ghi chế độ
1 0 1 1 0 0 Xóa flip-flop đầu/cuối
1 0 1 1 0 1 Xóa tất cả các thanh ghi nội
0 1 1 1 0 1
1 0 1 1 1 0 Địa chỉ cơ sở và địa chỉ hiện hành
0 1 1 1 1 0 Địa chỉ hiện hành
1 0 1 1 1 1 Bộ đếm cơ sở và bộ đếm hiện hành
0 1 1 1 1 1 Bộ đếm hiện hành

Mạch 8273A-5 chứa 4 kênh trao đổi dữ liệu DMA với mức ưu tiên lập trình được.
8237A-5 có tốc độ truyền 1 MBps cho mỗi kênh và 1 kênh có thể truyền 1 mảng có độ dài
64 KB. Để có thể sử dụng mạch DMAC 8237A, ta cần tạo tín hiệu điều khiển như sau:

Phạm Hùng Kim Khánh Trang 25


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

Vcc 2
3 1A 1Y
4
IOR
5 1B 7
6 2A
2B
2Y
IOW
RD
11 9
10 3A
3B
3Y MEMR
14 12
WR 13 4A 4Y
MEMW
4B
AEN 15
G
1
A/B
IO/ M 74LS257
Hình 1.19 – Tín hiệu điều khiển cho hệ thống làm việc với DMAC 8237A

Tín hiệu AEN từ 8237A dùng để cấm các tín hiệu điều khiển từ CPU khi DMAC
đã nắm quyền điều khiển bus.
4.6. Chip điều khiển màn hình CRTC 6845 (Cathode Ray Tube Controller)
RST (Reset): khởi động lại 6845.
MA0 ÷ MA13 (Memory Address): 14 địa chỉ nhớ cho RAM màn hình.
DE (Display Enable): cho phép (=1) hay không (=0) các tín hiệu điều khiển và địa
chỉ vùng hiện lên màn hình.
LPSTD (Light Pen Strobe): lưu trữ địa chỉ hiện hành của RAM màn hình trong
thanh ghi bút sáng. CPU đọc thanh ghi và xác định vị trí bút sáng trên màn hình.
CURSOR: vị trí con trỏ đã quét (=1) hay chưa (=0).
33 4
32 D0 MA0 5
31 D1 MA1 6
30 D2 MA2 7
29 D3 MA3 8
28 D4 MA4 9
27 D5 MA5 10
26 D6 MA6 11
D7 MA7 12
21 MA8 13
CLK MA9 14
23 MA10 15
3 E MA11 16
2 LPSTD MA12 17
24 RST MA13
22 RS 38
25 R/W RA0 37
CS RA1 36
RA2 35
RA3 34
RA4
19
CURSOR 18
DE 39
HS 40
VS

6845

Hình 1.20 – Sơ đồ chân của 6845

Phạm Hùng Kim Khánh Trang 26


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

VS (Vertical Synchronization): ngõ ra tín hiệu đồng bộ quét dọc


HS (Horizontal Synchronization): ngõ ra tín hiệu đồng bộ quét ngang
RA0 ÷RA4 (Row Address): phân định hàng quét của ký tự trong chế độ văn bản
(32 hàng quét). Trong chế độ đồ họa, chúng kết hợp với MA0 ÷ MA13 tạo các địa chỉ cho
các bank RAM màn hình.
D0 ÷ D7: đường dữ liệu.
CS : chọn chip.
RS (Regigter Select): chọn thanh ghi địa chỉ (=0) hay thanh ghi dữ liệu (=1).
E: xung âm kích hoạt bus dữ liệu và dùng như xung clock cho 6845 đọc / ghi dữ
liệu vào các thanh ghi bên trong.
R/ W : đọc / ghi dữ liệu vào các thanh ghi.
CLK: dùng đồng bộ với tín hiệu của màn hình và thường bằng tốc độ hiện ký tự
trên màn hình.
4.7. Chip đồng xử lý toán học 8087/80287/80387 (Mathematical co-processor)
Các bộ đồng xử lý toán 80x87 hỗ trợ CPU trong việc tính toán các biểu thức dùng
dấu chấm động như cộng, trừ, nhân, chia các số dấu chấm động, căn thức, logarit, …
Chúng cho phép xử lý các phép toán này nhanh hơn nhiều so với CPU. Thời gian xử lý
giữa 8087 và 8086 như sau (dùng xung clock 8 MHz):

Phép toán 8087 [μs] 8086 [μs]


Cộng / trừ 10.6 1000
Nhân 11.9 1000
Chia 24.4 2000
Căn bậc hai 22.5 12250
Tang 56.3 8125
Lũy thừa 62.5 10680
Lưu trữ 13.1 750

™ 8087:
8087 gồm một đơn vị điều khiển (CU – Control Unit) dùng để điều khiển bus và
một đơn vị số học (NU – Numerical Unit) để thực hiện các phép toán dấu chấm động
trong các mạch tính lũy thừa (exponent module) và mạch tính phần định trị (mantissa
module). Khác với 8086, thay vì dùng các thanh ghi rời rạc là một ngăn xếp thanh ghi.

Phạm Hùng Kim Khánh Trang 27


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

Đơn vị điều khiển nhận và giải mã lệnh, dọc và ghi các toán hạng, chạy các lệnh
điều khiển riêng của 8087. Do đó, CU có thể đồng bộ với CPU trong khi NU đang thực
hiện các công việc tính toán. CU bao gồm bộ điều khiển bus, bộ đệm dữ liệu và hàng
lệnh.

CU - Control Unit NU - Numerical Unit

Từ điều khiển Bộ điều Module lũy Module


khiển số thừa định trị
Từ trạng thái

Bus dữ liệu
Đệm dữ liệu

Từ thẻ Thanh ghi


Địa chỉ trạng thái
Điều khiển bus ngăn xếp

Hình 1.21 – Sơ đồ khối của 8087


16 8 16 8
15 AD0 AD8 7 15 AD0 AD8 7
14 AD1 AD9 6 14 AD1 AD9 6
13 AD2 AD10 5 13 AD2 AD10 5
12 AD3 AD11 4 12 AD3 AD11 4
11 AD4 AD12 3 11 AD4 AD12 3
10 AD5 AD13 2 10 AD5 AD13 2
9 AD6 AD14 39 9 AD6 AD14 39
CLK (8284) AD7 AD15 AD7 AD15
19 38 19 38
CLK A16/S3 INT (8259) CLK A16/S3
37 37
23 A17/S4 36 18 A17/S4 36
25 BUSY A18/S5 35 33 INTR A18/S5 35
24 QS0 A19/S6 17 MX A19/S6
22 QS1 26 22 NMI 26
31 READY S0 27 31 READY S0 27
33 RQ/GT0 S1 28 30 RQ/GT0 S1 28
RQ/GT1 S2 IRx (8259) RQ/GT1 S2
21 21
RST 32 23 RST 34
34 INT TEST BHE/S7 29
BHE/S7 LOCK 25
QS0 24
8087 QS1 32
RD

8086

Hình 1.22 – Sơ đồ kết nối 8087 và CPU 8086

Phạm Hùng Kim Khánh Trang 28


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

Ngăn xếp thanh ghi có tất cả 8 thanh ghi từ R0 ÷ R7, mỗi thanh ghi dài 80 bit trong
đó bit 79 là bit dấu, bit 64 ÷ 78 dùng cho số mũ và phần còn lại là phần định trị. Dữ liệu
truyền giữa các thanh ghi này được thực hiện rất nhanh do 8087 có độ rộng bus dữ liệu là
84 bit và không cần phải biến đổi định dạng.
Ngay sau khi reset PC, bộ đồng xử lý kiểm tra xem nó có được nối với PC hay
không bằng các đường BHE /S7. 8087 sẽ điều chỉnh độ dài của hàng lệnh cho phù hợp với
CPU (nếu dùng 8086 thì độ dài là 6 byte).
8087 có một thanh ghi trạng thái là thanh ghi từ thẻ (tag word) gồm các cặp bit
Tag0 ÷ Tag7 để lưu trữ các thông tin liên quan đến nội dung của các thanh ghi R0 ÷ R7
để cho phép thực hiện một số tác vụ nhanh hơn. Mỗi thanh ghi từ thẻ có 2 bit xác định 4
giá trị khác nhau của các thanh ghi Ri.
Tag = 00: xác định
Tag = 01: zero
Tag = 10: NAN, giá trị bất thường
Tag = 11: rỗng
™ 80287:
S0

S1
36 34
38 D0 A0 33
15 10 40 D1 A1 32
16 S0 CLK 13 42 D2 A2 28
S1 PCLK 44 D3 A3 27
7 4 2 23 46 D4 A4 26
X1 READY S0 S0 D0 D5 A5
8 12 1 22 48 25
X2 RESET S1 S1 D1 D6 A6
21 50 24
1 32 D2 20 37 D7 A7 23
17 ARDY 37 CLK D3 19 39 D8 A8 22
5 AYEN CLK286 D4 18 41 D9 A9 21
6 EFI 29 D5 17 43 D10 A10 20
11 F/C 31 CMD0 D6 16 45 D11 A11 19
2 RES 3 CMD1 D7 15 47 D12 A12 18
3 SRDY 39 COD/INTA D8 14 49 D13 A13 17
SYEN 38 CKM D9 12 51 D14 A14 16
34 HLDA D10 11 D15 A15 15
82284 33 NPS1 D11 8 52 A16 14
27 NPS2 D12 7 CAP A17 13
28 NPRD D13 6 31 A18 12
19 13 36 NPWR D14 5 CLK A19 11
S0 S0 D15 A20
3 82288 INTA 12 40 PEACK 54 10
S1 S1 IORC READY BUSY A21
11 35 26 53 8
18 IOWC RESET ERROR 25 64 ERROR A22 7
M/IO 8 BUSY 24 57 HOLD A23
2 MRDC 9 PEREQ 59 INTR 1
CLK MWTC 61 NMI BHE 66
15 5 80287 63 PEREQ COD/INTA 65
14 CEN/AEN ALE 16 29 READY HLDA 68
7 CENL DEN 17 RST LOCK 67
6 CMDLY DT/R 4 M/IO 6
1 MB MCE PEACK 5
READY S0 S0
4
S1 S1

80286

15 10
16 S0 CLK 13
S1 PCLK
7 4
8 X1 READY 12
X2 RESET
1
17 ARDY
5 AYEN
6 EFI
11 F/C
2 RES
3 SRDY

Hình 1.23 – Sơ đồ kết nối giữa 80286 và 80287


SYEN

82284

Phạm Hùng Kim Khánh Trang 29


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

Do 80286 có chế độ mạch bảo vệ nên mạch ghép nối giữa 80286 và 80287 được
thiết kế khác 8087 ở đơn vị điều khiển CU. Bộ đồng xử lý ở đây không thực hiện truy
xuất bộ nhớ trực tiếp. Để truy xuất được bộ nhớ, 80287 không những cần một đơc vị định
địa chỉ đơn giản của nó mà còn phải được tăng cường thêm chức năng quản lý bộ nhớ của
80286. Cấu trúc bên trong của 80287 cũng tương tự như 8087, chỉ có đơn vị bus thay đổi
cho phù hợp với 80286. Khác vơi 8087, 80287 hoạt động không đồng bộ với CPU nên có
thể dùng xung clock riêng.
™ 80387:
Ưu điểm của 80387 so với 80287 là có thể thực hiện các phép toán số học nhanh
hơn. No có bus dữ liệu 32 bit như CPU và sử dụng công nghệ CMOS nên công suất tiêu
thụ thấp hơn.

5. Bộ thanh ghi
μP 8086/8088 có tất cả 14 thanh ghi nội. Các thanh ghi này có thể phân loại như
sau:
- Thanh ghi dữ liệu (data register)
- Thanh ghi chỉ số và con trỏ (index & pointer register)
- Thanh ghi đoạn (segment register)
- Thanh ghi trạng thái và điều khiển (status & control register)
5.1. Các thanh ghi dữ liệu
Các thanh ghi dữ liệu gồm có các thanh ghi 16 bit AX, BX, CX và DX trong đó
nửa cao và nửa thấp của mỗi thanh ghi có thể định địa chỉ một cách độc lập. Các nửa
thanh ghi này (8 bit) có tên là AH và AL, BH và BL, CH và CL, DH và DL.
Các thanh ghi này được sử dụng trong các phép toán số học và logic hay trong quá
trình chuyển dữ liệu.
Bảng 2.8:

Thanh ghi Sử dụng trong


AX MUL, IMUL (toán hạng nguồn kích thước word)
DIV, IDIV (toán hạng nguồn kích thước word)
IN (nhập word)
OUT (xuất word)
CWD
Các phép toán xử lý chuỗi (string)
AL MUL, IMUL (toán hạng nguồn kích thước byte)
DIV, IDIV (toán hạng nguồn kích thước byte)
IN (nhập byte)
OUT (xuất byte)
XLAT
AAA, AAD, AAM, AAS (các phép toán ASCII)
CBW (đổi sang word)
Phạm Hùng Kim Khánh Trang 30
Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

DAA, DAS (số thập phân)


Các phép toán xử lý chuỗi (string)
AH MUL, IMUL (toán hạng nguồn kích thước byte)
DIV, IDIV (toán hạng nguồn kích thước byte)
CBW (đổi sang word)
BX XLAT
CX LOOP, LOOPE, LOOPNE
Các phép toán string với tiếp dầu ngữ REP
CL RCR, RCL, ROR, ROL (quay với số đếm byte)
SHR, SAR, SAL (dịch với số đếm byte)
DX MUL, IMUL (toán hạng nguồn kích thước word)
DIV, IDIV (toán hạng nguồn kích thước word)

AX (ACC – Accumulator): thanh ghi tích luỹ


BX (Base): thanh ghi cơ sở
CX (Count): đếm
DX (Data): thanh ghi dữ liệu
5.2. Các thanh ghi chỉ số và con trỏ
Bao gồm các thanh ghi 16 bit SP, BP, SI và DI, thường chứa các giá trị offset (độ
lệch) cho các phần tử định địa chỉ trong một phân đoạn (segment). Chúng có thể được sử
dụng trong các phép toán số học và logic. Hai thanh ghi con trỏ (SP – Stack Pointer và BP
– Base Pointer) cho phép truy xuất dễ dàng đến các phần tử đang ở trong ngăn xếp (stack)
hiện hành. Các thanh ghi chỉ số (SI – Source Index và DI – Destination Index) được dùng
để truy xuất các phần tử trong các đoạn dữ liệu và doạn thêm (extra segment). Thông
thường, các thanh ghi con trỏ liên hệ đến đoạn stack hiện hành và các thanh ghi chỉ số liên
hệ đến doạn dữ liệu hiện hành. SI và DI dùng trong các phép toán chuỗi.
5.3. Các thanh ghi đoạn
Bao gồm các thanh ghi 16 bit CS (Code segment), DS (Data segment), SS (stack
segment) và ES (extra segment), dùng để định địa chỉ vùng nhớ 1 MB bằng cách chia
thành 16 đoạn 64 KB.
Tất cả các lệnh phải ở trong đoạn mã hiện hành, được định địa chỉ thông qua thanh
ghi CS. Offset (độ lệch) của mã được xác định bằng thanh ghi IP. Dữ liệu chương trình
thường được đặt ở đoạn dữ liệu, định vị thông qua thanh ghi DS. Stack định vị thông qua
thanh ghi SS. Thanh ghi đoạn thêm có thể sử dụng để định địa chỉ các toán hạng, dữ liệu,
bộ nhớ và các phần tử khác ngoài đoạn dữ liệu và stack hiện hành.
5.4. Các thanh ghi điều khiển và trạng thái
Thanh ghi con trỏ lệnh IP (Instruction Pointer) giống như bộ đếm chương trình
(Program Counter). Thanh ghi điều khiển này do BIU quản lý nhằm lưu trữ offset từ bắt
đầu đoạn mã đến lệnh thực thi kế tiếp. Ta không thể xử lý trực tiếp trên thanh ghi IP.

Phạm Hùng Kim Khánh Trang 31


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 1

Thanh ghi cờ (Flag register) hay từ trạng thái 16 bit chứa 3 bit điều khiển (TF, IF
và DF) và 6 bit trạng thái (OF, SF, ZF, AF, PF và CF) còn các bit còn lại mà 8086/8088
không sử dụng thì không thể truy xuất được.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
X X X X OF DF IF TF SF ZF X AF X PF X CF

- OF (Overflow - tràn): OF = 1 xác định tràn số học, xảy ra khi kết quả vượt ra
ngoài phạm vi biểu diễn
- DF (Direction- hướng): xác định hướng chuyển string, DF = 1 khi μP làm việc
với string theo thứ tự từ phải sang trái.
- IF (Interrupt - ngắt): cho phép hay cấm các interrupt có mặt nạ
- TF (Trap - bẫy): đặt μP vào chế độ từng bước, dùng cho các chương trình gỡ
rối (debugger).
- SF (Sign - dấu): dùng để chỉ các kết quả số học là số dương (SF = 0) hay âm
(SF = 1).
- ZF (Zero): = 1 nếu kết quả của phép toán trước là 0.
- AF (Auxiliary – nhớ phụ): dùng trong các số thập phân để chỉ nhớ từ nửa byte
thấp hay mượn từ nửa byte cao.
- PF (Parity): PF = 1 nếu kết quả của phép toán là có tổng số bit 1 là chẵn (dùng
để kiểm tra lỗi truyền dữ liệu)
- CF (Carry): CF = 1 nếu có nhớ hay mượn từ bit cao nhất của kết quả. Cờ này
cũng dùng cho các lệnh quay.

Phạm Hùng Kim Khánh Trang 32


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 2

Chương 2
NGẮT VÀ SỰ KIỆN
1. Khái niệm
Ngắt (interrupt) là quá trình dừng chương trình chính đang chạy để ưu tiên thực hiện
một chương trình khác, chương trình này được gọi là chương trình phục vụ ngắt (ISR –
Interrupt Service Routine). ISR hoàn toàn giống với một chương trình bình thường trên máy
tính, nghĩa là nó có khả năng truy xuất đến tất cả các lệnh ngôn ngữ máy của µP. Tuy nhiên
cuối ISR sẽ kết thúc bằng lệnh IRET (Interrupt Return) để µP tiếp tục thực hiện lệnh đã kết
thúc trước đây.
Các nguyên nhân dẫn đến ngắt là:
- Bản thân chương trình đang thực hiện bị lỗi, ví dụ như: chia cho 0, …
- Do tác động của thiết bị ngoại vi, ví dụ như: thực hiện lệnh in nhưng máy in lỗi,
ghi dữ liệu vào đĩa nhưng không có đĩa, …
- Do lập trình viên chủ động gọi các ngắt có sẵn.
Một cách đơn giản, chúng ta có thể xem ngắt như là quá trình gọi chương trình con
nhưng các chương trình con này được tạo ra sẵn trong máy tính và quá trình gọi này có thể
xảy ra tại thời điểm không xác định trước.
Sự kiện (Event) là một tác động lên một đối tượng trong môi trường Windows. Khi
có một sự kiện xảy ra, Windows sẽ gởi thông điệp (message) đến đối tượng. Các sự kiện
thường xảy ra là:
- Sự kiện chuột: Click, Double Click, …
- Sự kiện bàn phím: nhấn phím, nhả phím, …
- Sự kiện cửa sổ: Activate, Load, Unload, …

2. Các loại ngắt và bảng vector ngắt


Quá trình ngắt có thể mô tả như sau:
Chương trình chính ISR

Lưu trữ các thanh ghi cần thiết

Khôi phục các thanh ghi


Quay về chương trình chính (IRET)

Hình 2.1 – Quá trình thực hiện ngắt

Phạm Hùng Kim Khánh Trang 34


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 2

Trong các quá trình ngắt, ta phân biệt thành 2 loại: ngắt cứng và ngắt mềm. Ngắt
mềm là ngắt được gọi bằng một lệnh trong chương trình ngôn ngữ máy. Ngắt mềm được
thục hiện trên hợp ngữ thông qua lệnh INT. Đối với các ngôn ngữ bậc cao hơn, vẫn cho
phép thực hiện gọi ngắt nhưng phải được biên dịch thành lệnh INT trong hợp ngữ rồi mời
thực hiện.
Khác với ngắt mềm, ngắt cứng không được khởi động bên trong máy tính mà do các
linh kiện điện tử tác đông lên hệ thống. Ngắt cứng cũng được chia thành 2 loại: ngắt che
được và ngắt không che được. Ngắt che được là ngắt có thể cho phép hay không cho phép
thực thi bằng phần mềm thông qua cờ ngắt IF (Interrupt Flag): lệnh CLI (Clear Interrupt
Flag) sẽ cấm ngắt và lệnh STI (Set Interrupt Flag) sẽ cho phép các ngắt này hoạt động.
Các loại ngắt khác nhau có thể mô tả như sau:

Ngắt

Ngắt mềm Ngắt cứng

Ngắt hệ thống Ngắt do người Trong Ngoài


sử dụng

HĐH BIOS Che được Không


che được
Hình 2.2 – Các loại ngắt

Khi thực hiện lệnh gọi một ngắt nào đó, chương trình con phục vụ cho ngắt sẽ được
gọi. Để thực hiện các ngắt tương ứng, địa chỉ thực hiện các chương trình con phục vụ ngắt
được đặt trong một bảng, gọi là bảng vector ngắt.
Bảng vector ngắt gồm có 256 phần tử, mỗi phần tử gồm 4 byte ứng với 256 ngắt (từ
ngắt 0 đến ngắt 0FFh). Mỗi phần tử trong bảng vector ngắt chứa 2 địa chỉ: địa chỉ thanh ghi
đoạn đưa vào CS và địa chỉ offset của chương trình phục vụ ngắt đưa vào IP.

Phạm Hùng Kim Khánh Trang 35


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 2

Bảng vector ngắt có thể mô tả như sau:

Địa chỉ Địa chỉ ISR Số thứ tự ngắt


0000h:0000h CS
0
0000h:0002h IP
0000h:0004h CS
1
0000h:0006h IP
0000h:0008h CS
2
0000h:000Ah IP
… … …
0000h:03FCh CS
255
0000h:03FEh IP

Khi có một quá trình ngắt xảy ra, CPU sẽ tìm địa chỉ bắt đầu của chương trình ngắt
được chứa trong bảng vector ngắt theo số thự tự ngắt. Do một phần tử trong bảng vector
ngắt chiếm 4 byte nên để tìm giá trị địa chỉ trong bảng vector ngắt, ta chỉ cần nhân số thứ tự
ngắt với 4.
Danh sách các ngắt mô tả như sau:

STT Địa chỉ Chức năng


00h 0000h – 0003h CPU: chia cho 0
01h 0004h – 0007h CPU: thực hiện từng lệnh
02h 0008h – 000Bh CPU: Lỗi RAM
03h 000Ch – 000Fh CPU: thực hiện đến điểm dừng
04h 0010h – 0013h CPU: tràn số
05h 0014h – 0017h In trang màn hình (Print Screen)
06h, 07h 0018h – 001Fh Dành riêng
08h 0020h – 0023h IRQ0: ngắt đồng hồ (18.2 lần / giây)
09h 0024h – 0027h IRQ1: ngắt bàn phím
0Ah 0028h – 002Bh IRQ2: Dành riêng
0Bh 002Ch – 002Fh IRQ3: Giao tiếp nối tiếp 1
0Ch 0030h – 0033h IRQ4: Giao tiếp nối tiếp 2
0Dh 0034h – 0037h IRQ5: Đĩa cứng

Phạm Hùng Kim Khánh Trang 36


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 2

0Eh 0038h – 003Bh IRQ6: Đĩa mềm


0Fh 003Ch – 003Fh IRQ7: Máy in
10h 0040h – 0043h BIOS: màn hình
11h 0044h – 0047h BIOS: xác định cấu hình máy tính
12h 0048h – 004Bh BIOS: xác định kích thước RAM
13h 004Ch – 004Fh BIOS: truy nhập đĩa cứng / đĩa mềm
14h 0050h – 0053h BIOS: truy nhập giao tiếp nối tiếp
15h 0054h – 0057h BIOS: truy nhập cassette hay mở rộng ngắt
16h 0058h – 005Bh BIOS: kiểm tra bàn phím
17h 005Ch – 005Fh BIOS: truy nhập máy in
18h 0060h – 0063h Chương trình xâm nhập ROM BASIC
19h 0064h – 0067h BIOS: khởi động hệ thống (khi nhấn Ctrl-Alt-Del)
1Ah 0068h – 006Bh BIOS: đọc / ghi ngày / giờ
1Bh 006Ch – 006Fh Nhấn phím Break
1Ch 0070h – 0073h Gọi sau INT 08h
1Dh 0074h – 0077h Địa chỉ bảng tham số màn hình
1Eh 0078h – 007Bh Địa chỉ bảng tham số đĩa mềm
1Fh 007Ch – 007Fh Địa chỉ bảng font có ký tự mở rộng
20h 0080h – 0083h DOS: kết thúc chương trình
21h 0084h – 0087h DOS: gọi các hàm của DOS
22h 0088h – 008Bh Địa chỉ kết thúc chương trình
23h 008Ch – 008Fh Nhấn Ctrl-Break
24h 0090h – 0093h Địa chỉ chương trình xử lý lỗi
25h 0094h – 0097h DOS: đọc đĩa mềm / đĩa cứng
26h 0098h – 009Bh DOS: ghi đĩa mềm / đĩa cứng
27h 009Ch – 009Fh DOS: kết thúc chương trình và thường trú
28h – 3Fh 00A0h – 00FFh Dành riêng cho DOS
40h 0100h – 0103h BIOS: phục vụ đĩa mềm
41h 0104h – 0107h Địa chỉ bảng tham số đĩa cứng 1
42h – 45h 0108h – 0117h Dành riêng
46h 0118h – 011Bh Địa chỉ của bảng tham số đĩa cứng 2
47h – 49h 011Ch – 0127h Dành cho user

Phạm Hùng Kim Khánh Trang 37


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 2

4Ah 0128h – 012Bh Hẹn giờ


4Bh – 67h 012Ch – 019Fh Dành cho user
68h – 6Fh 01A0h – 01BFh Không dùng
70h 01C0h – 01C3h IRQ8: đồng hồ thời gian thực
71h 01C4h – 01C7h IRQ9
72h 01C8h – 01CBh IRQ10
73h 01CCh – 01CFh IRQ11
74h 01D0h – 01D3h IRQ12
75h 01D4h – 01D7h IRQ13: từ 80x87
76h 01D8h – 01DBh IRQ14: đĩa cứng
77h 01DCh – 01DFh IRQ15
78h – 7Fh 01E0h – 01FFh Dành riêng
80h – F0h 0200h – 03C3h Dùng cho bộ thông dịch BASIC
F1h – FFh 03C4h – 03FFh Không sử dụng

3. Gọi ngắt và chặn ngắt


Quá trình gọi ngắt từ hợp ngữ đơn giản là thực hiện lệnh INT STT_ngắt sau khi nạp
các tham số cần thiết cho ngắt. Khi thực hiện lệnh gọi ngắt, CPU sẽ tìm kiếm trong bảng
vector ngắt địa chỉ của chương trình phục vụ ngắt. Người sử dụng cũng có thể xây dựng môt
chương trình cơ sở như các chương trình xử lý ngắt. Sau đó, các chương trình khác có thể
gọi ngắt ra để sử dụng. Một chương trình có thể gọi chương trình con loại này mà không cần
biết địa chỉ của nó.
Như vậy, nếu muốn thay đổi ngắt, ta có thể thay đổi nội dung trong bảng vector ngắt
để chỉ đến chương trình phục vụ do người sử dụng tự xây dựng và chương trình này sẽ được
thực hiện khi ngắt được gọi. Để làm điều này, ta chỉ cần tìm vị trí của vector ngắt tương ứng
trong bảng và thay đổi giá trị của nó. Điều này thực hiện được do bảng vector ngắt đặt trong
RAM và được nạp mỗi khi khởi động hệ thống.
Quá trình lấy và gán địa chỉ của chương trình con phục vụ ngắt có thể thực hiện
thông qua ngắt 21h bằng các hàm sau:
Hàm 35h: lấy địa chỉ của ngắt
Vào: AL = số thứ tự ngắt
Ra: ES:BX = địa chỉ của chương trình phục vụ ngắt
Hàm 25h: gán địa chỉ của một chương trình phục vụ cho một ngắt
Vào: AL = số thứ tự ngắt, DS:DX
Ra: không có

Phạm Hùng Kim Khánh Trang 38


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 2

Để thực hiện chặn một ngắt, ta cần thực hiện như sau:

Dùng hàm 35h lấy


địa chỉ của ngắt

Dùng hàm 25h gán


địa chỉ mới cho ngắt

Dùng hàm 25h khôi


phục lại địa chỉ cũ
cho ngắt

Hình 2.2 – Quá trình chặn một ngắt

Một ví dụ cho quá trình chặn ngắt như sau:

;*******************************************************************************
;*
;* LAB6-2.ASM - Assembler Laboratory ZMiTAC
*
;*
;* Sample program that converts lowercase to uppercase when key pressed
*
;*
;*******************************************************************************
.MODEL SMALL
.STACK 100h
.CODE
;*******************************************************************************
;* Variables
;*******************************************************************************
old_proc dd 0 ; address of original interrupt handler
dot_flag db 0 ; dot flag

;*******************************************************************************
;* 09h interrupt handler
;*******************************************************************************
segment_kb EQU 40h ; beggining of keyboard data segment
wsk_kb EQU 1Ch ; offset of pointer to keyboard buffer
kb_buf_begin EQU 80h ; offset of address of begining of the
buffer
kb_buf_end EQU 82h ; offset of address of end of the buffer

keys PROC FAR

;-------------------------------------------------------------------------------
; Calling of original interrupt handler
;-------------------------------------------------------------------------------

Phạm Hùng Kim Khánh Trang 39


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 2
int 60h
;-------------------------------------------------------------------------------
; Prepare registers
;-------------------------------------------------------------------------------
push ax ; push registers on the stack
push bx
push dx
push ds
mov ax,segment_kb ; address of keyboard data segment to DS
mov ds,ax

;-------------------------------------------------------------------------------
; Read the character and check ASCII code
;-------------------------------------------------------------------------------
mov bx,ds:[wsk_kb] ; actual pointer to BX
mov ax,ds:[kb_buf_begin] ; buffer beggining to AX
cmp bx,ax ; is the beggining of the buffer ?
jne mid_buf
mov bx,ds:[kb_buf_end] ; last character is at the end of the
buffer
mid_buf:
mov ax,ds:[bx-2] ; read last character

cmp al,'.' ; compare with dot


je dot_found ; if dot
cmp al,'Z' ; compare with 'Z'
ja check_lowercase ; if above check lowercase
cmp al,'A' ; compare with 'A'
jb keys_end ; end if less

mov dot_flag,0 ; uppercase - clear flag


jmp keys_end ; return

check_lowercase:
cmp al,'z' ; compare with 'z'
ja keys_end ; end if above
cmp al,'a' ; compare with 'a'
jb keys_end ; end if less
cmp dot_flag,0 ; was dot pressed?
je keys_end ; end if not

;-------------------------------------------------------------------------------
; Change lowercase to uppercase
;-------------------------------------------------------------------------------
sub al,'a'-'A' ; sub difference between cases
mov ds:[bx-2],ax
mov dot_flag,0 ; uppercase - clear flag
jmp keys_end ; return

dot_found:
mov dot_flag,1 ; set flag
jmp keys_end ; return

;-------------------------------------------------------------------------------
; Pop registers and return from interrupt
;-------------------------------------------------------------------------------
keys_end:
pop ds
pop dx
pop bx
pop ax

Phạm Hùng Kim Khánh Trang 40


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 2
iret
keys ENDP

;*******************************************************************************
;* Main program
;*******************************************************************************
;-------------------------------------------------------------------------------
; Get interrupt
;-------------------------------------------------------------------------------

start proc
mov ah,35h ; function 35h - read handler address
mov al,09h ; of interrupt 09h
int 21h
mov word ptr old_proc,bx ; store 32-bit address
mov word ptr old_proc+2,es ; of original interrupt handler
push cs
pop ds ; handler code segment to DS
mov dx,offset keys ; offset of handler address to DX
mov ah,25h ; function 25h - set new handler
mov al,09h ; of interrupt 09h
int 21h
mov dx,word ptr old_proc+2
mov ds,dx
mov dx,word ptr old_proc
mov ah,25h ; function 25h - set new adress
mov al,60h ; of original interrupt handler
int 21h ; 60h instead of 09h

;-------------------------------------------------------------------------------
; Main loop
;-------------------------------------------------------------------------------
looping:mov ah,08h ; function 08h - read character
int 21h ; ASCII code is returned in AL
cmp al,1Bh ; ESC
je ending ; if ESC end of the loop
mov dl,al ; not ESC - move char to DL
mov ah,02h ; function 02h - display character
int 21h ; ASCII code of char in DL
jmp looping

;-------------------------------------------------------------------------
ending: mov dx,word ptr old_proc+2
mov ds,dx
mov dx,word ptr old_proc
mov ah,25h ; function 25h - set old handler
mov al,09h ; of interrupt 09h
int 21h

mov ah,4Ch ; end of the program


int 21h
start endp
END start

4. Tạo và bắt các sự kiện


Trong hệ điều hành Windows, hook (câu móc) là cơ chế cho phép một hàm chặn một
sự kiện (thông điệp, chuột, phím nhấn) trước khi đưa đến đối tượng cần xử lý. Hàm này cho
phép thay đổi hoặc thậm chí cấm sự kiện xảy ra. Chúng được gọi là hàm lọc (filter) và được

Phạm Hùng Kim Khánh Trang 41


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 2

phân loại dựa theo loại sự kiện bị chặn. Để gọi được hàm lọc, ta cần phải thực hiện quá trình
gắn (attach) vào quá trình câu móc (như câu móc bàn phím). Việc gắn một hay nhiều hàm
lọc vào một quá trình câu móc được gọi là thiết lập (setting) một quá trình câu móc.
Nếu một quá trình câu móc có nhiều hơn một hàm lọc, Windows sẽ duy trì một chuỗi
các hàm lọc trong đó hàm được cài đặt vào gần nhất sẽ nằm ở đầu chuỗi và hàm cài đặt lâu
nhất sẽ nằm ở cuối chuỗi. Nếu sự kiện xảy ra làm khởi động quá trình câu móc, Windows sẽ
gọi hàm lọc đầu tiên trong chuỗi. Quá trình câu móc vào một sự kiện được sử dụng bằng
hàm SetWindowsHookEx và hàm UnhookWindowsHookEx dùng để xóa bỏ hàm lọc khỏi
quá trình.
Cơ chế câu móc cung cấp các khả năng mạnh mẽ cho một ứng dụng Windows. Các
ứng dụng này có thể dùng quá trình câu móc để:
- Xử lý và thay đổi các thông điệp gởi đến các dialog box, message box, scroll bar
và menu của một ứng dụng (WH_MSGFILTER).
- Xử lý và thay đổi các thông điệp gởi đến các dialog box, message box, scroll bar
và menu của hệ thống (WH_SYSMSGFILTER).
- Xử lý và thay đổi các thông điệp của hệ thống bất cứ khi nào hàm GetMessage
hay PeekMessage được gọi (WH_GETMESSAGE).
- Xử lý và thay đổi các thông điệp của hệ thống bất cứ khi nào hàm SendMessage
được gọi (WH_CALLWNDPROC).
- Ghi hay thực hiện lại các sự kiện bàn phím và chuột (WH_JOURNALRECORD,
WH_JOURNALPLAYBACK).
- Xử lý, sửa đổi hay cấm sự kiện chuột (WH_MOUSE).
- Xử lý, sửa đổi hay cấm sự kiện bàn phím (WH_KEYBOARD).
- Đáp ứng với các hoạt động nào đó của hệ thống, có khả năng phát triển CBT
(computer-based training) cho ứng dụng (WH_CBT).
- Cấm các hàm lọc khác (WH_DEBUG).
Các ứng dụng thường dùng quá trình câu móc để:
- Dùng phím F1 để hỗ trợ cho menu, dialog box và message box
(WH_MSGFILTER).
- Lưu lại quá trình thực hiện khi nhấn phím hay chuột (thường dùng cho macro). Ví
dụ như Windows Recorder sử dụng hook để hỗ trợ chức năng record và playback
(WH_JOURNALRECORD, WH_JOURNALPLAYBACK).
- Quản lý thông điệp để xác nhận thông điệp được gởi tới cửa sổ hay được tạo ra
(WH_GETMESAGE, WH_CALLWNDPROC).
- Mô phỏng ngõ vào chuột và bàn phím (WH_JOURNALPLAYBACK). Quá trình
câu móc là phương pháp tin cậy để thực hiện hoạt động này. Nếu ta thực hiện mô
phỏng bằng cách gởi thông điệp, Windows sẽ không thực hiện cập nhật trạng thái
của bàn phím hay chuột dẫn đến các hoạt động không mong muốn. Nếu quá trình
câu móc thực hiện điều này, nó sẽ được xử lý giống như sự kiện chuột hay bàn

Phạm Hùng Kim Khánh Trang 42


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 2

phím xảy ra. Ví dụ như Microsoft Excel dùng hook để thực hiện macro
SENDKEYS.
- Cung cấp khả năng CBT cho ứng dụng thực hiện trên môi trường Windows
(WH_CBT) làm cho quá trình phát triển ứng dụng CBT dễ dàng hơn.
Phạm vi sử dụng: Một trong những đặc trưng của Win32 Hook là cho phép chỉ định
quá trình câu móc là hệ thống hay ở dạng luồng (thread). Hook hệ thống cho phép tác động
đến các cửa sổ khác trong hệ thống còn hook luồng chỉ cho phép tác động đến cửa sổ hiện
hành.
Cách thức sử dụng quá trình câu móc:
Để sử dụng quá trình câu móc, ta cần phải biết:
- Làm thế nào dùng hàm câu móc của Windows để thêm vào hay xóa bỏ một hàm
lọc trong chuỗi hàm xử lý của một quá trình câu móc.
- Cần phải thực hiện các hoạt động gì để cài đặt một hàm lọc.
- Có thể thực hiện được hàm câu móc nào và chúng có thể làm được gì, gởi những
thông tin nào.

4.1. Hàm câu móc của Windows


Các ứng dụng trên nền Windows sử dụng các hàm SetWindowsHookEx,
UnhookWindowsHookEx và CallNextHookEx để quản lý chuỗi hàm lọc trong một quá
trình câu móc. Trước phiên bản 3.1, Windows thực hiện quản lý bằng các hàm
SetWindowsHook, UnhookWindowsHook và DefHookProc. Mặc dù các hàm này cũng
có khả năng thực hiện được trên nền Win32 nhưng sẽ có một số đặc trưng không sử dụng
được như các phiên bản mới (Ex).

4.1.1. Hàm SetWindowsHookEx


Dùng để thêm một hàm lọc vào một quá trình câu móc.
Khai báo:
Public Declare Function SetWindowsHook Lib "user32"
Alias "SetWindowsHookA" (ByVal nFilterType As Long, ByVal
pfnFilterProc As Long) As Long
Public Declare Function SetWindowsHookEx Lib "user32"
Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn
As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As
Long
Hàm SetWindowsHookEx gồm có 4 tham số:
- idHook: xác định loại hàm câu móc sẽ cài đặt. Thông số này gồm các giá trị sau:
WH_KEYBOARD: cài đặt hàm câu móc quản lý thông điệp gởi đi khi nhấn phím
(ngoại trừ tổ hợp Ctrl – Alt – Del).
WH_MOUSE: cài đặt hàm câu móc quản lý thông điệp khi điều khiển chuột.
WH_CALLWNDPROC: cài đặt hàm câu móc quản lý thông điệp trước khi hệ thống
gởi đến cửa sổ, chỉ cho phép xử lý thông điệp mà không được thay đổi thông điệp.

Phạm Hùng Kim Khánh Trang 43


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 2

WH_CALLWNDPROCRET: cài đặt hàm câu móc quản lý thông điệp sau khi cửa sổ
đã xử lý. Loại này cho phép thay đổi giá trị trả về của thông điệp.
WH_MSGFILTER: cài đặt hàm câu móc quản lý các thông điệp được tạo ra giống
như có một sự kiện của dialog box, message box, menu hay scroll bar.
WH_GETMESSAGE: cài đặt hàm câu móc quản lý các thông điệp được gởi tới hàng
đợi.
WH_CBT: cài đặt hàm câu móc để nhận thông báo từ ứng dụng CBT.
WH_DEBUG: cài đặt hàm câu móc để gỡ rối một hàm câu móc khác.
WH_FOREGROUNDIDLE: cài đặt hàm câu móc trong đó hàm này được gọi khi
luồng (thread) foreground của ứng dụng rảnh (idle). Quá trình này thường sử dụng để thực
thi các tác vụ có độ ưu tiên thấp khi luồng ưu tiên rảnh.
WH_JOURNALPLAYBACK: cài đặt hàm câu móc để gởi các thông điệp đã được
lưu bằng hàm câu móc WH_JOURNALRECORD.
WH_JOURNALRECORD: cài đặt hàm câu móc lưu lại các thông điệp đã gởi đến
hàng đợi.
WH_KEYBOARD_LL: cài đặt hàm câu móc quản lý sự kiện bàn phím ở mức thấp
(dùng cho Windows NT/2000/XP).
WH_MOUSE_LL: cài đặt hàm câu móc quản lý sự kiện chuột ở mức thấp (dùng cho
Windows NT/2000/XP).
WH_SHELL: cài đặt hàm câu móc cho một ứng dụng shell.
WH_SYSMSGFILTER: cài đặt hàm câu móc quản lý các thông điệp được tạo ra
giống như có một sự kiện của dialog box, message box, menu hay scroll bar. Hàm này quản
lý cho tất cả ứng dụng trong cùng một desktop.
- lpfn:
Con trỏ chỉ đến địa chỉ của hàm lọc. Nếu tham số dwThreadId = 0 hay chỉ đến một
luồng được tạo bởi một tiến trình (process) khác, tham số lpfn phải chỉ đến một hàm câu
móc trong một thư viện liên kết động (DLL). Ngược lại, lpfn chỉ đến hàm câu móc chứa
trong bản thân tiến trình hiện hành.
- hMod:
handle chỉ đến DLL chứa hàm xử lý xác định bằng tham số lpfn. Tham số hMod phải
đặt là NULL nếu hàm câu móc nằm trong tiến trình hiện hành
- dwThreadId:
Xác định ID của luồng thực hiện quá trình câu móc. Nếu dwThreadId = 0, hàm câu
móc sẽ tác động đến tất cả các luồng. Ứng dụng có thể dùng hàm GetCurrentThreadId để
xác định ID của luồng hiện hành.

Phạm Hùng Kim Khánh Trang 44


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 2

Phạm vi thực hiện của hàm câu móc mô tả như sau:

Hook Phạm vi

WH_CALLWNDPROC Luồng hay hệ thống

WH_CBT Luồng hay hệ thống

WH_DEBUG Luồng hay hệ thống

WH_GETMESSAGE Luồng hay hệ thống

WH_JOURNALRECORD Hệ thống

WH_JOURNALPLAYBACK Hệ thống

WH_FOREGROUNDIDLE Luồng hay hệ thống

WH_SHELL Luồng hay hệ thống

WH_KEYBOARD Luồng hay hệ thống

WH_MOUSE Luồng hay hệ thống

WH_MSGFILTER Luồng hay hệ thống

WH_SYSMSGFILTER Hệ thống

Hàm SetWindowsHookEx trả về handle của quá trình câu móc đã cài đặt và trả về
NULL nếu quá trình cài đặt không thành công. Handle này được dùng để xóa quá trình câu
móc khi sử dụng hàm UnhookWindowsHookEx. Các thông báo lỗi khi quá trình câu móc
không thành công là:
- ERROR_INVALID_HOOK_FILTER: mã câu móc sai
- ERROR_INVALID_FILTER_PROC: hàm lọc sai
- ERROR_HOOK_NEEDS_HMOD: một quá trình câu móc toàn cục sử dụng tham
số hMod = NULL hay chỉ đến một luồng không tồn tại.
- ERROR_GLOBAL_ONLY_HOOK: một quá trình câu móc chỉ dùng được cho
hệ thống nhưng được cài đặt cho một luồng xác định.
- ERROR_INVALID_PARAMETER: ID của luồng sai.
- ERROR_JOURNAL_HOOK_SET: Cài đặt thêm một quá trình câu móc dạng
nhật ký (WH_JOURNALRECORD và WH_JOURNALPLAYBACK) trong khi
một quá trình dạng này đang tồn tại (tại một thời điểm chỉ cho phép một quá trình
dạng nhật ký).
- ERROR_MOD_NOT_FOUND: Tham số hMod chỉ đến một hàm không xác định
được.
- Khác: không cho phép do bảo mật của hệ thống hay bộ nhớ tràn.

Phạm Hùng Kim Khánh Trang 45


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 2

4.1.2. Hàm UnhookWindowsHookEx:


Dùng để xoá một hàm lọc ra khỏi chuỗi xử lý một quá trình câu móc. Hàm này lấy
handle của quá trình câu móc trả về từ lệnh gọi hàm SetWindowsHookEx và luôn trả về giá
trị TRUE.
Khai báo:
Public Declare Function UnhookWindowsHook Lib "user32"
Alias "UnhookWindowsHook" (ByVal nCode As Long, ByVal
pfnFilterProc As Long) As Long
Public Declare Function UnhookWindowsHookEx Lib
"user32" Alias "UnhookWindowsHookEx" (ByVal hHook As Long)
As Long

4.1.3. Hàm CallNextHookEx:


Dùng để chuyển thông tin câu móc đến hàm câu móc kế tiếp trong chuỗi xử lý.
Declare Function CallNextHookEx Lib "user32" (ByVal hHook
As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As
Any) As Long
- hHook: handle của quá trình câu móc, là giá trị trả về từ lệnh gọi hàm
SetWindowsHookEx. Thông thường Windows bỏ qua giá trị này.
- nCode: mã của quá trình câu móc, hàm câu móc dùng mã này để xác định
phương pháp xử lý thông tin.
- wParam: xác định tham số được xử lý bởi hàm câu móc.
- lParam: giống như wParam.
Khi một quá trình câu móc khởi động, Windows gọi hàm đầu tiên trong chuỗi hàm
lọc và kết thúc quản lý quá trình, các hàm lọc phía sau sẽ không xử lý. Để thực hiện các
hàm ở phía sau trong chuỗi hàm, Windows cung cấp hàm CallNextHookEx cho phép gọi
một hàm kế tiếp trong chuỗi hàm lọc. Như vậy, nếu một hàm lọc nào đó không thực hiện
hàm CallNextHookEx thì các hàm lọc ở phía sau sẽ không thực hiện.
Một ví dụ sử dụng các hàm xử lý câu móc như sau:
'Ch•a trong m•t file module
Public Const WH_KEYBOARD = 2
Public Const VK_SHIFT = &H10
Public Const VK_CONTROL = &H11
Public Const VK_MENU = &H12
Declare Function CallNextHookEx Lib "user32" (ByVal hHook
As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As
Any) As Long
Declare Function GetKeyState Lib "user32" (ByVal nVirtKey
As Long) As Integer ‘Xác ••nh tr•ng thái c•a m•t phím (Bit15)

Phạm Hùng Kim Khánh Trang 46


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 2

Declare Function SetWindowsHookEx Lib "user32" Alias


"SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As
Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Declare Function UnhookWindowsHookEx Lib "user32" (ByVal
hHook As Long) As Long
Public hHook As Long
Public Function KeyboardProc(ByVal idHook As Long, ByVal
wParam As Long, ByVal lParam As Long) As Long
If idHook < 0 Then
'G•i hàm x• lý k• ti•p
KeyboardProc = CallNextHookEx(hHook, idHook, wParam,
ByVal lParam)
Else
'N•u nh•n Shift-C
If (GetKeyState(VK_SHIFT) And &H8000) And wParam =
Asc("C") Then
'thì hi•n th• k•t qu•
Form1.Print "Shift-C pressed ..."
End If
If (GetKeyState(VK_CONTROL) And &H8000) And wParam =
Asc("C") Then
Form1.Print "Ctrl-C pressed ..."
End If
If (GetKeyState(VK_MENU) And &H8000) And wParam =
Asc("C") Then
Form1.Print "Alt-C pressed ..."
End If
'G•i hàm x• lý k• ti•p
KeyboardProc = CallNextHookEx(hHook, idHook, wParam,
ByVal lParam)
End If
End Function
-----------------------------------------------
'Ch•a trong form
Private Sub Form_Load()
'••t quá trình câu móc
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf
KeyboardProc, App.hInstance, App.ThreadID)
End Sub
Private Sub Form_Unload(Cancel As Integer)

Phạm Hùng Kim Khánh Trang 47


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 2

'Xoá quá trình câu móc


UnhookWindowsHookEx hHook
End Sub

4.2. Hàm lọc


Hàm lọc thường có dạng như sau:
Function FilterFunc (ByVal nCode As Integer, ByVal wParam
As Long, ByVal lParam As Long)
Hàm lọc nhận 3 tham số:
- nCode: mã của quá trình câu móc, là một số nguyên xác định hàm lọc, ví dụ như
loại sự kiện làm khởi động quá trình câu móc. Mã này được xác định khi hàm lọc
xử lý sự kiện hay gọi hàm DefHookProc. Nếu mã câu móc < 0 thì hàm lọc sẽ
không xử lý sự kiện mà sẽ gọi hàm DefHookProc để truyền 3 tham số còn lại cho
hàm lọc kế tiếp trong chuỗi hàm lọc bằng hàm CallNextHookEx.
- Tham số thứ hai wParam và thứ ba lParam chứa các thông tin cần thiết cho hàm
lọc. Mỗi quá trình câu móc dùng các giá trị wParam và lParam khác nhau. Ví dụ
như, quá trình câu móc bàn phím WH_KEYBOARD chứa mã phím nhấn trong
wParam và trạng thái bàn phím trong lParam. Hay quá trình câu móc
WH_MSGFILTER chứa giá trị NULL trong wParam và một con trỏ chỉ đến
thông điệp chứa trong lParam.
Hàm lọc dùng trong DLL:
Đối với các quá trình câu móc cục bộ, hàm lọc có thể đặt ngay trong mã lệnh của ứng
dụng nhưng đối với các quá trình câu móc hệ thống, hàm lọc phải được đặt trong một DLL.
Chỉ có quá trình câu móc dạng nhật ký (WH_JOURNALRECORD và
WH_JOURNALPLAYBACK) là ngoại lệ. Hàm lọc của quá trình câu móc hệ thống phải
chia sẻ dữ liệu cho tiến trình thực hiện quá trình câu móc. Các biến toàn cục sử dụng trong
DLL phải được xác định rõ hay phải đặt trong vùng dữ liệu chia sẻ.

Phạm Hùng Kim Khánh Trang 48


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

Chương 3
GIAO TIẾP THIẾT BỊ CHUẨN
1. Giao tiếp bàn phím
1.1. Nguyên lý hoạt động

Keyboard

Keyboard Interface

IRQ1 Y- Decoder
IRQ Logic

D0
Serial 11 bits SDU
D1 Interface
D2 (PC/XT)

Keyboard chip

X - Decoder
D3 or Scan
Keyboard Matrix
D4 Controller
D5 8042/8741/8742 Keyboard cable
(AT ect)
D6 Scan
Enable
D7

Hình 3.1 - Sơ đồ nguyên lý và các ghép nối của bàn phím

Chip xử lý bàn phím liên tục kiểm tra trạng thái của ma trận quét (scan matrix) để
xác định công tắc tại các tọa độ X, Y đang được đóng hay mở và ghi một mã tương ứng vào
bộ đệm bên trong bàn phím. Sau đó mã này sẽ được truyền nối tiếp tới mạch ghép nối bàn
phím trong PC. Cấu trúc của SDU (Serial Data Unit) cho việc truyền số liệu:
0 10
STRT DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 PAR STOP

STRT: bit start (luôn bằng 0)


DB0 - DB7: bit số liệu từ 0 đến 7.
PAR: bit parity (luôn lẻ)
STOP: bit stop (luôn bằng 1).

Phạm Hùng Kim Khánh Trang 49


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

Chân 1: clock
Chân 2: dữ liệu
Chân 3: Reset
Chân 4: GND
Chân 5: Vcc

Hình 3.2 – Đầu cắm bàn phím AT

Chân 1: dữ liệu
Chân 2: không dùng
Chân 3: GND
Chân 4: Vcc
Chân 5: clock
Chân 6: không dùng

Hình 3.3 – Đầu cắm bàn phím PS/2

Mỗi phím nhấn sẽ được gán cho 1 mã quét (scan code) gồm 1 byte. Nếu 1 phím được
nhấn thì bàn phím phát ra 1 mã make code tương ứng với mã quét truyền tới mạch ghép nối
bàn phím của PC. Ngắt cứng INT 09h được phát ra qua IRQ1.
Chương trình xử lý ngắt sẽ xử lý mã này tuỳ theo phím SHIFT có được nhấn hay
không. Ví dụ: nhấn phím SHIFT trước, không rời tay và sau đó nhấn ‘C’:
make code được truyền - 42(SHIFT) - 46 (‘C’).
Nếu rời tay nhấn phím SHIFT thì bàn phím sẽ phát ra break code và mã này được
truyền như make code. Mã này giống như mã quét nhưng bit 7 được đặt lên 1, do vậy nó
tương đương với make code cộng với 128. Tuỳ theo break code, chương trình con xử lý
ngắt sẽ xác định trạng thái nhấn hay rời của các phím. Thí dụ, phím SHIFT và ‘C’ được rời
theo thứ tự ngược lại với thí dụ trên:
break code được truyền 174 ( bằng 46 cộng 128 tương ứng với ‘C’) và 170
(bằng 42 cộng 128 tương ứng với SHIFT).
Phần cứng và phần mềm xử lý bàn phím còn giải quyết các vấn đề vật lý sau:
- Nhấn và nhả phím nhưng không được phát hiện.

Phạm Hùng Kim Khánh Trang 50


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

- Khử nhiễu rung cơ khí và phân biệt 1 phím được nhấn nhiều lần hay được
nhấn chỉ 1 lần nhưng được giữ trong một khoảng thời gian dài.

1.2. Lập trình giao tiếp qua các cổng


Bàn phím cũng là một thiết bị ngoại vi nên về nguyên tắc có thể truy xuất nó qua các
cổng vào ra.
™ Các thanh ghi và các port:
Sử dụng 2 địa chỉ port 60h và 64h có thể truy xuất bộ đệm vào, bộ đệm ra và thanh
ghi điều khiển của bàn phím.

Port Thanh ghi R/W


60h Đệm ngõ ra R
60h Đệm ngõ vào W
64h Thanh ghi điều khiển W
64h Thanh ghi trạng thái R

Thanh ghi trạng thái xác định trạng thái hiện tại của bộ điều khiển bàn phím. Thanh
ghi này chỉ đọc (read only) và đọc bằng lệnh IN tại port 64h.
7 0
PARE TIM AUXB KEYL C/D SYSF INPB OUTB

PARE: Lỗi chẵn lẻ của byte cuối cùng được vào từ bàn phím; 1 = có lỗi chẵn lẻ, 0
= không có.
TIM: Lỗi quá thời gian (time-out); 1 = có lỗi, 0 = không có.
AUXB: Đệm ra cho thiết bị phụ (chỉ có ở máy PS/2); 1 = giữ số liệu cho thiết bị,
0 = giữ số liệu cho bàn phím.
KEYL: Trạng thái khóa bàn phím; 1 = không khóa, 0 = khóa.
C/D: Lệnh/dữ liệu; 1 = Ghi qua port 64h, 0 = Ghi qua port 60h.
SYSF: cờ hệ thống; 1 = tự kiểm tra thành công, 0 = reset khi cấp điện
INPB: Trạng thái đệm vào; 1 = dữ liệu CPU trong bộ đệm vào, 0 = đệm vào rỗng.
OUTB: Trạng thái đệm ra; 1 = dữ liệu bộ điều khiển bàn phím trong bộ đệm ra, 0
= đệm ra rỗng.

Thanh ghi điều khiển


Các lệnh cho bộ điều khiển bàn phím:
Mã Mô tả
A7h Cấm thiết bị phụ
A8h Cho phép thiết bị phụ
A9h Kiểm tra giao tiếp thiết bị phụ và lưu mã kiểm tra vào bộ đệm ra
00h: không lỗi
01h: CLK ở mức thấp
02h: CLK ở mức cao
03h: DATA ở mức thấp

Phạm Hùng Kim Khánh Trang 51


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

04h: DATA ở mức cao


FFh: lỗi khác
AAh Tự kiểm tra (ghi 55h vào bộ đệm ra nếu không lỗi
ABh Kiểm tra giao tiếp bàn phím và lưu mã kiểm tra vào bộ đệm ra
ADh Cấm bàn phím
AEh Cho phép bàn phím
C0h Đọc cổng vào và truyền dữ liệu đến bộ đệm ra
C1h Đọc các bit 3 – 0 của cổng vào và truyền đến các bit 3- 0 của thanh ghi trạng thái
cho đến khi INPB = 1
C2h Đọc các bit 7 – 4 của cổng vào và truyền đến các bit 7- 4 của thanh ghi trạng thái
cho đến khi INPB = 1
D0h Đọc cổng ra
D1h Ghi cổng ra
D2h Ghi vào bộ đệm ra và xoá AUXB
D3h Ghi vào bộ đệm ra và set AUXB
D4h Ghi byte dữ liệu tiếp theo vào thiết bị phụ

Khóa bàn phím:


Start:
IN AL, 64h ; đọc byte trạng thái
TEST AL, 02h ; kiểm tra bộ đệm có đầy hay không
JNZ start
OUT 64h, 0ADh ; khóa bàn phím

Keyboard Controller
Buffer
Input

60h
Keyboard
Output
Port
Output
Buffer
PC System Bus

60h
Register
Control

64h
PS/2 only
Input
Port
Register
Status

64h

Hình 3.4 - Bộ điều khiển bàn phím

Phạm Hùng Kim Khánh Trang 52


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

™ Các lệnh cho bàn phím:

Mã Lệnh Mô tả
EDh Bật/tắt LED Bật/tắt các đèn led của bàn phím
EEh Echo Trả về byte EEh
F0h Đặt/nhận dạng mã quét Đặt 1 trong 3 tập mã quét và nhận diện các mã quét
tập mã quét hiện tại.
F2h Nhận diện bàn phím Nhận diện ACK = AT, ACK+abh+41h=MF II.
F3h Đặt tốc độ lặp lại/trễ Đặt tốc độ lặp lại và thời gian trễ của bàn phím
F4h Enable Cho phép bàn phím hoạt động
F5h Chuẩn/không cho phép Đặt giá trị chuẩn và cấm bàn phím.
F6h Chuẩn/cho phép Đặt giá trị chuẩn và cho phép bàn phím.
FEh Resend Bàn phím truyền ký tự cuối cùng một lần nữa tới bộ
điều khiển bàn phím
FFh Reset Chạy reset bên trong bàn phím

Thí dụ: lệnh bật đèn led cho phím NUMCLOCK, tắt tất cả các đèn khác.
MOV AL,0EDh
OUT 60H, AL
WAIT:
IN AL, 64H ; đọc thanh ghi trạng thái
JNZ WAIT
MOV AL,02h
OUT 60H, AL ; bật đèn cho numclock

Cấu trúc của byte chỉ thị như sau:


7 2 1 0
0 0 0 0 0 CPL NUM SCR
CPL: 1 = bật đèn Caps Lock; 0 = tắt
NUM: 1 = bật đèn Num Lock; 0 = tắt
SCR: 1 = bật đèn Scroll Lock; 0 = tắt

1.3. Lập trình giao tiếp qua các hàm của DOS, BIOS
BIOS ghi các ký tự do việc nhấn các phím vào bộ đệm tạm thời được gọi là bộ đệm
bàn phím (keyboard buffer), có địa chỉ 40h:1Eh, gồm 32 byte và kết thúc ở địa chỉ 40h:3Dh.
Mỗi ký tự được lưu trữ bằng 2 byte, byte cao là mã quét, và byte thấp là mã ASCII. Chương
trình xử lý ngắt sẽ xác định mã ASCII từ mã quét bằng bảng biến đổi và ghi cả 2 mã vào bộ
đệm bàn phím. Bộ đệm bàn phím được tổ chức như bộ đệm vòng (ring buffer) và được quản
lý bởi 2 con trỏ. Các giá trị con trỏ được lưu trữ trong vùng dữ liệu của BIOS ở địa chỉ
40h:1Ah và 40h:1Ch. Con trỏ ghi (40h:1Ch) cho biết vị trí còn trống kế tiếp để ghi ký tự
nhập, con trỏ đọc (40h:1Ah) cho biết vị trí ký tự đầu tiên sẽ đọc. Từ đó, bộ đệm bàn phím
rỗng khi con trỏ ghi và con trỏ đọc trùng nhau Æ bộ đệm chỉ chứa được 15 ký tự.

Phạm Hùng Kim Khánh Trang 53


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

Các hàm của ngắt 16h:


Hàm 0h - đọc ký tự từ bàn phím, nếu không nhấn thì sẽ chờ
Ra: AH = scancode, AL = mã ASCII. Nếu phím nhấn là các phím đặc biệt thì AL = 0
Hàm 1h - ZF = 1 nếu không có ký tự trong bộ đệm. Giá trị trả về giống như hàm
00h nhưng không xoá ký tự ra khỏi bộ đệm
Hàm 2h - Trả về trạng thái của các phím, kết quả chứa trong AL

7 6 5 4 3 2 1 0
INS CAPS NUM SCROLL ALT CTRL LEFT RIGHT
LOCK LOCK LOCK SHIFT SHIFT

Hàm 10h - Giống hàm 00h nhưng trả về mã mở rộng


Hàm 11h - Giống hàm 01h nhưng trả về mã mở rộng
Hàm 12h - Giống hàm 02h nhưng AH chứa thêm các thông tin
7 6 5 4 3 2 1 0
SYS CAPS NUM SCROLL RIGHT RIGHT LEFT LEFT
REQ LOCK LOCK LOCK ALT CTRL ALT CTRL

Các thí dụ:


- Giả sử phím ‘c’ đã được nhấn.
MOV AH,00h
INT 16h
Kết quả: AH = 2Eh (mã quét cho phím ‘a’); AL = 63h (ASCII cho ‘c’)
- Giả sử phím ‘HOME’ đã được nhấn.
MOV AH,00h
INT 16h
Kết quả: AH = 47h ( mã quét cho phím ‘HOME’)
AL = 0 (các phím chức năng và điều khiển không có mã ASCII)
- Giả sử phím ‘HOME’ đã được nhấn.
MOV AH,10h
INT 16h
Kết quả: AH = 47h (mã quét cho phím ‘HOME’)
AL = E0h

Phạm Hùng Kim Khánh Trang 54


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

2. Giao tiếp chuột


2.1. Cấu tạo
Cấu tạo của chuột rất đơn giản, phần trung tâm là 1 viên bi thép được phủ keo hoặc
nhựa được quay khi dịch chuyển chuột. Chuyển động này được truyền tới 2 thanh nhỏ được
đặt vuông góc với nhau. Các thanh này sẽ biến chuyển động của chuột theo 2 hướng X,Y
thành sự quay tưong ứng của 2 đĩa gắn với chúng. Trên 2 đĩa có những lỗ nhỏ liên tục đóng
và ngắt 2 chùm sáng tới các sensor nhạy sáng để tạo ra các xung điện. Số các xung điện tỷ lệ
với lượng chuyển động của chuột theo các hướng X,Y và số xung trên 1 sec biểu hiện tốc
độ của chuyển động chuột. Kèm theo đó có 2 hay 3 phím bấm.
Te bao nhay sang

Nguon sang
Truc lan
Y
Vien bi

Di cong COM

Bo khuech dai

Hình 3.5 - Sơ đồ cấu tạo của chuột

2.2. Mạch ghép nối và chương trình điều khiển chuột


Hầu hết chuột được nối với PC qua cổng nối tiếp, qua đó chuột cũng được cấp nguồn
nuôi từ PC. Khi dịch chuyển hoặc nhấn, nhả các phím chuột, nó sẽ phát ra một gói dữ liệu
tới mạch giao tiếp và mạch sẽ phát ra 1 ngắt. Phần mềm điều khiển chuột làm các nhiệm vụ:
chuyển ngắt tới mạch giao tiếp nối tiếp xác định, đọc dữ liệu và cập nhật các giá trị bên
trong liên quan tới trạng thái của bàn phím cũng như vị trí của chuột. Hơn nữa, nó còn cung
cấp 1 giao tiếp mềm qua ngắt 33h để định các giá trị bên trong này cũng như làm dịch
chuyển con trỏ chuột trên màn hình tương ứng với vị trí của chuột.
Có thể chọn kiểu con trỏ chuột cứng hoặc mềm trong chế độ văn bản hay con trỏ
chuột đồ hoạ trong chế độ đồ họa. Các hàm 09h và 0Ah trong ngắt 33h cho phép định nghĩa
loại và dạng con trỏ chuột.

Phạm Hùng Kim Khánh Trang 55


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

2.3. Chương trình với con trỏ


Ngắt 33h cho phép xác định vị trí, số lần click chuột và hình dạng con trỏ (số thứ tự
hàm chứa trong AX).

Hàm Ý nghĩa Tham số


Ra: AX = 0: nếu có, = 1: không
0 Reset chuột
BX = số nút nhấn
1 Hiển thị con trỏ
2 Ẩn con trỏ
Ra: BX: trạng thái nút
(D0: nút trái, D1: nút phải, D2: nút giữa)
3 Nhận vị trí con trỏ và trạng thái nút (= 0: nhả, = 1: nhấn)
CX: vị trí ngang
DX: vị trí dọc
Vào: CX: vị trí ngang
4 Đặt vị trí con trỏ
DX: vị trí dọc
Vào: BX = nút kiểm tra
(=0: trái, =1: phải)
Ra: AX = trạng thái nút
5 Trạng thái nút và số lần nhấn từ khi gọi
BX = số lần nhấn
CX: vị trí ngang
DX: vị trí dọc lần nhấn cuối
6 Giống hàm 05h nhưng kiểm tra số lấn nhả
Vào: CX = cột trái
7 Giới hạn dịch chuyển ngang của con trỏ
DX = cột phải
Vào: CX = dòng dưới
8 Giới hạn dịch chuyển dọc của con trỏ
DX = dòng trên
Vào: BX = vị trí ngang
9 Xác định hình dạng con trỏ đồ hoạ CX = vị trí dọc
ES:DX: địa chỉ mặt nạ màn hình và con trỏ
Vào: BX = 0: con trỏ phần mềm
CX = mặt nạ màn hình
DX = mặt nạ con trỏ
A Xác định hình dạng con trỏ văn bản
BX = 1: con trỏ phần cứng
CX = dòng bắt đầu
DX = dòng kết thúc

Chú ý rằng toạ độ con trỏ xác định theo pixel với độ phân giải 640x200 trong khi chế
độ văn bản sử dụng toạ độ ký tự 80x25 nên để chuyển sang toạ độ ký tự thì phải chia cho 8.
Con trỏ chuột hiển thị trên màn hình đồ hoạ bằng cách thực hiện:
Từ mới = (từ cũ AND mặt nạ màn hình) XOR mặt nạ con trỏ
Nếu ta đặt mặt nạ màn hình là 0 thì ký tự màn hình tại đó sẽ bị xoá.

Phạm Hùng Kim Khánh Trang 56


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

VD: Con trỏ chuột mềm nhấp nháy và chứa ký tự ‘A’


MOV AH,0Ah
MOV BX,0
MOV CX,0 ; m•t n• màn hình = 0
MOV DH,8Bh; = 10001011b Æ màu n•n Gray, màu ký t• Cyan
MOV DL,’A’
INT 33h
VD: Con trỏ chuột cứng có các đường quét 3 và 8
MOV AH,0Ah
MOV BX,1
MOV CX,03h
MOV DX,08h
INT 33h

3. Giao tiếp màn hình


3.1. Card màn hình
Để hiện các hình ảnh, ký tự, hay hình vẽ trên màn hình, PC phải thông qua mạch
ghép nối màn hình (graphics adapter). Board mạch này thường được cắm trên khe cắm mở
rộng của PC.
Trong chế độ văn bản (text mode), các ký tự được xác định bởi mã ASCII, trong đó
có cả các thông tin về thuộc tính của ký tự, thí dụ ký tự được hiện theo cách nhấp nháy hay
đảo màu đen trắng ….ROM ký tự (character rom) lưu trữ các hình mẫu điểm ảnh của các
ký tự tương ứng để máy phát ký tự biến đổi các mã ký tự đó thành 1 chuỗi các bit điểm ảnh
(pixel bit) và chuyển chúng tới thanh ghi dịch (shift register). Máy phát tín hiệu sẽ sử dụng
các bit điểm ảnh này cùng với các thông tin thuộc tính từ RAM video và các tín hiệu đồng
bộ từ CRTC để phát ra các tín hiệu cần thiết cho monitor.
Trong chế độ đồ họa (graphics mode), thông tin trong RAM video được sử dụng trực
tiếp cho việc phát ra các ký tự. Lúc này các thông tin về thuộc tính cũng không cần nữa. Chỉ
từ các giá trị bit trong thanh ghi dịch, máy phát tín hiệu sẽ phát các tín hiệu về độ sáng và
màu cho monitor.
Mỗi ký tự được biểu diễn bởi 1 từ 2 byte trong RAM video. Byte thấp chứa mã ký tự,
byte cao chứa thuộc tính. Cấu trúc của một từ nhớ video như sau:

15 14 13 12 11 10 9 8
BLNK BAK2 BAK1 BAK0 INT FOR2 FOR1 FOR0

7 6 5 4 3 2 1 0
CHR7 CHR6 CHR5 CHR4 CHR3 CHR2 CHR1 CHR0

BLNK: Nhấp nháy; 1 = bật, 0 = tắt


INT: Cường độ sáng ; 1 = cao, 0 = bình thường
CHR7…CHR0: Mã ký tự.

Phạm Hùng Kim Khánh Trang 57


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

Bảng màu quy định như sau:


Mã hex Màu Mã hex Màu Mã hex Màu Mã hex Màu
0 Black 4 Red 8 Dark Gray C Light Red
1 Blue 5 Magenta 9 Light Blue D Light Magenta
2 Green 6 Brown A Light Green E Yellow
3 Cyan 7 Light Gray B Light Cyan F White

Trong chế độ văn bản, 6845 liên tục xuất các địa chỉ cho RAM video qua MA0-
MA13. Ký tự ở góc tận cùng phía trên bên trái màn hình có địa chỉ thấp nhất mà 6845 sẽ
cung cấp ngay sau khi quét dọc ngược. Logic ghép nối định địa chỉ cho RAM video bằng
việc lấy ra mã ký tự cùng với thuộc tính. Mã ký tự dùng cho máy phát ký tự như là chỉ số
thứ nhất trong ROM ký tự. Lúc này, 6845 định địa chỉ hàng quét đầu tiên của ma trận ký tự,
địa chỉ hàng bằng 0. Các bit của ma trận điểm ảnh bây giờ sẽ được truyền đồng bộ với tần
số video từ thanh ghi dịch tới máy phát tín hiệu. Nếu máy phát tín hiệu nhận được giá trị 1
từ thanh ghi dịch, nó sẽ phát tín hiệu video tương ứng với màu của ký tự. Nếu nhận được 0
nó sẽ cấp tín hiệu tương ứng với màu nền. Vậy dòng quét thứ nhất được hiện phù hợp với
các ma trận điểm ảnh của các ký tự trong hàng ký tự thứ nhất. Khi tia điện tử đạt tới cuối
dòng quét, 6845 kích hoạt lối ra HS (Horizontal Synchronization) để tạo ra quá trình quét
ngược và đồng bộ ngang. Tia điện tử quay trở về bắt đầu quét dòng tiếp. Sau mỗi dòng
quét, 6845 tăng giá trị RA0-RA4 lên 1. Địa chỉ dòng này hình thành một giá trị offset bên
trong ma trận điểm ảnh cho ký tự được hiện. Dựa trên mỗi dòng quét như vậy, một dòng các
điểm ảnh của ký tự trong hàng ký tự được hiện ra. Điều này có nghĩa là với ma trận 9x14
điểm ảnh cho 1 ký tự, hàng ký tự thứ nhất đã được hiện sau 14 dòng quét. Khi địa chỉ RA0-
RA4 trở về giá trị 0, 6845 sẽ cấp 1 địa chỉ MA0-MA13 mới và hàng ký tự thứ hai sẽ được
hiện ra cũng như vậy. Ở cuối dòng quét cuối cùng, 6845 sẽ reset địa chỉ MA0-MA13 và
RA0-RA4 và cho phép lối ra VS (Vertical Synchronization) phát ra tín hiệu quét ngược
cùng tín hiệu đồng bộ dọc.
Mỗi ký tự có chiều cao cực đại ứng với 32 dòng vì có 5 đường địa chỉ RA0-RA4, còn
bộ nhớ video trong trường hợp này được tới 16K từ vì có địa chỉ MA0-MA13 là 14 bit.
Trong chế độ đồ họa, chúng kết hợp với nhau để tạo thành địa chỉ 19 bit, lúc đó 6845 có thể
định địa chỉ cho bộ nhớ video lên tới 512K từ. Trong trường hợp này, các byte trong RAM
video không được dịch thành mã ký tự và thuộc tính nữa mà trực tiếp xác định cường độ
sáng và màu của điểm ảnh. Đa số các RAM video được chia thành vài băng được định địa
chỉ bởi RA0-RA4. Các đường MA0-MA13 sẽ định địa chỉ offset bên trong mỗi băng. Dữ
liệu trong RAM video lúc này được trực tiếp truyền tới thanh ghi dịch và máy phát tín hiệu.
ROM ký tự và máy phát ký tự không làm việc.
RAM video được tổ chức khác nhau tuỳ theo chế độ hoạt động và bản mạch ghép
nối. Thí dụ, với RAM video 128 KB, có thể địa chỉ hóa toàn bộ bộ nhớ màn hình qua CPU
như bộ nhớ chính. Nhưng nếu kích thước RAM video lớn hơn thì làm như vậy sẽ đè lên
vùng ROM mở rộng ở điạ chỉ C0000h. Do đó, card EGA và VGA với trên 128 KB nhớ
được tăng cường thêm 1 chuyển mạch mềm (soft-switch) cho phép thâm nhập các cửa sổ

Phạm Hùng Kim Khánh Trang 58


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

128 KB khác nhau vào RAM video lớn hơn nhiều. Các chuyển mạch này được quy định bởi
riêng các nhà sản xuất board mạch.

3.2. Chế độ văn bản


RAM video được coi như một dãy từ tuyến tính, từ đầu tiên được gán cho ký tự góc
trên tận cùng bên trái màn hình gọi là hàng 1 cột 1. Từ thứ 2 là hàng 1, cột 2, …. Số từ tuỳ
thuộc vào độ phân giải của kiểu hiện ký tự.
Thí dụ: độ phân giải chuẩn 25 hàng, 80 ký tự đòi hỏi 2000 từ nhớ 2 byte. Như vậy,
tổng cộng cần 4 KB bộ nhớ RAM video. Trong khi đó với card có độ phân giải cao SVGA
60 hàng, 132 ký tự cần đến 15840 byte. Do đó RAM video thường được chia thành vài
trang. Kích thước của mỗi trang tuỳ thuộc vào chế độ hiện của màn hình và số trang cực đại,
phụ thuộc cả vào kích thước của RAM video. 6845 có thể được lập trình sao cho địa chỉ
khởi phát của MA0-MA13 sau quét ngược dọc là khác 00h. Nếu địa chỉ khởi phát là bắt đầu
của 1 trang thì có thể quản lý RAM video theo vài trang tách biệt nhau, nếu CPU thay đổi
nội dung của 1 trang mà trang đó hiện đang không hiện thì màn hình cũng không thay đổi.
Do đó, cần phân biệt trang nhớ đang được kích hoạt (đang hiện) và trang đang được xử lý.
Đoạn chương trình ghi ký tự 'A' có cường độ sáng cao vào góc trên bên trái với màu
số 7 và màu nền số 0. Trang thứ nhất và là duy nhất bắt đầu ở địa chỉ B0000h.
MOV AX, 0B000h
MOV ES, AX
MOV AH, 0F8h
MOV AL, 41h
MOV ES:[00H],AX

3.3. Chế độ đồ hoạ


Tổ chức trong chế độ này phức tạp hơn. Ví dụ: với card Hercules, RAM video được
chia thành 4 băng trên 1 trang . Băng thứ nhất: đảm bảo các điểm ảnh cho các dòng 0, 4, 8,
…, 344; băng thứ hai cho các dòng 1, 5, 9, …, 345; băng thứ 3 cho các dòng 2, 6, 10, ….,
346; và băng thứ 4 cho các dòng 3, 7, 11, …, 347. 64 KB được chia thành 2 trang 32 KB.
Độ phân giải trong chế độ đồ họa là 720 x 348 điểm ảnh, mỗi điểm ảnh được biểu diễn bởi 1
bit. Do vậy, một dòng cần 90 byte (720 điểm ảnh / 8 điểm ảnh trên 1 byte). Địa chỉ của byte
chứa điểm ảnh thuộc đường i và cột j trong trang k là:
B0000h+8000h*k+2000h*(i mod 4)+ 90*int(i/4)+int(j/8)
B0000h là đoạn video, 8000h là kích thước của trang, 2000h*(i mod 4) là offset của
băng chứa byte đó, 90*int(i/4) là offset của dòng i trong băng và int(j/8) là offset của cột j
trong băng.

3.4. Truy xuất màn hình qua DOS và BIOS


3.4.1. Truy xuất qua DOS
Các hàm của int 21h có thể hiện các ký tự trên màn hình nhưng không can thiệp được
vào màu:
- Hàm 02h: ra màn hình.
- Hàm 09h: ra một chuỗi.
- Hàm 40h: ghi file/ thiết bị

Phạm Hùng Kim Khánh Trang 59


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

Các lệnh copy, type và print trong command.com cho phép hiện text trên màn hình.
DOS gộp chung bàn phím và monitor thành 1 thiết bị mang tên CON (console). Ghi CON là
truyền số liệu tới monitor, còn đọc CON là nhận ký tự từ bàn phím. Ví dụ: để hiện nội dung
của file output.txt lên màn hình của monitor sẽ có các cách sau:
- copy output.txt con
- type output.txt > con
- print output.txt /D:con

3.4.2. Truy xuất qua BIOS


BIOS thâm nhập monitor bằng int 10h với nhiều chức năng hơn DOS, như đặt chế độ
hiện hình, quản lý tự động các trang, phân biệt các điểm trên màn hình nhờ các tọa độ,…
- Hàm 00h: định chế độ đồ hoạ:
Vào:
AL = chế độ
Mode Type Max Colors Size Resolution Max Pages Base Addr
---- -------- ---------- ----- ---------- --------- ---------
00 Text 16 40x25 - - 8 B8000h
01 Text 16 40x25 - - 8 B8000h
02 Text 16 80x25 - - 4,8 B8000h
03 Text 16 80x25 - - 4,8 B8000h
04 Graphics 4 40x25 320x200 1 B8000h
05 Graphics 4 40x25 320x200 1 B8000h
06 Graphics 2 80x25 640x200 1 B8000h
07 Text Mono 80x25 - - 1,8 B0000h
08 Graphics 16 20x25 ? ? 1 B0000h
09 Graphics 16 40x25 ? ? 1 B0000h
0A Graphics 4 80x25 ? ? 1 B0000h
0B - - - - - - - - - -
0C - - - - - - - - - -
0D Graphics 16 40x25 320x200 8 A0000h
0E Graphics 16 80x25 640x200 4 A0000h
0F Graphics Mono 80x25 640x350 2 A0000h
10 Graphics 16 80x25 640x350 2 A0000h
11 Graphics 2 80x25 640x480 1 A0000h
12 Graphics 16 80x25 640x480 1 A0000h
13 Graphics 256 40x25 320x200 1 A0000h

- Hàm 01h: xác định hình dạng con trỏ


Vào:
0
1
2

7
Đầu = 0 Đầu = 0 Đầu = 6 Đầu = 7
Cuối = 7 Cuối = 1 Cuối = 7 Cuối = 0

Phạm Hùng Kim Khánh Trang 60


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

CH = dòng đầu con trỏ


CL = dòng cuối con trỏ
- Hàm 02h: xác định vị trí con trỏ
Vào:
DH = hàng, DL = cột (bắt đầu từ toạ độ 0,0)
BH = trang (= 0 trong chế độ đồ hoạ)
- Hàm 03h: lấy vị trí và hình dạng con trỏ
Vào: BH = trang
Ra:
DH = hàng, DL = cột
CH, CL = tham số xác định hình dạng con trỏ
- Hàm 05h: chọn trang màn hình
AL = số trang (0..7)
- Hàm 06h: cuộn cửa sổ lên
Vào:
AL = số hàng cuộn (= 0: cuộn toàn màn hình)
BH = thuộc tính các hàng trống xuất hiện khi cuộn
CH, CL = hàng, cột của góc phía trên bên trái
DH, DL = hàng, cột của góc phía dưới bên phải
- Hàm 07h: cuộn cửa sổ xuống
Giống hàm 06h
- Hàm 08h: đọc ký tự và thuộc tính ký tự tại vị trí con trỏ
Vào: BH = trang
Ra:
AH = thuộc tính
AL = mã ASCII
- Hàm 09h: ghi ký tự và thuộc tính ký tự tại vị trí con trỏ
Vào:
BH = trang
BL = thuộc tính (theo bảng trang 61)
AL = mã ASCII
CX = số ký tự cần xuất

Phạm Hùng Kim Khánh Trang 61


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

- Hàm 0Ah: ghi ký tự tại vị trí con trỏ


Vào:
BH = trang
AL = mã ASCII
CX = số ký tự cần xuất
- Hàm 0Bh: chọn bảng màu (dùng cho chế độ đồ hoạ)
Vào: BH = 0, BL = chọn màu nền (theo bảng trang 61)
BH = 1, BL = số bảng màu
Palette Pixel Color Palette Pixel Color
------- ----- ------- ------- ----- -------
0 0 Black 1 0 Black
0 1 Green 1 1 Cyan
0 2 Red 1 2 Magenta
0 3 Brown 1 3 White

- Hàm 0Ch: hiện một điểm trên màn hình (dùng cho chế độ đồ hoạ)
AL = giá trị pixel (0 – 3), nếu AL.7 = 1 thì giá trị màu là phép toán XOR vứi giá trị
màu hiện hành
CX = cột, DX = hàng
- Hàm 0Dh: đọc một điểm trên màn hình (dùng cho chế độ đồ hoạ)
Vào: CX = cột, DX = hàng
Ra: AL = giá trị pixel
- Hàm 0Fh: xác định chế độ màn hình hiện hành
Ra:
AL = chế độ
AH = số cột
BH = số trang
- Hàm 13h: xuất chuỗi
Vào:
AL = chế độ xuất (bit0 = 1: cập nhật vị trí con trỏ sau khi xuất, bit1 = 1: chuỗi có
chứa thuộc tính ký tự)
BH = trang
BL = thuộc tính (theo bảng trang 61)
CX = số ký tự cần xuất
CX = số ký tự cần xuất
DH, DL = hàng, cột xuất chuỗi

Phạm Hùng Kim Khánh Trang 62


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

ES:BP = chuỗi in (nếu AL.1 = 1 thì chuỗi có dạng ‘Kýtự’,thuộc tính,‘Kýtự’,thuộc


tính,‘Kýtự’,thuộc tính…)
™ Những thường trình đồ họa:
BIOS trên main board có sẵn những hàm dùng cho thâm nhập MDA và CGA. BIOS
của riêng EGA và VGA có những hàm mở rộng tương ứng trong khi vẫn giữ nguyên định
dạng gọi.
Một trong những hàm quan trọng nhất của int 10h là hàm 00h dùng để đặt chế độ
hiện hình. Để thay đổi chế độ hiện hình cần phải làm rất nhiều bước chương trình phức tạp
để nạp các thanh ghi của chip 6845. Trong khi đó, hàm 00h làm cho ta tất cả các công việc
này.
Thí dụ: tạo kiểu 6 với độ phân giải 640*200 trên CGA.
Mov ah, 00h ; hàm 00h
Mov al, 06h ; chế độ 6
Int 10h ; gọi ngắt

Các card EGA/VGA có riêng BIOS của chúng. Trong quá trình khởi động PC, nó sẽ
chặn int 10h lại và chạy chương trình BIOS riêng. Thường trình cũ (của BIOS trên board
mach chính) được thay địa chỉ tới int 42h. Tất cả các lệnh gọi int 10h sẽ được BIOS của
EGA/VGA thay địa chỉ tới int 42h nếu board mạch EGA/VGA đang chạy các kiểu hiện
tương thích với MDA hay CGA. Có các kiểu hoạt động từ 0 đến 7.
BIOS của EGA/VGA dùng vùng 40:84h tới 40:88h để lưu số liệu BIOS và các thông
số của EGA/VGA. Nó có các hàm mới với các hàm phụ sau:
- Hàm 10h: truy xuất các thanh ghi màu và bảng màu
- Hàm 11h: cài đặt các bảng định nghĩa ký tự mới
- Hàm 12h: đặt cấu hình hệ con video
- Hàm 1Bh: thông tin về trạng thái và chức năng của BIOS video (chỉ có
ở VGA)
- Hàm 1Ch: trạng thái save/restore của video (chỉ có ở VGA)

Sau đây là chức năng của các hàm và thí dụ sử dụng chúng:
- Hàm 10h, hàm phụ 03h – xoá/đặt thuộc tính
Ví dụ: Xoá thuộc tính nhấp nháy:
Mov ah, 10h ; dùng hàm 10h
Mov al, 03h ; dùng hàm phụ 03h
Mov bl, 00h ; xoá thuộc tính nhấp nháy
Int 10h ; gọi ngắt

- Hàm 11h – ghép nối với máy phát ký tự


Ví dụ: Nạp bảng định nghĩa ký tự 8*14 không cần chương trình CRTC:
Mov ah, 11h ; dùng hàm 11h
Mov al, 01h ; nạp bảng ký tự từ Rom Bios vào Ram máy phát ký tự.
Mov bl, 03h ; gán số 3 cho bảng

Phạm Hùng Kim Khánh Trang 63


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

Int 10h ; gọi ngắt

- Hàm 12h, hàm phụ 20h – chọn thường trình in màn hình. Dùng hàm
phụ này có thể thay thế thường trình chuẩn cho INT 05h bằng thường
trình có thể dùng cho các độ phân giải mới của EGA/VGA.
Ví dụ: Cho phép thường trình mới in màn hình:
Mov ah, 12h ; dùng hàm 12h
Mov bl, 20h ; dùng hàm phụ 20h
Ấn PRINT hoặc SHIFT+PRINT để gọi thường trình in đã được lắp đặt.

™ Truy xuất trực tiếp bộ nhớ video:


Để vẽ 1 điểm trên màn hình, BIOS phải làm nhiều thủ tục nhưng nếu muốn vẽ toàn
bộ 1 cửa sổ hình hay lưu trữ thì phải truy xuất trực tiếp RAM video.
- Với board đơn sắc MDA trong kiểu hiện văn bản số 7, 4 KB RAM
đuợc tổ chức như 1 dãy (array) gốm 2000 từ nhớ kề nhau ( mỗi từ là
mã thuộc tính: ký tự) tạo nên 25 dòng, 80 cột. RAM video bắt đẩu ở
đọan B0000h, trong đó ký tự góc trên cùng bên trái là từ thứ nhất trong
RAM video. Như vậy mỗi dòng có 160 byte (A0h). Địa chỉ của từ nhớ
ứng với ký tự ở dòng i, cột j (i = 0-24, j = 0-79) được tính theo công
thức sau:
Address (i,j) = B0000h +A0h*i +02h*j.
- Với board EGA, ở kiểu hiện văn bản từ 0 đến 3 mã ký tự được lưu trữ
trong lớp nhớ 0 cùng với thuộc tính trong lớp 1 của RAM video. Mạch
logic chuyển địa chỉ trên board thực hiện sự kết hợp nhất định nào đó
sao cho tổ chức và cấu trúc của RAM video cũng như cách tính địa chỉ
vẫn tương đồng với cách của CPU. Trong chế độ đồ họa từ 13 đến 16,
RAM video bắt đầu từ địa chỉ đoạn A000h. Các điểm ảnh được xếp kề
cận nhau trong bộ nhớ và mỗi điểm ảnh đòi hỏi 4 bit, các bit này được
phân ra ở 4 lớp nhớ. Như vậy địa chỉ của 1 trong 4 bit này trên 1 điểm
ảnh không chỉ gồm đoạn video và offset mà còn thêm vào số lớp nhớ
nữa.
Để hiện 1 điểm ảnh với 1 trong 16 màu, không phải chỉ tính địa chỉ bit mà còn phải
thâm nhập 4 lớp nhớ. Muốn vậy, phải dùng thanh ghi mặt nạ bản đồ (map mask register).
Thanh ghi này được định địa chỉ qua cổng chỉ số 3C4h với địa chỉ 02h và có thể được ghi
qua cổng số liệu 3C5h. Cấu trúc của thanh ghi mặt nạ bản đố như sau:

7 6 5 4 3 2 1 0
Res Res Res Res LY3 LY2 LY1 LY0

LY3-LY0: Thâm nhập ghi tới các lớp từ 0Æ3;


1 = cho phép; 0 = không cho phép
Res : Dự trữ

Phạm Hùng Kim Khánh Trang 64


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

Ví dụ: Đặt bit 0 của byte ở địa chỉ A000:0000h cho lớ 0, 1, 3.


Mov AX, 0A000h ; nạp đọan video vào AX
Mov ES, AX ; truyền đọan video vào ES
Mov BX, 0000h ; nạp offset 0000h vào BX
Out 3C4h, 02h ; chỉ số 2 Æ thanh ghi mặt nạ bản đồ
Out 3C5h, 0Bh ; ghi 0000 1011b vào thanh ghi mặt nạ bản đồ
(cho phép lớp 0, 1, 3)
Mov 3C5h, 0Bh ; đặt bit 0 trong các lớp 0, 1 và 3

Để lưu trữ nội dung màn hình cần phải đọc các giá trị bit của 4 lớp khi dùng thanh
ghi chọn bản đồ đọc (read map select register). Nó được định địa chỉ với chỉ số 04h qua
cổng chỉ số 3CEh, và có thể được ghi qua cổng số liệu 3CFh. Cấu trúc của thanh ghi này:

7 6 5 4 3 2 1 0
res res res res res res LY1 LY0

LY1-LY0: cho phép thâm nhập đọc với:


00 = lớp 0
01 = lớp 1
10 = lớp 2
11 = lớp 3
res : dự trữ
Ví dụ: đọc byte ở địa chỉ A000:0000h cho lớp 2:
Mov AX, A000h ; nạp đọan video vào AX
Mov ES, AX ; truyền đọan video vào ES
Mov BX, 0000h ; nạp offset vào BX
Out 3Ceh, 04h ; chỉ số 4 Æ thanh ghi chọn bản đồ đọc
Out 3CFh, 02h ; ghi 0000 0010b vào thanh ghi chọn bản đồ đọc
(cho phép lớp 2)
Mov AL, [ES:BX] ; nạp byte trong lớp 2 vào AL.

Chú ý rằng 4 bit tại 4 lớp đại diện cho 1 điểm ảnh nên trong kiểu hiện 16 EGA có độ
phân giải cao nhất mỗi dòng cần 80byte (640 điểm ảnh / 8 điểm ảnh trên 1 byte); mỗi trang
màn hình gồm 32 KB. Địa chỉ byte của điểm ảnh ở dòng i, cột j trang k (i=0-349, j=0-639,
k=0-1) là:
Address (i,j,k) = A0000h + 8000h*k + 50h*j + int (i/8).
Với board VGA, các chế độ hiện văn bản từ 0 đến 3 và 7 cũng như các chế độ đồ họa
từ 4 đến 6 và 13 đến 16 của CGA. EGA và MDA đều chạy được trên nó.
Trong chế độ văn bản, mã ký tự được lưu trữ trong lớp nhớ 0 cùng với thuộc tính
trong lớp 1 của RAM video VGA. Quá trình chuyển hóa địa chỉ cũng giống như EGA
nhưng khác ở chổ nó vẫn đảm bảo chế độ văn bản 7 với độ phân giải 720x400, ma trận điểm
ảnh 9x16. Trong chế độ đồ họa 4 ÷ 6 và 13 ÷ 19 , mọi tổ chức, cấu trúc cũng như cách tính

Phạm Hùng Kim Khánh Trang 65


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

địa chỉ tương tự như CGA và EGA. VGA được tăng cường 3 kiểu hiện hình mới từ 17 đến
19.
Kiểu 17 tương thích với board đồ họa của máy PS/2 kiểu 30 là MCGA (multi colour
graphics array). Các điểm ảnh chỉ gổm 1 bit (2 màu) được định vị chỉ trên lớp 0. Thí dụ,
trong VGA kiểu 17 với 80 byte trên 1 dòng (640 điểm ảnh / 8 điểm ảnh trên 1 byte). Mỗi
trang màn hình gồm 40 KB. Địa chỉ của byte ở dòng i, cột j ( i= 0-479), j=0-639) như sau:
Address (i,j) = A0000h+50h*j+int (i/8)
Kiểu 18, 4 bit của điểm ảnh được phân trong 4 lớp nhớ như ở EGA. Trong kiểu VGA
phân giải cao với 16 màu khác nhau, 80 byte trên 1 dòng (640 điểm ảnh / 8 điểm ảnh trên 1
byte), mỗi trang màn hình gồm 40 KB (A0000h byte); địa chỉ của mỗi byte ở dòng i, cột j
(i=0-479; j = 0-639) bằng:
Address (i,j) = A0000h + 50h*j + int (i/8).
Kiểu 19 với 256 màu cho 1 điểm ảnh thì RAM video lại được tổ chức rất đơn giản
như 1 dãy tuyến tính, trong đó 1 byte tương ứng với 1 điểm ảnh. Giá trị của byte phân định
màu của điểm ảnh. Kiểu này đòi hỏi 320 byte (140h) trên 1 dòng (320 điểm ảnh / 1 điểm
ảnh trên 1 byte). Một trang màn hình gồm 64 KB (10000h) nhưng chỉ có 64000 byte được
sử dụng. Địa chỉ của điểm ảnh trong dòng i, cột j (i = 0-199, j=0-319) là:
Address (i,j) = A0000h + 140h*j + i

Phạm Hùng Kim Khánh Trang 66


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

PHỤ LỤC CHƯƠNG 3


TITLE DISPLAYING MOUSE POSITION
CURSOR MACRO ROW,COLUMN
MOV AH,02H
MOV BH,00
MOV DH,ROW
MOV DL,COLUMN
INT 10H
ENDM
DISPLAY MACRO STRING
MOV AH,09H
MOV DX,OFFSET STRING
INT 21H
ENDM
.MODEL SMALL
.STACK
.DATA
MESSAGE_1 DB 'PRESS ANY KEY$'
MESSAGE_2 DB 'THE MOUSE CURSOR IS LOCATED AT $'
POS_HO DB ?,?, ' AND $'
POS_VE DB ?,?,'$'
OLDVIDEO DB ? ;current video mode
NEWVIDEO DB 0EH ;new video mode
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
MOV AH,0FH ;get current video mode
INT 10H
MOV OLDVIDEO,AL ;save it
MOV AX,0600H ;clear screen
MOV BH,07
MOV CX,0
MOV DX,184FH
INT 10H
MOV AH,00H ;set new video mode
MOV AL,NEWVIDEO
INT 10H
MOV AX,0 ;initialize mouse
INT 33H
MOV AX,01 ;show mouse cursor
INT 33H
CURSOR 20,20
DISPLAY MESSAGE_1
AGAIN:
MOV AX,03H ;get mouse location
INT 33H
MOV AX,CX ;get the hor. pixel position
CALL CONVERT
MOV POS_HO,AL ;save the LSD
MOV POS_HO+1,AH ;save the MSD

Phạm Hùng Kim Khánh Trang 67


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

MOV AX,DX ;get the vert. pixel position


CALL CONVERT
MOV POS_VE,AL ;save
MOV POS_VE+1,AH
CURSOR 5,20
DISPLAY MESSAGE_2
DISPLAY POS_HO
DISPLAY POS_VE
MOV AH,01 ;check for key press
INT 16H
JZ AGAIN ;if no key press
MOV AH,02 ;hide mouse
INT 33H
MOV AH,0 ;restore original video mode
MOV AL,OLDVIDEO ;load original video mode
MOV AH,0 ;restore original video mode
INT 10H
MOV AH,4CH ;go back to DOS
INT 21H
MAIN ENDP
;--------------------
;divide pixels position by 8 and convert to ASCII to make
it displayable
;ax=pixels position (it is in hex)
;on return ax= two ASCII digits
CONVERT PROC
SHR AX,1 ;divide
SHR AX,1 ;by 8
SHR AX,1 ;to get screen position by character
MOV BL,10
MOV AH,0
DIV BL
ADD AX,3030H ;make it ASCII
RET ;return with AX=two ASCII digits
CONVERT ENDP
END MAIN
--------------------------------------------------------------------

;THIS PROGRAM WAITS FOR THE MOUSE PRESS COUNT AND


;DISPLAYS IT WHEN ANY KEY IS PRESSED.
.MODEL SMALL
.STACK
.DATA
MESSAGE_1 DB 'PRESS LEFT BUTTON A NUMBER OF TIMES:LESS
THAN 99.$'
MESSAGE_2 DB 'TO FIND OUT HOW MANY TIMES, PRESS ANY
KEY$'
MESSAGE_3 DB 'YOU PRESSED IT $'
P_COUNT DB ?,?, ' TIMES $'
MESSAGE_4 DB 'NOW PRESS ANY KEY TO GO BACK TO DOS$'
OLDVIDEO DB ?
NEWVIDEO DB 12H

Phạm Hùng Kim Khánh Trang 68


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
MOV AH,0FH ;get current video mode
INT 10H
MOV OLDVIDEO,AL ;save it
MOV AX,0600H ;clear screen
MOV BH,07
MOV CX,0
MOV DX,184FH
INT 10H
MOV AH,00H ;set new video mode
MOV AL,NEWVIDEO
INT 10H
MOV AX,0 ;initialize mouse
INT 33H
MOV AX,01 ;show mouse cursor
INT 33H
CURSOR 2,1
DISPLAY MESSAGE_1
CURSOR 4,1
DISPLAY MESSAGE_2
MOV AH,07 ;wait for key press
INT 21H
MOV AX,05H ;get mouse press count
MOV BX,0 ;check press count for left button
INT 33H
MOV AX,BX ;BX=button press count
MOV BL,10
DIV BL
ADD AX,3030H
MOV P_COUNT,AL ;save the number
MOV P_COUNT+1,AH
CURSOR 10,2
DISPLAY MESSAGE_3
DISPLAY P_COUNT
CURSOR 20,2
DISPLAY MESSAGE_4
MOV AH,07 ;wait for a key press to get out
INT 21H
MOV AH,02 ;hide mouse
INT 33H
MOV AH,0 ;restore original video mode
MOV AL,OLDVIDEO ;load original vide mode
INT 10H
MOV AH,4CH ;go back to DOS
INT 21H
MAIN ENDP
END MAIN
;-----------------------------------------------------

.MODEL SMALL

Phạm Hùng Kim Khánh Trang 69


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

.STACK 100h
.DATA
mask_mon DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
mask_p DB 80h,0,0E0h,0,0F8h,0,0FEh,0
DB 0D8h,0,0Ch,0,6,0,3,0
DB 0,0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0,0
.CODE
main PROC
mov ax,@data
mov ds,ax
mov es,ax

mov ah,0
mov al,6
int 10h
mov ax,0
int 33h
mov ax,1
int 33h
mov ah,08h
int 21h
mov ax,9
mov bx,0
mov cx,0
lea dx,mask_mon
int 33h

mov ah,08h
int 21h

mov ah,4Ch
int 21h
main ENDP
END main

1000000000000000
1110000000000000
1111100000000000
1111111000000000
1101100000000000
0000110000000000
0000011000000000
0000001100000000

Phạm Hùng Kim Khánh Trang 70


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000

Keyboard Scan Codes: Set 1


*All values are in hexadecimal

101-, 102-, and 104-key keyboards:

KEY MAKE BREAK ----- KEY MAKE BREAK ----- KEY MAKE BREAK
A 1E 9E 9 0A 8A [ 1A 9A
B 30 B0 ` 29 89 INSERT E0,52 E0,D2
C 2E AE - 0C 8C HOME E0,47 E0,97
D 20 A0 = 0D 8D PG UP E0,49 E0,C9
E 12 92 \ 2B AB DELETE E0,53 E0,D3
F 21 A1 BKSP 0E 8E END E0,4F E0,CF
G 22 A2 SPACE 39 B9 PG DN E0,51 E0,D1
H 23 A3 TAB 0F 8F U ARROW E0,48 E0,C8
I 17 97 CAPS 3A BA L ARROW E0,4B E0,CB
J 24 A4 L SHFT 2A AA D ARROW E0,50 E0,D0
K 25 A5 L CTRL 1D 9D R ARROW E0,4D E0,CD
L 26 A6 L GUI E0,5B E0,DB NUM 45 C5
M 32 B2 L ALT 38 B8 KP / E0,35 E0,B5
N 31 B1 R SHFT 36 B6 KP * 37 B7
O 18 98 R CTRL E0,1D E0,9D KP - 4A CA
P 19 99 R GUI E0,5C E0,DC KP + 4E CE
Q 10 19 R ALT E0,38 E0,B8 KP EN E0,1C E0,9C
R 13 93 APPS E0,5D E0,DD KP . 53 D3
S 1F 9F ENTER 1C 9C KP 0 52 D2
T 14 94 ESC 01 81 KP 1 4F CF
U 16 96 F1 3B BB KP 2 50 D0
V 2F AF F2 3C BC KP 3 51 D1
W 11 91 F3 3D BD KP 4 4B CB
X 2D AD F4 3E BE KP 5 4C CC
Y 15 95 F5 3F BF KP 6 4D CD
Z 2C AC F6 40 C0 KP 7 47 C7

Phạm Hùng Kim Khánh Trang 71


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

0 0B 8B F7 41 C1 KP 8 48 C8
1 02 82 F8 42 C2 KP 9 49 C9
2 03 83 F9 43 C3 ] 1B 9B
3 04 84 F10 44 C4 ; 27 A7
4 05 85 F11 57 D7 ' 28 A8
5 06 86 F12 58 D8 , 33 B3
PRNT E0,2A, E0,B7,
6 07 87 . 34 B4
SCRN E0,37 E0,AA
7 08 88 SCROLL 46 C6 / 35 B5
E1,1D,45
8 09 89 PAUSE -NONE-
E1,9D,C5

Keyboard Scan Codes: Set 2


*All values are in hexadecimal

101-, 102-, and 104-key keyboards:

KEY MAKE BREAK ----- KEY MAKE BREAK ----- KEY MAKE BREAK
A 1C F0,1C 9 46 F0,46 [ 54 FO,54
B 32 F0,32 ` 0E F0,0E INSERT E0,70 E0,F0,70
C 21 F0,21 - 4E F0,4E HOME E0,6C E0,F0,6C
D 23 F0,23 = 55 FO,55 PG UP E0,7D E0,F0,7D
E 24 F0,24 \ 5D F0,5D DELETE E0,71 E0,F0,71
F 2B F0,2B BKSP 66 F0,66 END E0,69 E0,F0,69
G 34 F0,34 SPACE 29 F0,29 PG DN E0,7A E0,F0,7A
H 33 F0,33 TAB 0D F0,0D U ARROW E0,75 E0,F0,75
I 43 F0,43 CAPS 58 F0,58 L ARROW E0,6B E0,F0,6B
J 3B F0,3B L SHFT 12 FO,12 D ARROW E0,72 E0,F0,72
K 42 F0,42 L CTRL 14 FO,14 R ARROW E0,74 E0,F0,74
L 4B F0,4B L GUI E0,1F E0,F0,1F NUM 77 F0,77
M 3A F0,3A L ALT 11 F0,11 KP / E0,4A E0,F0,4A
N 31 F0,31 R SHFT 59 F0,59 KP * 7C F0,7C
O 44 F0,44 R CTRL E0,14 E0,F0,14 KP - 7B F0,7B
P 4D F0,4D R GUI E0,27 E0,F0,27 KP + 79 F0,79
Q 15 F0,15 R ALT E0,11 E0,F0,11 KP EN E0,5A E0,F0,5A
R 2D F0,2D APPS E0,2F E0,F0,2F KP . 71 F0,71
S 1B F0,1B ENTER 5A F0,5A KP 0 70 F0,70
T 2C F0,2C ESC 76 F0,76 KP 1 69 F0,69
U 3C F0,3C F1 05 F0,05 KP 2 72 F0,72
V 2A F0,2A F2 06 F0,06 KP 3 7A F0,7A
W 1D F0,1D F3 04 F0,04 KP 4 6B F0,6B

Phạm Hùng Kim Khánh Trang 72


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

X 22 F0,22 F4 0C F0,0C KP 5 73 F0,73


Y 35 F0,35 F5 03 F0,03 KP 6 74 F0,74
Z 1A F0,1A F6 0B F0,0B KP 7 6C F0,6C
0 45 F0,45 F7 83 F0,83 KP 8 75 F0,75
1 16 F0,16 F8 0A F0,0A KP 9 7D F0,7D
2 1E F0,1E F9 01 F0,01 ] 5B F0,5B
3 26 F0,26 F10 09 F0,09 ; 4C F0,4C
4 25 F0,25 F11 78 F0,78 ' 52 F0,52
5 2E F0,2E F12 07 F0,07 , 41 F0,41
E0,F0,
PRNT E0,12,
6 36 F0,36 7C,E0, . 49 F0,49
SCRN E0,7C
F0,12
7 3D F0,3D SCROLL 7E F0,7E / 4A F0,4A
-NONE-
E1,14,77,
8 3E F0,3E PAUSE E1,F0,14,
F0,77

AT Keyboard Scan Codes (Set 3)


KEY MAKE BREAK ----- KEY MAKE BREAK ----- KEY MAKE BREAK
A 1C F0,1C 9 46 F0,46 [ 54 F0,54
B 32 F0,32 ` 0E F0,0E INSERT 67 F0,67
C 21 F0,21 - 4E F0,4E HOME 6E F0,6E
D 23 F0,23 = 55 F0,55 PG UP 6F F0,6F
E 24 F0,24 \ 5C F0,5C DELETE 64 F0,64
F 2B F0,2B BKSP 66 F0,66 END 65 F0,65
G 34 F0,34 SPACE 29 F0,29 PG DN 6D F0,6D
H 33 F0,33 TAB 0D F0,0D U ARROW 63 F0,63
I 43 F0,48 CAPS 14 F0,14 L ARROW 61 F0,61
J 3B F0,3B L SHFT 12 F0,12 D ARROW 60 F0,60
K 42 F0,42 L CTRL 11 F0,11 R ARROW 6A F0,6A
L 4B F0,4B L WIN 8B F0,8B NUM 76 F0,76
M 3A F0,3A L ALT 19 F0,19 KP / 4A F0,4A
N 31 F0,31 R SHFT 59 F0,59 KP * 7E F0,7E
O 44 F0,44 R CTRL 58 F0,58 KP - 4E F0,4E
P 4D F0,4D R WIN 8C F0,8C KP + 7C F0,7C
Q 15 F0,15 R ALT 39 F0,39 KP EN 79 F0,79
R 2D F0,2D APPS 8D F0,8D KP . 71 F0,71
S 1B F0,1B ENTER 5A F0,5A KP 0 70 F0,70
T 2C F0,2C ESC 08 F0,08 KP 1 69 F0,69

Phạm Hùng Kim Khánh Trang 73


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 3

U 3C F0,3C F1 07 F0,07 KP 2 72 F0,72


V 2A F0,2A F2 0F F0,0F KP 3 7A F0,7A
W 1D F0,1D F3 17 F0,17 KP 4 6B F0,6B
X 22 F0,22 F4 1F F0,1F KP 5 73 F0,73
Y 35 F0,35 F5 27 F0,27 KP 6 74 F0,74
Z 1A F0,1A F6 2F F0,2F KP 7 6C F0,6C
0 45 F0,45 F7 37 F0,37 KP 8 75 F0,75
1 16 F0,16 F8 3F F0,3F KP 9 7D F0,7D
2 1E F0,1E F9 47 F0,47 ] 5B F0,5B
3 26 F0,26 F10 4F F0,4F ; 4C F0,4C
4 25 F0,25 F11 56 F0,56 ' 52 F0,52
5 2E F0,2E F12 5E F0,5E , 41 F0,41
PRNT
6 36 F0,36 57 F0,57 . 49 F0,49
SCRN
3D F0,3D SCROLL 5F F0,5F / 4A F0,4A
8 3E F0,3E PAUSE 62 F0,62

Phạm Hùng Kim Khánh Trang 74


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

Chương 4
GIAO TIẾP CỐNG NỐI TIẾP
1. Cấu trúc cổng nối tiếp
Cổng nối tiếp được sử dụng để truyền dữ liệu hai chiều giữa máy tính và ngoại vi, có
các ưu điểm sau:
- Khoảng cách truyền xa hơn truyền song song.
- Số dây kết nối ít.
- Có thể truyền không dây dùng hồng ngoại.
- Có thể ghép nối với vi điều khiển hay PLC (Programmable Logic Device).
- Cho phép nối mạng.
- Có thể tháo lắp thiết bị trong lúc máy tính đang làm việc.
- Có thể cung cấp nguồn cho các mạch điện đơn giản
Các thiết bị ghép nối chia thành 2 loại: DTE (Data Terminal Equipment) và DCE
(Data Communication Equipment). DCE là các thiết bị trung gian như MODEM còn DTE là
các thiết bị tiếp nhận hay truyền dữ liệu như máy tính, PLC, vi điều khiển, … Việc trao đổi
tín hiệu thông thường qua 2 chân RxD (nhận) và TxD (truyền). Các tín hiệu còn lại có chức
năng hỗ trợ để thiết lập và điều khiển quá trình truyền, được gọi là các tín hiệu bắt tay
(handshake). Ưu điểm của quá trình truyền dùng tín hiệu bắt tay là có thể kiểm soát đường
truyền.
Tín hiệu truyền theo chuẩn RS-232 của EIA (Electronics Industry Associations).
Chuẩn RS-232 quy định mức logic 1 ứng với điện áp từ -3V đến -25V (mark), mức logic 0
ứng với điện áp từ 3V đến 25V (space) và có khả năng cung cấp dòng từ 10 mA đến 20 mA.
Ngoài ra, tất cả các ngõ ra đều có đặc tính chống chập mạch.
Chuẩn RS-232 cho phép truyền tín hiệu với tốc độ đến 20.000 bps nhưng nếu cáp
truyền đủ ngắn có thể lên đến 115.200 bps.
Các phương thức nối giữa DTE và DCE:
- Đơn công (simplex connection): dữ liệu chỉ được truyền theo 1 hướng.
- Bán song công ( half-duplex): dữ liệu truyền theo 2 hướng, nhưng mỗi thời điểm
chỉ được truyền theo 1 hướng.
- Song công (full-duplex): số liệu được truyền đồng thời theo 2 hướng.
Định dạng của khung truyền dữ liệu theo chuẩn RS-232 như sau:

Start D0 D1 D2 D3 D4 D5 D6 D7 P Stop
0 1

Khi không truyền dữ liệu, đường truyền sẽ ở trạng thái mark (điện áp -10V). Khi bắt
đầu truyền, DTE sẽ đưa ra xung Start (space: 10V) và sau đó lần lượt truyền từ D0 đến D7

Phạm Hùng Kim Khánh Trang 75


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

và Parity, cuối cùng là xung Stop (mark: -10V) để khôi phục trạng thái đường truyền. Dạng
tín hiệu truyền mô tả như sau (truyền ký tự A):

Hình 4.1 – Tín hiệu truyền của ký tự ‘A’

Các đặc tính kỹ thuật của chuẩn RS-232 như sau:

Chiều dài cable cực đại 15m


Tốc độ dữ liệu cực đại 20 Kbps
Điện áp ngõ ra cực đại ± 25V
Điện áp ngõ ra có tải ± 5V đến ± 15V
Trở kháng tải 3K đến 7K
Điện áp ngõ vào ± 15V
Độ nhạy ngõ vào ± 3V
Trở kháng ngõ vào 3K đến 7K

Các tốc độ truyền dữ liệu thông dụng trong cổng nối tiếp là: 1200 bps, 4800 bps,
9600 bps và 19200 bps.
™ Sơ đồ chân:

Phạm Hùng Kim Khánh Trang 76


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

Hình 4.2 – Sơ đồ chân cổng nối tiếp

Cổng COM có hai dạng: đầu nối DB25 (25 chân) và đầu nối DB9 (9 chân) mô tả như
hình 4.2. Ý nghĩa của các chân mô tả như sau:

D25 D9 Tín Hướng Mô tả


hiệu truyền
1 - - - Protected ground: nối đất bảo vệ
2 3 TxD DTEÆDCE Transmitted data: dữ liệu truyền
3 2 RxD DCEÆDTE Received data: dữ liệu nhận
4 7 RTS DTEÆDCE Request to send: DTE yêu cầu truyền dữ liệu
5 8 CTS DCEÆDTE Clear to send: DCE sẵn sàng nhận dữ liệu
6 6 DSR DCEÆDTE Data set ready: DCE sẵn sàng làm việc
7 5 GND - Ground: nối đất (0V)
8 1 DCD DCEÆDTE Data carier detect: DCE phát hiện sóng mang
20 4 DTR DTEÆDCE Data terminal ready: DTE sẵn sàng làm việc
22 9 RI DCEÆDTE Ring indicator: báo chuông
23 - DSRD DCEÆDTE Data signal rate detector: dò tốc độ truyền
24 - TSET DTEÆDCE Transmit Signal Element Timing: tín hiệu định thời
truyền đi từ DTE
15 - TSET DCEÆDTE Transmitter Signal Element Timing: tín hiệu định thời
truyền từ DCE để truyền dữ liệu
17 - RSET DCEÆDTE Receiver Signal Element Timing: tín hiệu định thời
truyền từ DCE để truyền dữ liệu
18 - LL Local Loopback: kiểm tra cổng
21 - RL DCEÆDTE Remote Loopback: Tạo ra bởi DCE khi tín hiệu nhận
từ DCE lỗi
14 - STxD DTEÆDCE Secondary Transmitted Data
16 - SRxD DCEÆDTE Secondary Received Data
19 - SRTS DTEÆDCE Secondary Request To Send
13 - SCTS DCEÆDTE Secondary Clear To Send
12 - SDSRD DCEÆDTE Secondary Received Line Signal Detector
25 - TM Test Mode
9 - Dành riêng cho chế độ test
10 - Dành riêng cho chế độ test
11 Không dùng

Phạm Hùng Kim Khánh Trang 77


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

2. Truyền thông giữa hai nút


Các sơ đồ khi kết nối dùng cổng nối tiếp:

TxD TxD TxD TxD

RxD RxD RxD RxD

GND GND GND GND

DTE1 DTE2 DTE DCE

Hình 4.3 – Kết nối đơn giản trong truyền thông nối tiếp

Khi thực hiện kết nối như trên, quá trình truyền phải bảo đảm tốc độ ở đầu phát và
thu giống nhau. Khi có dữ liệu đến DTE, dữ liệu này sẽ được đưa vào bộ đệm và tạo ngắt.
Ngoài ra, khi thực hiện kết nối giữa hai DTE, ta còn dùng sơ đồ sau:

TxD TxD
RxD RxD
GND GND
RTS RTS
CTS CTS
DSR DSR
DCD DCD
DTR DTR

DTE1 DTE2
Hình 4.4 – Kết nối trong truyền thông nối tiếp dùng tín hiệu bắt tay

Khi DTE1 cần truyền dữ liệu thì cho DTR tích cực Æ tác động lên DSR của DTE2
cho biết sẵn sàng nhận dữ liệu và cho biết đã nhận được sóng mang của MODEM (ảo). Sau
đó, DTE1 tích cực chân RTS để tác động đến chân CTS của DTE2 cho biết DTE1 có thể
nhận dữ liệu. Khi thực hiện kết nối giữa DTE và DCE, do tốc độ truyền khác nhau nên phải
thực hiện điều khiển lưu lượng. Quá trinh điều khiển này có thể thực hiện bằng phần mềm
hay phần cứng. Quá trình điều khiển bằng phần mềm thực hiện bằng hai ký tự Xon và Xoff.
Ký tự Xon được DCE gởi đi khi rảnh (có thể nhận dữ liệu). Nếu DCE bận thì sẽ gởi ký tự
Xoff. Quá trình điều khiển bằng phần cứng dùng hai chân RTS và CTS. Nếu DTE muốn
truyền dữ liệu thì sẽ gởi RTS để yêu cầu truyền, DCE nếu có khả năng nhận dữ liệu (đang
rảnh) thì gởi lại CTS.

3. Truy xuất trực tiếp thông qua cổng


Các cổng nối tiếp trong máy tính được đánh số là COM1, COM2, COM3, COM4 với
các địa chỉ như sau:

Phạm Hùng Kim Khánh Trang 78


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

Tên Địa chỉ Ngắt Vị trí chứa địa chỉ


COM1 3F8h 4 0000h:0400h
COM2 2F8h 3 0000h:0402h
COM3 3E8h 4 0000h:0404h
COM4 2E8h 3 0000h:0406h

Giao tiếp nối tiếp trong máy tính sử dụng vi mạch UART với các thanh ghi cho trong
bảng sau:
Offset DLAB R/W Tên Chức năng
0 W THR Transmitter Holding Register (đệm truyền)
0 0 R RBR Receiver Buffer Register (đệm thu)
1 R/W BRDL Baud Rate Divisor Latch (số chia byte thấp)
0 R/W IER Interrupt Enable Register (cho phép ngắt)
1
1 R/W BRDH Số chia byte cao
R IIR Interrupt Identification Register (nhận dạng ngắt)
2
W FCR FIFO Control Register
3 R/W LCR Line Control Register (điều khiển đường dây)
4 R/W MCR Modem Control Register (điều khiển MODEM)
5 R LSR Line Status Register (trạng thái đường dây)
6 R MSR Modem Status Register (trạng thái MODEM)
7 R/W Scratch Register (thanh ghi tạm)

Các thanh ghi này có thể truy xuất trực tiếp kết hợp với địa chỉ cổng (ví dụ như thanh
ghi cho phép ngắt của COM1 có địa chỉ là BACOM1 + 1 = 3F9h.

™ IIR (Interrupt Identification):


IIR xác định mức ưu tiên và nguồn gốc của yêu cầu ngắt mà UART đang chờ phục
vụ. Khi cần xử lý ngắt, CPU thực hiện đọc các bit tương ứng để xác định nguồn gốc của
ngắt. Định dạng của IIR như sau:
D7 D6 D5 D4 D3 D2 D1 D0
00: không có Cho phép FIFO 64 - 1: ngắt time-out Xác định nguồn 0: có
FIFO byte (trong 16750) (trong 16550) gốc ngắt ngắt
11: cho phép 1: không
FIFO ngắt

D2 D1 Ưu Tên Nguồn D2 – D0 bị xoá


tiên khi
0 0 4 Đường Lỗi khung, thu đè, lỗi parity, gián đoạn Đọc LSR
truyền khi thu
0 1 3 Đệm thu Đệm thu đầy Đọc RBR
1 0 2 Đệm phát Đệm phát rỗng Đọc IIR, ghi
THR
1 1 1 Modem CTS, DSR, RI, RLSD Đọc MSR
(mức 1 ưu tiên cao nhất)

Phạm Hùng Kim Khánh Trang 79


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

™ IER (Interrupt Enable Register):


IER cho phép hay cấm các nguyên nhân ngắt khác nhau (1: cho phép, 0: cầm ngắt)

D7 D6 D5 D4 D3 D2 D1 D0
- - POW HBR MODEM LINE TxEMPTY RxRDY

Cho phép kiểu Cho phép khi lỗi Cho phép khi
công suất thấp modem THR rỗng

Cho phép khi


Cho phép kiểu Cho phép khi lỗi RBR đầy
nghỉ (hibernate) thu, phát

™ MCR (Modem Control Register):

D7 D6 D5 D4 D3 D2 D1 D0
- - - LOOP OUT2 OUT1 RTS DTR

Mode loopback:
kiểm tra hoạt Điều khiển 2 ngõ ra Điều khiển tín hiệu
đọng của UART OUT1, OUT 2 của RTS và DTR
UART

™ MSR (Modem Status Register):

D7 D6 D5 D4 D3 D2 D1 D0
RLSD RI DSR CTS ΔRLSD ΔRI ΔDSR ΔCTS

Trạng thái của CD, RI, 1: nếu có thay đổi các tín hiệu so với lần đọc trước
DSR và CTS ΔRI: = 1 nếu có xung dương tại RI

™ LSR (Line Status Register):

D7 D6 D5 D4 D3 D2 D1 D0
FIE TSRE THRE BI FE PE OE RxDR

FIE: FIFO Error – sai trong FIFO


TSRE: Transmitter Shift Register Empty – thanh ghi dịch rỗng (=1 khi đã phát 1 ký
tự và bị xoá khi có 1 ký tự chuyển đến từ THR.
THRE: Transmitter Holding Register Empty (=1 khi có 1 ký tự đã chuyển từ THR –
TSR và bị xoá khi CPU đưa ký tự tới THR).

Phạm Hùng Kim Khánh Trang 80


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

BI: Break Interrupt (=1 khicó sự gián đoạn khi truyền, nghĩa là tồn tại mức logic 0
trong khoảng thời gian dài hơn khoảng thời gian truyền 1 byte và bị xoá khi CPU đọc LSR)
FE: Frame Error (=1 khi có lỗi khung truyền và bị xoá khi CPU đọc LSR)
PE: Parity Error (=1 khi có lỗi parity và bị xoá khi CPU đọc LSR)
OE: Overrun Error (=1 khi có lỗi thu đè, nghĩa là CPU không đọc kịp dữ liệu làm cho
quá trình ghi chồng lên RBR xảy ra và bị xoá khi CPU đọc LSR)
RxDR: Receiver Data Ready (=1 khi đã nhận 1 ký tự và đưa vào RBR và bị xoá khi
CPU đọc RBR).
™ LCR (Line Control Register):

D7 D6 D5 D4 D3 D2 D1 D0
DLAB SBCB PS2 PS1 PS0 STB WLS1 WLS0

DLAB (Divisor Latch Access Bit) = 0: truy xuất RBR, THR, IER, = 1 cho phép đặt
bộ chia tần trong UART để cho phép đạt tốc độ truyền mong muốn.
UART dùng dao động thạch anh với tần số 1.8432 MHz đưa qua bộ chia 16 thành tần
số 115,200 Hz. Khi đó, tuỳ theo giá trị trong BRDL và BRDH, ta sẽ có tốc độ mong muốn.
Ví dụ như đường truyền có tốc độ truyền 2,400 bps có giá trị chia 115,200 / 2,400 = 48d =
0030h Æ BRDL = 30h, BRDH = 00h.
Một số giá trị thông dụng xác định tốc độ truyền cho như sau:

Tốc độ (bps) BRDH BRDL


1,200 00h 60h
2,400 00h 30h
4,800 00h 18h
9,600 00h 0Ch
19,200 00h 06h
38,400 00h 03h
57,600 00h 02h
115,200 00h 01h

SBCB (Set Break Control Bit) =1: cho phép truyền tín hiệu Break (=0) trong khoảng
thời gian lớn hơn một khung
PS (Parity Select):
PS2 PS1 PS0 Mô tả
X X 0 Không kiểm tra
0 0 1 Kiểm tra lẻ
0 1 1 Kiểm tra chẵn
1 0 1 Parity là mark
1 1 1 Parity là space

Phạm Hùng Kim Khánh Trang 81


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

STB (Stop Bit) = 0: 1 bit stop, =1: 1.5 bit stop (khi dùng 5 bit dữ liệu) hay 2 bit stop
(khi dùng 6, 7, 8 bit dữ liệu).
WLS (Word Length Select):

WLS1 WLS0 Độ dài dữ liệu


0 0 5 bit
0 1 6 bit
1 0 7 bit
1 1 8 bit

Một ví dụ khi lập trình trực tiếp trên cổng như sau:
.MODEL SMALL
.STACK 100h
.DATA
Com1 EQU 3F8h
Com_int EQU 08h
Buffer DB 251 DUP(?)
Bufferin DB 0
Bufferout DB 0
Char DB ?
Seg_com DW ? ; Vector ng•t c•
Off_com DW ?
Mask_int DB ?
Msg DB 'Press any key to exit$’
.CODE
Main PROC
MOV AX,@DATA
MOV DS,AX
MOV AH,35h
MOV AL,Com_int
INT 21h
MOV Seg_com,ES ; L•u vector ng•t c•
MOV Off_com,BX
PUSH DS
MOV BX,CS
MOV DS,BX
LEA DX,Com_ISR
MOV AH,35h ;Gán vector ng•t m•i
MOV AL,Com_int
INT 21h
POP DS

MOV DX,Com1+3 ; ••a ch• LCR


MOV AL,80h ; Set DLAB = 1 cho phép ••nh t•c
OUT DX,AL ; •• truy•n d• li•u

Phạm Hùng Kim Khánh Trang 82


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

MOV DX,Com1 ; G•i byte th•p


MOV AL,0Ch
OUT DX,AL
MOV DX,Com1+1
MOV AL,00h ; G•i byte cao Æ 000Ch: xác ••nh
OUT DX,AL ; t•c •• truy•n 9600bps
MOV DX,Com1+3 ; LCR = 0000 0011B
MOV AL,03h ; DLAB = 0, SBCB = 0 Æ c•m Break
OUT DX,AL ; PS = 000 Æ no parity
; STB = 0 Æ 1 stop bit
; WLS = 11 Æ 8 bit d• li•u

MOV DX,Com1+4 ; Tác ••ng ••n DTR và RTS


MOV AL,03h ; MCR = 0000 0011b Æ DTR=RTS = 1
OUT DX,AL ; Æ ngõ DTR và RTS c•a c•ng n•i
; ti•p = 0
MOV DX,21h ; Ki•m tra tr•ng thái ng•t
IN AL,DX ; D7 – D0 xác ••nh các IRQi
MOV Mask_int,AL ; =0: cho phép, =1: c•m

AND AL,0EFh ; = 1110 1111b Æ cho phép IRQ4


OUT DX,AL ; Æ cho phép COM1

MOV AL,01h ; IER = 0000 0001b Æ cho phép


MOV DX,Com1+1 ; ng•t khi RBR ••y
OUT DX,AL
MOV AH,09h
LEA Dx,Msg
INT 21h
Lap:
MOV AH,0Bh
INT 21h
CMP AL,0FFh
JE Exit
MOV AL,bufferin
CMP AL,bufferout
JE Lap
MOV AL,buffer[bufferout]
MOV char,AL
INC bufferout
MOV AL,bufferout
CMP AL,251
JNE Next
MOV bufferout,0
Next:

Phạm Hùng Kim Khánh Trang 83


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

MOV DL,char ; Xu•t giá tr• ra màn hình


MOV AH,02h
INT 21h

MOV AL,char ; Xu•t ra c•ng n•i ti•p


MOV DX,Com1
OUT DX,AL
JMP Lap
Exit:
MOV AL,Mask_int
OUT 21h,AL ; Khôi ph•c tr•ng thái ng•t
MOV DX,Off_com
MOV BX,Seg_com
MOV DS,BX
MOV AH,35h ;Khôi ph•c vector ng•t
MOV AL,Com_int
INT 21h

MOV AH,4Ch
INT 21h
Main ENDP
Com_ISR PROC
MOV DX,Com1+5 ; ••c n•i dung LSR
IN AL,DX
AND AL,1 ; N•u D0 = 1 thì có d• li•u
JZ exit_ISR
MOV DX,Com1
IN AL,DX
MOV buffer[bufferin],AL
INC bufferin
MOV AL,bufferin
CMP AL,251
JNE Exit_ISR
MOV bufferin,0
Exit_ISR:
MOV AL,20h ; Báo cho PIC k•t thúc ng•t
OUT 20h,AL
IRET
Com_ISR ENDP
END Main

4. Truyền thông nối tiếp dùng ActiveX


4.1. Mô tả
Việc truyền thông nối tiếp trên Windows được thực hiện thông qua một ActiveX có
sẵn là Microsoft Comm Control.. ActiveX này dược lưu trữ trong file MSCOMM32.OCX.
Quá trình này có hai khả năng thực hiện điều khiển trao đổi thông tin:

Phạm Hùng Kim Khánh Trang 84


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

- Điều khiển sự kiện:


Truyền thông điều khiển sự kiện là phương pháp tốt nhất trong quá trình điều khiển
việc trao đổi thông tin. Quá trình điều khiển thực hiện thông qua sự kiện OnComm.
- Hỏi vòng:
Quá trinh điều khiển bằng phương pháp hỏi vòng thực hiện thông qua kiểm tra các
giá trị của thuộc tính CommEvent sau một chu kỳ nào đó để xác định xem có sự kiện nào
xảy ra hay không. Thông thường phương pháp này sử dụng cho các chương trình nhỏ.
ActiveX MsComm được bổ sung vào một Visual Basic Project thông qua menu
Project > Components:

Hình 4.5 – Bổ sung đối tượng MsComm vào VBP

Biểu tượng của MsComm: và các thuộc tính cơ bản mô tả như sau:

Thuộc tính Mô tả
CommPort Số thứ tự cổng truyền thông
Input Nhận ký tự từ bộ đệm
Output Xuất ký tự ra cổng nối tiếp
PortOpen Mở / đóng cổng
Settings Xác định các tham số truyền

Phạm Hùng Kim Khánh Trang 85


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

Hình 4.6 – Các thuộc tính của đối tượng MSComm

4.2. Các thuộc tính


™ Settings:
Xác định các tham số cho cổng nối tiếp. Cú pháp:
MSComm1.Settings = ParamString
MSComm1: tên đối tượng
ParamString: là một chuỗi có dạng như sau: "BBBB,P,D,S"
BBBB: tốc độ truyền dữ liệu (bps) trong đó các giá trị hợp lệ là:
110 2400 38400
300 9600 (măc định) 56000
600 14400 188000
1200 19200 256000
P: kiểm tra chẵn lẻ, với các giá trị:
Giá trị Mô tả
O Odd (kiểm tra lẻ)
E Even (kiểm tra chẵn)
M Mark (luôn bằng 1)
S Space (luôn bằng 0)
N Không kiểm tra

Phạm Hùng Kim Khánh Trang 86


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

D: số bit dữ liệu (4, 5, 6, 7 hay 8), mặc định là 8 bit


S: số bit stop (1, 1.5, 2)
VD:
MSComm1.Settings = "9600,O,8,1" sẽ xác định tốc độ truyền 9600bps,
kiểm tra parity chẵn với 1 bit stop và 8 bit dữ liệu.
™ CommPort:
Xác định số thứ tự của cổng truyền thông, cú pháp:
MSComm1.CommPort = PortNumber
PortNumber là giá trị nằm trong khoảng từ 1 Æ 99, mặc định là 1.
VD:
MSComm1.CommPort = 1 xác định sử dụng COM1
™ PortOpen:
Đặt trạng thái hay kiểm tra trạng thái đóng / mở của cổng nối tiếp. Nếu dùng thuộc
tính này để mở cổng nối tiếp thì phải sử dụng trước 2 thuộc tính Settings và CommPort. Cú
pháp:
MSComm1.PortOpen = True | False
Giá trị xác định là True sẽ thực hiện mở cổng và False để đóng cổng đồng thời xoá
nội dung của các bộ đệm truyền, nhận.
VD: Mở cổng COM1 với tốc độ truyền 9600 bps
MSComm1.Settings = "9600,N,8,1"
MSComm1.CommPort = 1
MSComm1.PortOpen = True
™ Các thuộc tính nhận dữ liệu:
Input: nhận một chuỗi ký tự và xoá khỏi bộ đệm. Cú pháp:
InputString = MSComm1.Input
Thuộc tính này kết hợp với InputLen để xác định số ký tự đọc vào. Nếu InputLen = 0
thì sẽ đọc toàn bộ dữ liệu có trong bộ đệm.
InBufferCount: số ký tự có trong bộ đệm nhận. Cú pháp:
Count = MSComm1.InBufferCount
Thuộc tính này cùng dược dùng để xoá bộ đệm nhận bắng cách gán giá trị 0.
MSComm1.InBufferCount = 0
InBufferSize: đặt và xác định kích thước bộ đệm nhận (tính bằng byte). Cú pháp:
MSComm1.InBufferCount = NumByte
Giá trị măc định là 1024 byte. Kích thước bộ đệm này phải đủ lớn để tránh tình trạng
mất dữ liệu.
VD: Đọc toàn bộ nội dung trong bộ đệm nhận nếu có dữ liệu

Phạm Hùng Kim Khánh Trang 87


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

MSComm1.InputLen = 0
If MSComm1.InBufferCount <> 0 Then
InputString = MSComm1.Input
End If
™ Các thuộc tính xuất dữ liệu:
Bao gồm các thuộc tính Output, OutBufferCount và OutBufferSize, chức năng
của các thuộc tính này giống như các thuộc tính nhập.
™ CDTimeout:
Đặt và xác định khoảng thời gian lớn nhất (tính bằng ms) từ lúc phát hiện sóng mang
cho đến lúc có dữ liệu. Nếu quá khoảng thời gian này mà vẫn chưa có dữ liệu thì sẽ gán
thuộc tính CommEvent là CDTO (Carrier Detect Timeout Error) và tạo sự kiện OnComm.
Cú pháp:
MSComm1.CDTimeout = NumTime
™ DSRTimeout:
Xác định thời gian chờ tín hiệu DSR trước khi xảy ra sự kiện OnComm.
™ CTSTimeout:
Đặt và xác định khoảng thời gian lớn nhất (tính bằng ms) đợi tín hiệu CTS trước khi
đặt thuộc tính CommEvent là CTSTO và tạo sự kiện OnComm. Cú pháp:
MSComm1.CTSTimeout = NumTime
™ CTSHolding:
Xác định đã có tín hiệu CTS hay chưa, tín hiệu này dùng cho quá trình bắt tay bằng
phần cứng (cho biết DCE sẵn sàng nhận dữ liệu), trả về giá trị True hay False.
™ DSRHolding:
Xác định trạng thái DSR (báo hiệu sự tồn tại của DCE), trả về giá trị True hay False.
™ CDHolding:
Xác định trạng thái CD, trả về giá trị True hay False.
™ DTREnable:
Đặt hay xoá tín hiệu DTR để báo sự tồn tại của DTE. Cú pháp:
MSComm1.DTREnable = True | False
™ RTSEnable:
Đặt hay xoá tín hiệu RTS để yêu cầu truyền dữ liệu đến DTE. Cú pháp:
MSComm1.RTSEnable = True | False
™ NullDiscard:
Cho phép nhận các ký tự NULL (rỗng) hay không (= True: cấm). Cú pháp:
MSComm1.NullDiscard = True | False
™ SThreshold:

Phạm Hùng Kim Khánh Trang 88


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

Số byte trong bộ đệm truyền làm phát sinh sự kiện OnComm. Nếu giá trị này bằng 0
thì sẽ không tạo sự kiện OnComm. Cú pháp:
MSComm1.SThreshold = NumChar
™ HandShaking:
Chọn giao thức bắt tay khi thực hiện truyền dữ liệu. Cú pháp:
MSComm1.HandShaking = Protocol
Các giao thức truyền bao gồm:
Protocol Giá trị Mô tả
ComNone 0 Không băt tay (mặc định)
ComXon/Xoff 1 Bắt tay phần mềm (Xon/Xoff)
ComRTS 2 Bắt tay phần cứng (RTS/CTS)
ComRTSXon/Xoff 3 Bắt tay phần cứng và phàn mềm

™ CommEvent:
Trả lại các lỗi truyền thonog hay sự kiện xảy ra tại cổng nối tiếp
Các sự kiện:
Sự kiện Giá trị Mô tả
ComEvSend 1 Đã truyền ký tự
ComEvReceive 2 Khi có ký tự trong bộ đệm nhận
ComEvCTS 3 Có thay đổi trên CTS (Clear To Send)
ComEvDSR 4 Có thay đổi trên DSR (Data Set Ready)
ComEvCD 5 Có thay đổi trên CD (Carrier Detect)
ComEvRing 6 Phát hiện chuông
ComEvEOF 7 Nhận ký tự kết thúc file

Các lỗi truyền thông:


Lỗi Giá trị Mô tả
ComBreak 1001 Nhận tín hiệu Break
ComCTSTO 1002 Carrier Detect Timeout
ComFrame 1004 Lỗi khung
ComOver 1006 Phần cứng không đọc ký tự trước khi gởi ký tự kế
ComCDTO 1007 Carrier Detect Timeout
ComRxOver 1008 Tràn bộ đệm nhận
ComRxParity 1009 Lỗi parity
ComTxFull 1010 Tràn bộ đệm truyền

Phạm Hùng Kim Khánh Trang 89


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

4.3. Sự kiện OnComm


Sự kiện OnComm xảy ra bất cứ khi nào giá trị của thuộc tính CommEvent thay đổi.
Các thuộc tính RThreshold và SThreshold = 0 sẽ cấm sự kiện OnComm khi thực hiện nhận
hay gởi dữ liệu. Thông thường, SThreshold = 0 và RThreshold = 1.
Một chương trình truyền nhận đơn giản thực hiện bằng cách nối chân TxD với RxD
của cổng COM1 (loopback). Phương pháp này dùng để kiểm tra cổng nối tiếp.
Thuộc tính cơ bản của cổng nối tiếp:

Hình 4.7 – Các thuộc tính cơ bản của MSComm


Cửa sổ chương trình thực thi:

Textbox chứa
các ký tự gởi Đối tượng
MSComm

Textbox chứa
các ký tự nhận

Yêu cầu truyền


dữ liệu

Hình 4.8 – Cửa sổ chương trình loopback


Chương trình nguồn:
VERSION 5.00
Object = “{648A5603-2C6E-101B-82B6-
000000000014}#1.1#0”; “MSCOMM32.OCX”

Phạm Hùng Kim Khánh Trang 90


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

Begin VB.Form Form1


Caption = “Loopback Serial Port
Example”
ClientHeight = 3195
ClientLeft = 60
ClientTop = 345
ClientWidth = 4680
LinkTopic = “Form1”
ScaleHeight = 3195
ScaleWidth = 4680
StartUpPosition = 3 ‘Windows Default
Begin VB.CommandButton cmdExit
Caption = “Exit”
Height = 615
Left = 2640
TabIndex = 5
Top = 2160
Width = 1095
End
Begin VB.CommandButton cmdSend
Caption = “Send”
Height = 615
Left = 1200
TabIndex = 4
Top = 2160
Width = 975
End
Begin VB.TextBox txtReceive
Height = 735
Left = 1320
Locked = -1 ‘True
TabIndex = 3
Top = 1080
Width = 2535
End
Begin VB.TextBox txtTransmit
Height = 735
Left = 1320
TabIndex = 0
Top = 240
Width = 2535
End
Begin MSCommLib.MSComm MSComm1
Left = 3960
Top = 240
_ExtentX = 1005
_ExtentY = 1005

Phạm Hùng Kim Khánh Trang 91


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

_Version = 393216
DTREnable = -1 ‘True
RThreshold = 1
End
Begin VB.Label Label2
Caption = “Receive:”
Height = 375
Left = 240
TabIndex = 2
Top = 1200
Width = 855
End
Begin VB.Label Label1
Caption = “Transmit:”
Height = 375
Left = 240
TabIndex = 1
Top = 240
Width = 975
End
End
Attribute VB_Name = “Form1”
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Sub cmdExit_Click()
MSComm1.PortOpen = False ‘Đóng cổng
End
End Sub
Private Sub cmdSend_Click()
MSComm1.Output = Trim(txtTransmit.Text)’Gởi dữ liệu
End Sub
Private Sub Form_Load()
MSComm1.CommPort = 1 ‘COM1
MSComm1.Settings = “9600,n,8,1” ‘Tốc độ 9600bps
MSComm1.PortOpen = True ‘ Mở cổng
End Sub
Private Sub MSComm1_OnComm()
If (MSComm1.CommEvent = comEvReceive) Then
txtReceive.Text = txtReceive.Text + MSComm1.Input
End If
End Sub

Phạm Hùng Kim Khánh Trang 92


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

5. Giao tiếp với vi điều khiển


Khi thực hiện giao tiếp với vi điều khiển, ta phải dùng thêm mạch chuyển mức logic
từ TTL Æ 232 và ngược lại. Các vi mạch thường sử dụng là MAX232 của Maxim hay
DS275 của Dallas. Mạch chuyển mức logic mô tả như sau:
TxD_PC
1
6
2 13 12
7 R1IN R1OUT
3 14 11 RxD_PC
8 T1OUT T1IN
4 1
9 C25 C+
5 6 MAX232 3 C28
V- C1- 10u
DB9 10u 4

R2OUT
T2OUT
2 C2+

R2IN

T2IN
V+ 5 C29
C26 C2- 10u
10u

10

9
VCC
C27
10u

Hình 4.9 – Mạch chuyển mức logic TTL ↔ RS232

Tuy nhiên, khi sử dụng mạch chuyển mức logic dùng các vi mạch thì đòi hỏi phải
dùng chung GND giữa máy tính và vi mạch Æ có khả năng làm hỏng cổng nối tiếp khi xảy
ra hiện tượng chập mạch ở mạch ngoài. Do đó, ta có thể dùng thêm opto 4N35 để cách ly về
điện. Sơ đồ mạch cách ly mô tả như sau: VCC

1K

TxD

6 1
5 VCC

4 2
68K
DTR 4N35

1 4.7K
6
2 RxD_PC
7
3 TxD_PC 1 6
8 5 RxD
4 4.7K
9 2 4
5
4N35
RTS

2.2K

Hình 4.10 – Mạch chuyển mức logic TTL ↔ RS232 cách ly


Khi giao tiếp, vi điều khiển chính là một DTE nên sẽ nối RxD của máy tính với TxD
của vi điếu khiển và ngược lại. Mạch kết nối đơn giản giữa vi điều khiển và máy tính như
sau:

Phạm Hùng Kim Khánh Trang 93


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net

Phạm Hùng Kim Khánh

Tài liệu Lập trình hệ thống


LED
1 2
74LS04
1
VCC 2 LED VCC
3 3 4
4 74LS04 1
5 2
6 LED 3
7 5 6 4
8 74LS04 5
9 6
LED 7
21 39 9 8 8
SW DIP-8 330 22 P2.0/A8 P0.0/AD0 38 74LS04 9
23 P2.1/A9 P0.1/AD1 37
24 P2.2/A10 P0.2/AD2 36 LED
25 P2.3/A11 P0.3/AD3 35 11 10 330
26 P2.4/A12 P0.4/AD4 34 74LS04
27 P2.5/A13 P0.5/AD5 33
28 P2.6/A14 P0.6/AD6 32 LED
1 P2.7/A15 P0.7/AD7 13 12
6 10 1 74LS04
2 13 12 11 P3.0/RXD P1.0 2
7 R1IN R1OUT 12 P3.1/TXD P1.1 3 LED
3 14 11 13 P3.2/INT0 P1.2 4 1 2
8 T1OUT T1IN 14 P3.3/INT1 P1.3 5 74LS04
4 1 15 P3.4/T0 P1.4 6
9 C+ 16 P3.5/T1 P1.5 7 LED
5 6 MAX232 3 C28 17 P3.6/WR P1.6 8 3 4
V- C1- 10u P3.7/RD P1.7 74LS04
10u 4 30 19
R2OUT
T2OUT

2 C2+ 29 ALE/PROG XTAL1 18


R2IN

T2IN

V+ 5 C29 PSEN XTAL2


C26 C2- 10u 31
10u EA/VPP 9
8

10

VCC RST
C27
10u AT89C51
33p
11.059MHz
C31

Hình 4.11 – Kết nối với vi điều khiển

Chương 4
Trang 77
Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

Chương trình nguồn cho vi điều khiển AT89C51:


MOV TMOD,#20h
MOV SCON,#52h ; Truyền 8 bit dữ liệu, no parity
MOV TH1,#(-3) ; Tốc độ truyền 9600 bps
MOV TL1,#(-3)
SETB TR1

Receive:
JNB RI,Transmit ; Có dữ liệu hay không
CLR RI
MOV A,SBUF ; Nếu có thì xuất ra LED
MOV P1,A
Transmit:
JNB TI,Receive ; Đã truyền xong chưa
CLR TI
MOV A,P2 ; Nếu xong thì truyền trạng thái
MOV SBUF,A ; của công tăc SW DIP-8
JMP Receive

Giao diện của chương trình trên máy tính:

Hình 4.12 – Chương trình giao tiếp với vi điều khiển


Chương trình nguồn:
VERSION 5.00
Object = "{648A5603-2C6E-101B-82B6-
000000000014}#1.1#0"; "MSCOMM32.OCX"

Phạm Hùng Kim Khánh Trang 95


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

Begin VB.Form Form1


Caption = "Microcontroller Interface
Example"
ClientHeight = 4665
ClientLeft = 60
ClientTop = 345
ClientWidth = 4020
LinkTopic = "Form1"
ScaleHeight = 4665
ScaleWidth = 4020
StartUpPosition = 3 'Windows Default
Begin VB.CheckBox chkSW
Height = 375
Index = 7
Left = 1800
TabIndex = 17
Top = 3480
Width = 1575
End
Begin VB.CheckBox chkSW
Height = 375
Index = 6
Left = 1800
TabIndex = 16
Top = 3000
Width = 1575
End
Begin VB.CheckBox chkSW
Height = 375
Index = 5
Left = 1800
TabIndex = 15
Top = 2520
Width = 1575
End
Begin VB.CheckBox chkSW
Height = 375
Index = 4
Left = 1800
TabIndex = 14
Top = 2040
Width = 1575
End
Begin VB.CheckBox chkSW
Height = 375
Index = 3
Left = 1800

Phạm Hùng Kim Khánh Trang 96


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

TabIndex = 13
Top = 1560
Width = 1575
End
Begin VB.CheckBox chkSW
Height = 375
Index = 2
Left = 1800
TabIndex = 12
Top = 1080
Width = 1575
End
Begin VB.CheckBox chkSW
Height = 375
Index = 1
Left = 1800
TabIndex = 11
Top = 600
Width = 1575
End
Begin VB.CheckBox chkSW
Height = 375
Index = 0
Left = 1800
TabIndex = 10
Top = 120
Width = 1575
End
Begin VB.CommandButton cmdExit
Caption = "Exit"
Height = 495
Left = 1680
TabIndex = 9
Top = 3960
Width = 975
End
Begin MSCommLib.MSComm MSComm1
Left = 3360
Top = 3960
_ExtentX = 1005
_ExtentY = 1005
_Version = 393216
DTREnable = -1 'True
RThreshold = 1
End
Begin VB.CommandButton cmdSend
Caption = "Send"

Phạm Hùng Kim Khánh Trang 97


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

Height = 495
Left = 240
TabIndex = 8
Top = 3960
Width = 1095
End
Begin VB.Label lblLED
BackStyle = 0 'Transparent
Caption = "LED7"
Height = 375
Index = 7
Left = 240
TabIndex = 7
Top = 3480
Width = 1095
End
Begin VB.Label lblLED
BackStyle = 0 'Transparent
Caption = "LED6"
Height = 375
Index = 6
Left = 240
TabIndex = 6
Top = 3000
Width = 975
End
Begin VB.Label lblLED
BackStyle = 0 'Transparent
Caption = "LED5"
Height = 375
Index = 5
Left = 240
TabIndex = 5
Top = 2520
Width = 975
End
Begin VB.Label lblLED
BackStyle = 0 'Transparent
Caption = "LED4"
Height = 375
Index = 4
Left = 240
TabIndex = 4
Top = 2040
Width = 975
End
Begin VB.Label lblLED

Phạm Hùng Kim Khánh Trang 98


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

BackStyle = 0 'Transparent
Caption = "LED3"
Height = 375
Index = 3
Left = 240
TabIndex = 3
Top = 1560
Width = 975
End
Begin VB.Label lblLED
BackStyle = 0 'Transparent
Caption = "LED2"
Height = 375
Index = 2
Left = 240
TabIndex = 2
Top = 1080
Width = 975
End
Begin VB.Label lblLED
BackStyle = 0 'Transparent
Caption = "LED1"
Height = 375
Index = 1
Left = 240
TabIndex = 1
Top = 600
Width = 975
End
Begin VB.Label lblLED
BackStyle = 0 'Transparent
Caption = "LED0"
Height = 375
Index = 0
Left = 240
TabIndex = 0
Top = 120
Width = 975
End
Begin VB.Shape shpLED
BorderColor = &H000000FF&
FillColor = &H000000FF&
FillStyle = 0 'Solid
Height = 375
Index = 7
Left = 840
Shape = 3 'Circle

Phạm Hùng Kim Khánh Trang 99


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

Top = 3480
Width = 375
End
Begin VB.Shape shpLED
BorderColor = &H000000FF&
FillColor = &H000000FF&
FillStyle = 0 'Solid
Height = 375
Index = 6
Left = 840
Shape = 3 'Circle
Top = 3000
Width = 375
End
Begin VB.Shape shpLED
BorderColor = &H000000FF&
FillColor = &H000000FF&
FillStyle = 0 'Solid
Height = 375
Index = 5
Left = 840
Shape = 3 'Circle
Top = 2520
Width = 375
End
Begin VB.Shape shpLED
BorderColor = &H000000FF&
FillColor = &H000000FF&
FillStyle = 0 'Solid
Height = 375
Index = 4
Left = 840
Shape = 3 'Circle
Top = 2040
Width = 375
End
Begin VB.Shape shpLED
BorderColor = &H000000FF&
FillColor = &H000000FF&
FillStyle = 0 'Solid
Height = 375
Index = 3
Left = 840
Shape = 3 'Circle
Top = 1560
Width = 375
End

Phạm Hùng Kim Khánh Trang 100


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

Begin VB.Shape shpLED


BorderColor = &H000000FF&
FillColor = &H000000FF&
FillStyle = 0 'Solid
Height = 375
Index = 2
Left = 840
Shape = 3 'Circle
Top = 1080
Width = 375
End
Begin VB.Shape shpLED
BorderColor = &H000000FF&
FillColor = &H000000FF&
FillStyle = 0 'Solid
Height = 375
Index = 1
Left = 840
Shape = 3 'Circle
Top = 600
Width = 375
End
Begin VB.Shape shpLED
BorderColor = &H000000FF&
FillColor = &H000000FF&
FillStyle = 0 'Solid
Height = 375
Index = 0
Left = 840
Shape = 3 'Circle
Top = 120
Width = 375
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Sub cmdExit_Click()
If MSComm1.PortOpen Then
MSComm1.PortOpen = False
End If
End
End Sub

Private Sub cmdSend_Click()

Phạm Hùng Kim Khánh Trang 101


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

Dim t As Integer
Dim i As Integer
t = 0
For i = 0 To 7
t = t + (2 ^ i) * (1 - shpLED(i).FillStyle)
Next i
MSComm1.Output = Chr(t)
End Sub

Private Sub Form_Load()


MSComm1.Settings = "9600,N,8,1"
MSComm1.CommPort = 1
MSComm1.PortOpen = True
End Sub

Private Sub lblLED_Click(Index As Integer)


shpLED(Index).FillStyle = 1 - shpLED(Index).FillStyle
End Sub

Private Sub MSComm1_OnComm()


Dim t As String
Dim n As Integer
Dim i As Integer
If MSComm1.CommEvent = comEvReceive Then
n = Asc(MSComm1.Input)
For i = 0 To 7
chkSW(i).Value = n Mod 2
If chkSW(i).Value = 0 Then
chkSW(i).Caption = "Switch " & Str(i) &
" off"
Else
chkSW(i).Caption = "Switch " & Str(i) &
" on"
End If
n = Fix(n / 2)
Next i
End If
End Sub

6. Giao tiếp với MODEM


6.1. Giao tiếp
Quá trình trao đổi dữ liệu giữa máy tính và Modem được thực hiện theo cơ chế bắt
tay phần cứng hay phần mềm.

Phạm Hùng Kim Khánh Trang 102


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

- Bắt tay phần cứng: máy tính muốn truyền dữ liệu thì cho RTS = 1 và chờ
Modem trả lời bằng tín hiệu CTS. Ngược lại, Modem muốn truyền dữ liệu thì cho
DSR = 1 và chờ tín hiệu DTR từ máy tính.
- Bắt tay phần mềm: dùng ký tự Xon (Ctrl-S) và Xoff (Ctrl-Q) để bắt đầu truyền
hay kết thúc truyền.
Các giao thức truyền dữ liệu trên Modem:
- XModem: chia thành khối 128 byte, mỗi khối chèn thêm CRC 4 byte.
- YModem: khối 1024 byte.
- ZModem: khối có kích thước thay đổi tuỳ theo đường truyền.
Quy tắc truyền lệnh trên Modem:
- Mỗi dòng lệnh của modem bắt đầu bằng ký tự AT, ngoại trừ lệnh A/ và +++.
- Dòng lệnh có thể chứa nhiều lệnh.
- Kết thúc lệnh bằng ký tự Enter (mã ASCII là 13) ngoại trừ lệnh A/ và +++.
- Dòng lệnh cuối cùng được lưu trong modem. Có thể dùng lệnh A/ để thực hiện lại
lệnh này.
- Thông báo kết quả thực hiện lệnh của modem có thể ở dạng từ chữ hay số( giá trị
mặc định là chữ). Có thể sử dụng lệnh V để lựa chọn dạng thông báo là chữ hay
số.
- Để hoạt động đúng, modem cần có các thông số xác định. Nếu không có sự thay
đổi cần thiết, modem hoạt động theo giá trị mặc định(default). Nếu thông số trong
lệnh bị bỏ qua, giá trị thông số mặc định là 0.

6.2. Các lệnh cơ bản của Modem

Lệnh Mô tả
+++ Chuyển Modem sang chế độ lệnh
A/ Lặp lại lệnh trước
A Cho phép kết nối và phát tín hiệu sóng mang. Modem sẽ báo tín hiệu CONNECT
nếu thu được tín hiêu sóng mang từ modem đầu cuối. Nếu không thu được sóng
mang, modem sẽ gác máy và thông báo NO CARRIER
DPn Quay số điện thoại n dạng xung
DTn Quay số điện thoại n dạng tone
H0 Gác máy
H1 Nhấc máy
O0 Chuyển về chế độ dữ liệu
O1 Chế độ điều chỉnh Modem
Q0 Cho phép Modem gởi thông báo đến DTE (mặc định)
Q1 Cấm Modem gởi thông báo
Q2 Gởi thông báo khi Modem chủ động kết nối, không gởi khi Modem nhận cuộc
gọi
V0 Nhận thông báo dạng số

Phạm Hùng Kim Khánh Trang 103


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

V1 Nhận thông báo dạng ký tự (mặc định)


Sn = V Nạp giá trị V vào thanh ghi Sn
S0 = V: chờ V hồi chuông trước khi trả lời, V = 0 – 255 (mặc định V = 0: không
trả lời)
S6 = V: chờ V giây trước khi quay số (mặc định V = 2)
S7 = V: chờ V giây kể từ lúc gọi đến lúc nhận được tín hiệu, nếu không sẽ thông
báo lỗi
Sn? Đọc nội dung thanh ghi Sn
Z0 Reset Modem về cấu hình 0
Z1 Reset Modem về cấu hình 1
L0, L1, Âm lượng loa Modem
L2, L3
M0 Tắt loa
M1 Mở loa cho đến khi nhận dược sóng mang (măc định)
M2 Mở loa
M3 Tắt loa khi quay số và nhận sóng mang

6.3. Các thanh ghi thông dụng trên modem


Thanh ghi S0: xác định số hồi chuông nhận được mà sau đó modem sẽ trả lời một
cách tự động. Giá trị trong thanh ghi này có thể thay đổi trong khoảng từ 0-255. mặc định
giá trị là 0 (không trả lời).
Thanh ghi S1: Thanh ghi S1 chỉ có tác dụng khi thanh ghi S0 khác 0, dùng để đếm
số hồi chuông thu được.
Thanh ghi S2: xác định giá trị thập phân của các ký tự (mã ASSCII) được dùng làm
ký tự thoát, Giá trị mặc định là 43(+)
Thanh ghi S3: xác định ký tự được dùng để kết thúc một dòng lệnh, mặc nhiên là 13
(tương ứng là Enter)
Thanh ghi S4: xác định ký tự xuống dòng sau ký tự kết thúc, giá trị mặc nhiên là 10
(line feed)
Thanh ghi S5: xác định phím xoá lui, giá trị mặc nhiên là 8 (backspace)
Thanh ghi S6: xác định thời gian đợi sau khi truy cập đường điện thoại và trước khi
tiến hành quoay digit đầu tiên trong một lệnh quay số. Ðây là thời gian trì hoãn cho phép để
dial tone cung cấp từ đường truyền. Giá trị mặc nhiên và tối thiểu là 2s.
Thanh ghi S7: xác định thời gian mà modem đợi tín hiệu sóng mang trước khi gác
máy. Giá trị mặc định là 30s.
Thanh ghi S8: xác định thời gian tạm dừng cho mỗi dấu phẩy ',' trong chuỗi lệnh
quay số. Giá trị mặc định là 2s
Thanh ghi S9: xác định thời gian mà tín hiệu sóng mang phải hiện diện để modem
có thể nhận biết được, giá trị mặc định là 600ms. Giá trị này nếu quá lớn sẽ gây lỗi trong dữ
liệu truyền.

Phạm Hùng Kim Khánh Trang 104


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

Thanh ghi S10: xác định thời gian cho phép tín hiệu sóng mang có thể biến mất
trong chốc lát nào đó mà không cắt cuộc nối. Ổn định trong khoảng 100-25500ms, giá trị
mặc nhiên tùy vào khả năng chống nhiễu của từng modem, thường là 700ms.
Thanh ghi S11: xác định tốc độ quay số khi sử dụng phương pháp quay số tone, giá
trị mặc nhiên tùy vào modem, thường vào khoảng 70ms.
Thanh ghi S12: xác định thời gian an toàn khi truy nhập vào ký tự thoát (+++). Nếu
giá trị nhỏ quá có thể nhập không kịp, giá trị lớn quá so với tốc độ nhập cũng không thể
thoát được.

6.4. Các thông báo của Modem

Dạng ký tựDạng số Ý nghĩa


OK 0 Lệnh thành công
CONNECT 1 Kết nối 300 bps
RING 2 Có tín hiệu chuông
NO CARRIER 3 Không có sóng mang
ERROR 4 Lỗi: nhận lệnh không giá trị, sai kiểm tra, hàng lệnh quá dài
CONNECT 1200 5 Kết nối 1200bps
NO DIAL TONE 6 Không có âm hiệu mời quay số
BUSY 7 Máy bận
NO ANSWER 8 Không có tín hiệu trả lời
CONNECT 2400 10 Kết nối 2400bps
CONNECT 4800 11 Kết nối 4800bps
CONNECT 9600 12 Kết nối 9600bps
CONNECT 14400 13 Kết nối 14400bps
CONNECT 19200 14 Kết nối 19200bps
CONNECT 16800 15 Kết nối 16800bps
CONNECT 57600 18 Kết nối 57600bps
CONNECT 7200 24 Kết nối 7200bps
CONNECT 12000 25 Kết nối 12000bps
CONNECT 28800 32 Kết nối 28800bps
CONNECT 115200 33 Kết nối 115200bps
CARRIER 300 40 Phát hiện sóng mang
CARRIER 9600 50 Phát hiện sóng mang
CARRIER 28800 58 Phát hiện sóng mang

Phạm Hùng Kim Khánh Trang 105


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

Ví dụ lập trình điều khiển Modem như sau:

Hình 4.13 – Giao tiếp và điều khiển Modem


Chương trình nguồn:
VERSION 5.00
Object = "{648A5603-2C6E-101B-82B6-
000000000014}#1.1#0"; "MSCOMM32.OCX"
Object = "{F9043C88-F6F2-101A-A3C9-
08002B2F49FB}#1.2#0"; "COMDLG32.OCX"
Begin VB.Form frmModem
Caption = "Modem example"
ClientHeight = 4065
ClientLeft = 60
ClientTop = 345
ClientWidth = 5925
LinkTopic = "Form1"
ScaleHeight = 4065
ScaleWidth = 5925
StartUpPosition = 3 'Windows Default
Begin VB.CommandButton cmdSave
Caption = "Save"
Height = 495
Left = 4320
TabIndex = 14
Top = 1320
Width = 1095
End
Begin VB.TextBox txtReceive
Height = 375
Left = 960

Phạm Hùng Kim Khánh Trang 106


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

TabIndex = 12
Top = 1320
Width = 3015
End
Begin VB.Timer Timer1
Enabled = 0 'False
Interval = 1000
Left = 4920
Top = 2400
End
Begin VB.CommandButton cmdExit
Caption = "Exit"
Height = 495
Left = 4560
TabIndex = 10
Top = 2880
Width = 975
End
Begin VB.TextBox txtDial
Height = 375
Left = 960
TabIndex = 7
Top = 2400
Width = 2895
End
Begin VB.CommandButton cmdDial
Caption = "Dial"
Height = 495
Left = 1680
TabIndex = 5
Top = 3000
Width = 1095
End
Begin VB.CommandButton cmdSend
Caption = "Send"
Height = 495
Left = 4320
TabIndex = 4
Top = 720
Width = 1095
End
Begin VB.CommandButton cmdOpen
Caption = "Open Port"
Height = 495
Left = 240
TabIndex = 3
Top = 3000

Phạm Hùng Kim Khánh Trang 107


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

Width = 1215
End
Begin VB.CommandButton cmdBrowse
Caption = "Browse"
Height = 495
Left = 4320
TabIndex = 1
Top = 120
Width = 1095
End
Begin MSComDlg.CommonDialog diagSend
Left = 4200
Top = 3120
_ExtentX = 847
_ExtentY = 847
_Version = 393216
End
Begin VB.TextBox txtSend
Height = 375
Left = 960
TabIndex = 0
Top = 360
Width = 3015
End
Begin MSCommLib.MSComm MSComm1
Left = 5160
Top = 3000
_ExtentX = 1005
_ExtentY = 1005
_Version = 393216
DTREnable = -1 'True
Handshaking = 2
NullDiscard = -1 'True
RThreshold = 1
RTSEnable = -1 'True
End
Begin VB.Label Label3
Caption = "File receive:"
Height = 375
Left = 0
TabIndex = 13
Top = 1320
Width = 855
End
Begin VB.Label lblReceive
Caption = "Receive file !!! Select
file name."

Phạm Hùng Kim Khánh Trang 108


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

ForeColor = &H000000FF&
Height = 375
Left = 840
TabIndex = 11
Top = 1920
Visible = 0 'False
Width = 2895
End
Begin VB.Label lblStatus
Caption = "Disconnected"
Height = 375
Left = 120
TabIndex = 9
Top = 3720
Width = 5775
End
Begin VB.Label Label2
Caption = "Dial:"
Height = 375
Left = 120
TabIndex = 8
Top = 2400
Width = 735
End
Begin VB.Label Label1
Caption = "File send:"
Height = 375
Left = 120
TabIndex = 6
Top = 360
Width = 735
End
Begin VB.Label lblSize
ForeColor = &H00FF0000&
Height = 375
Left = 960
TabIndex = 2
Top = 840
Width = 1815
End
End
Attribute VB_Name = "frmModem"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Connected As Boolean

Phạm Hùng Kim Khánh Trang 109


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

Private SendFlag As Boolean


Private ReceiveFlag As Boolean
Private FileReceive As Integer
Private CRFlag As Boolean
Private Sub cmdBrowse_Click()
On Error GoTo Loi
diagSend.FileName = ""
diagSend.Filter = "All files(*.*)|*.*"
diagSend.InitDir = App.Path
diagSend.ShowOpen
txtSend.Text = diagSend.FileName
lblSize.Caption = Str(Round(FileLen(txtSend.Text) /
1024, 2)) + "KB"
Exit Sub
Loi:
lblSize.Caption = "0 KB"
txtSend.Text = ""
End Sub

Private Sub cmdDial_Click()


If Not MSComm1.PortOpen Then
MsgBox "Comm Port Closed. Open first!!!",
vbOKOnly + vbCritical, "Error"
ElseIf Trim(txtDial.Text) = "" Then
MsgBox "Enter phone's number!!!", vbOKOnly +
vbCritical, "Error"
Else
If cmdDial.Caption = "Dial" Then
MSComm1.Output = "ATDT" & Trim(txtDial.Text)
+ vbCr
cmdDial.Caption = "Hang up"
lblStatus.Caption = "Dialing ..."
Else
MSComm1.Output = "ATH1" + vbCr
cmdDial.Caption = "Dial"
lblStatus.Caption = "Hang up"
End If
End If

End Sub

Private Sub cmdExit_Click()


If MSComm1.PortOpen Then
MSComm1.PortOpen = False
End If
End
End Sub

Phạm Hùng Kim Khánh Trang 110


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

Private Sub cmdOpen_Click()


MSComm1.PortOpen = Not MSComm1.PortOpen
If MSComm1.PortOpen Then
cmdOpen.Caption = "Close Port"
MSComm1.Output = "ATS0=5" + vbCr
Call Form_Load
Else
cmdOpen.Caption = "Open Port"
lblStatus.Caption = "Disconnected"
End If
End Sub

Private Sub cmdSave_Click()


FileReceive = FreeFile
ReceiveFlag = True
Timer1.Enabled = False
Do
diagSend.FileName = ""
diagSend.ShowSave
If Trim(diagSend.FileName) = "" Then
MsgBox "File name error!!",
vbCritical + vbOKOnly, "Error"
End If
Loop While Trim(diagSend.FileName) = ""
txtReceive.Text = diagSend.FileName
MSComm1.Output = "RECEIVE" + vbCr
Open Trim(txtReceive.Text) For Output As
#FileReceive
End Sub

Private Sub cmdSend_Click()


Dim FileNum As Integer
Dim Buffer As String
If Not MSComm1.PortOpen Then
MsgBox "Comm Port Closed. Open first!!!",
vbOKOnly + vbCritical, "Error"
ElseIf Not Connected Then
MsgBox "Not connected!!!", vbOKOnly +
vbCritical, "Error"
ElseIf Trim(txtSend.Text) = "" Then
MsgBox "Select a file to send!!!", vbOKOnly +
vbCritical, "Error"
Else
MSComm1.Output = "SEND" + vbCr
Do
DoEvents

Phạm Hùng Kim Khánh Trang 111


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

Loop While Not SendFlag


FileNum = FreeFile
Open Trim(txtSend.Text) For Input As #FileNum
Do
Input #FileNum, Buffer
If Right(Buffer, 1) <> vbCr Then Buffer =
Buffer + vbCrLf
MSComm1.Output = Buffer
Loop While Not EOF(FileNum)
MSComm1.Output = "END FILE"
Close #FileNum
SendFlag = False
End If
End Sub

Private Sub Form_Load()


Connected = False
SendFlag = False
ReceiveFlag = False
CRFlag = False
End Sub

Private Sub MSComm1_OnComm()


Dim Buffer As String
Dim Buffer1 As String
Dim Buff As String
Dim i As Integer
Select Case MSComm1.CommEvent
Case comEvRing
lblStatus.Caption = "Ringing..."
Case comEvCD
If MSComm1.CDHolding Then
lblStatus.Caption = "Connected"
Connected = True
Else
lblStatus.Caption = "Disconnected"
Connected = False
End If
Case comEvReceive
Buffer = MSComm1.Input
If InStr(Buffer, "SEND") Then
Timer1.Enabled = True
Exit Sub
End If
If InStr(Buffer, "RECEIVE") Then
SendFlag = True
Timer1.Enabled = False

Phạm Hùng Kim Khánh Trang 112


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

Buffer = ""
Exit Sub
End If
If InStr(Buffer, "CONNECT") Then
Connected = True
lblStatus.Caption = "Connected"
Exit Sub
End If
If ReceiveFlag Then
Buffer1 = ""
For i = 1 To Len(Buffer)
Buff = Mid$(Buffer, i, 1)
If Buff = Chr$(13) Then
CRFlag = True
Buff = ""
ElseIf Buff = Chr$(10) Then
CRFlag = False
Buff = ""
If Not CRFlag Then
Buffer1 = Buffer1 + Buff
End If
Next i
Print #FileReceive, Buffer1
End If
If InStr(Buffer, "END FILE") Then
Close #FileReceive
Call Form_Load
End If
Case comEvEOF
lblStatus = "Disconnected"
Connected = False
End Select
End Sub

Private Sub Timer1_Timer()


lblReceive.Visible = Not lblReceive.Visible
End Sub

Private Sub txtSend_LostFocus()


On Error GoTo Loi
lblSize.Caption = Str(Round(FileLen(txtSend.Text) /
1024, 2)) + "KB"
Exit Sub
Loi:
lblSize.Caption = "0 KB"
txtSend.Text = ""
End Sub

Phạm Hùng Kim Khánh Trang 113


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

7. Mạng 485
Chuẩn RS232 dùng đường truyền không cân bằng vì các tín hiệu lấy chuẩn là GND
chung nên dễ bị ảnh hưởng của nhiễu làm tốc độ và khoảng cách truyền bị giới hạn. Khi
muốn tăng khoảng cách truyền, môt phương pháp có thể sử dụng là dùng 2 dây truyền vi sai
vì lúc này 2 dây có cùng đặc tính nên sẽ loại trừ được nhiễu chung. Hai chuẩn được sử dụng
là RS422 và RS485 nhưng thông thường sử dụng RS485. Điện áp vi sai yêu cầu phải lớn
hơn 200mV. Nếu VAB > 200 mV thì tương ứng với logic 1 và VAB < -200 mV tương ứng với
logic 0. Chuẩn RS485 sử dụng hai điện trở kết thúc là 120 Ω tại hai đầu xa nhất của đường
truyền và sử dụng dây xoắn đôi.

Hình 4.13 – Chuẩn giao tiếp RS422

Hình 4.14 – Chuẩn giao tiếp RS485

Các đặc tính kỹ thuật:


Đặc tính RS422 RS485
Số thiết bị truyền 1 32
Số thiết bị nhận 10 32

Phạm Hùng Kim Khánh Trang 114


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 4

Chiều dài cable cực đại 1200m 1200m


Tốc độ truyền cực đại (từ 12 – 1200m) 10Mps – 100Kbps 10Mps – 100Kbps
Điện áp cực đại tại ngõ ra thiết bị truyền -0.25V ÷ 6V -7V ÷ 12V
Điện áp ngõ vào thiết bị nhận -10V ÷ 10V -7V ÷ 12V

Đối với chuẩn RS232, khoảng cách truyền không cho phép đi xa nên khi muốn thực
hiện truyền ở khoảng cách xa thì phải chuyển từ RS232 sang chuẩn RS485 để truyền đi và
sau đó chuyển từ RS485 sang RS232 để máy tính có thể nhận dạng được. Sơ đồ mạch
chuyển đổi từ RS232 sang RS485 và ngược lại mô tả như sau:

1
2
3
1 4 6 120 4
6 DI A 7 5
2 13 12 3 B 6
7 R1IN R1OUT VCC 2 DE 1 7
3 14 11 RE RO 8
8 T1OUT T1IN
4 1 MAX485
9 C+ CON8
5 6 MAX232 3
V- C1- 10u
DB9 10u 4 6 4
R2OUT
T2OUT

2 C2+ 7 A DI
R2IN

T2IN

V+ 5 B 3
C2- 10u 1 DE 2 120
10u RO RE
8

10

VCC
MAX485
10u

Hình 4.15 – Chuyển đổi từ RS323 sang RS485 và ngược lại

Phạm Hùng Kim Khánh Trang 115


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 5

Chương 5
GIAO TIẾP CỐNG SONG SONG
1. Cấu trúc cổng song song
Cổng song song gồm có 4 đường điều khiển, 5 đường trạng thái và 8 đường dữ liệu
bao gồm 5 chế độ hoạt động:
- Chế độ tương thích (compatibility).
- Chế độ nibble.
- Chế độ byte.
- Chế độ EPP (Enhanced Parallel Port).
- Chế độ ECP (Extended Capabilities Port).
3 chế độ đầu tiên sử dụng port song song chuẩn (SPP – Standard Parallel Port) trong
khi đó chế độ 4, 5 cần thêm phần cứng để cho phép hoạt động ở tốc độ cao hơn. Sơ đồ chân
của máy in như sau:

Chân Tín hiệu Mô tả


1 STR (Out) Mức tín hiệu thấp, truyền dữ liệu tới máy in
2 D0 Bit dữ liệu 0
3 D1 Bit dữ liệu 1
4 D2 Bit dữ liệu 2
5 D3 Bit dữ liệu 3
6 D4 Bit dữ liệu 4
7 D5 Bit dữ liệu 5
8 D6 Bit dữ liệu 6
9 D7 Bit dữ liệu 7
10 ACK (In) Mức thấp: máy in đã nhận 1 ký tự và có khả năng
nhận nữa
11 BUSY (In) Mức cao: ký tự đã được nhận; bộ đệm máy in đầy;
khởi động máy in; máy in ở trạng thái off-line.
12 PAPER EMPTY (In) Mức cao: hết giấy
13 SELECT (In) Mức cao: máy in ở trạng thái online
14 AUTOFEED (Out) Tự động xuống dòng; mức thấp: máy in xuống
dòng tự động
15 ERROR (In) Mức thấp: hết giấy; máy in ở offline; lỗi máy in
16 INIT (Out) Mức thấp: khởi động máy in
17 SELECTIN (Out) Mức thấp: chọn máy in
18-25 GROUND 0V

Cổng song song có ba thanh ghi có thể truyền dữ liệu và điều khiển máy in. Địa chỉ
cơ sở của các thanh ghi cho tất cả cổng LPT (line printer) từ LPT1 đến LPT4 được lưu trữ
trong vùng dữ liệu của BIOS. Thanh ghi dữ liệu được định vị ở offset 00h, thanh ghi trang

Phạm Hùng Kim Khánh Trang 116


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 5

thái ở 01h, và thanh ghi điều khiển ở 02h. Thông thường, địa chỉ cơ sở của LPT1 là 378h,
LPT2 là 278h, do đó địa chỉ của thanh ghi trạng thái là 379h hoặc 279h và địa chỉ thanh ghi
điều khiển là 37Ah hoặc 27Ah. Tuy nhiên trong một số trường hợp, địa chỉ của cổng song
song có thể khác do quá trình khởi động của BIOS. BIOS sẽ lưu trữ các địa chỉ này như sau:

Địa chỉ Chức năng


0000h:0408h Địa chỉ cơ sở của LPT1
0000h:040Ah Địa chỉ cơ sở của LPT2
0000h:040Ch Địa chỉ cơ sở của LPT3

Định dạng các thanh ghi như sau:


Thanh ghi dữ liệu (hai chiều):
7 6 5 4 3 2 1 0
Tín hiệu máy in D7 D6 D5 D4 D3 D2 D1 D0
Chân số 9 8 7 6 5 4 3 2

Thanh ghi trạng thái máy in (chỉ đọc):


7 6 5 4 3 2 1 0
Tín hiệu máy in BUSY ACK PAPER EMPTY SELECT ERROR IRQ x x
Số chân cắm 11 10 12 13 15 - - -

Thanh ghi điều khiển máy in:


7 6 5 4 3 2 1 0
Tín hiệu x x DIR IRQ SELECTIN INIT AUTOFEED STROBE
máy in Enable
Số chân cắm - - - - 17 16 14 1
x: không sử dụng
IRQ Enable: yêu cầu ngắt cứng; 1 = cho phép; 0 = không cho phép

Chú ý rằng chân BUSY được nối với cổng đảo trước khi đưa vào thanh ghi trạng
thái, các bit SELECTIN , AUTOFEED và STROBE được đưa qua cổng đảo trước khi đưa
ra các chân của cổng máy in.
Thông thường tốc độ xử lý dữ liệu của các thiết bị ngoại vi như máy in chậm hơn PC
nhiều nên các đường ACK , BUSY và STR được sử dụng cho kỹ thuật bắt tay. Khởi đầu,
PC đặt dữ liệu lên bus sau đó kích hoạt đường STR xuống mức thấp để thông tin cho máy
in biết rằng dữ liệu đã ổn định trên bus. Khi máy in xử lý xong dữ liệu, nó sẽ trả lại tín hiệu
ACK xuống mức thấp để ghi nhận. PC đợi cho đến khi đường BUSY từ máy in xuống thấp
(máy in không bận) thì sẽ đưa tiếp dữ liệu lên bus.

Phạm Hùng Kim Khánh Trang 117


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 5

2. Giao tiếp với thiết bị ngoại vi


2.1. Giao tiếp với máy tính
Quá trình giao tiếp với cổng song song dùng 2 chế độ: chế độ chuẩn SPP và chế độ
mở rộng. Việc giao tiếp ở chế độ chuẩn mô tả như sau:
13 13
25 25
12 12
24 24
11 11
23 23
10 10
22 22
9 9
21 21
8 8
20 20
7 7
19 19
6 6
18 18
5 5
17 17
4 4
16 16
3 3
15 15
2 2
14 14
1 1

Hình 5.1 - Trao đổi dữ liệu qua cổng song song giữa 2 PC dùng chế độ chuẩn

Sơ đồ chân kết nối mô tả như sau:

PC1 PC2
Chức năng Chân Chân Chức năng
D0 2 15 ERROR
D1 3 13 SELECT
D2 4 12 PAPER EMPTY
D3 5 10 ACK
D4 6 11 BUSY
BUSY 11 6 D4
ACK 10 5 D3
PAPER EMPTY 12 4 D2
SELECT 13 3 D1
ERROR 15 2 D0
GND 25 25 GND

Ngoài ra, việc kết nối giữa 2 máy tính sử dụng cổng song song có thể dùng chế độ
mở rộng, chế độ này cho phép giao tiếp với tốc độ cao hơn.

Phạm Hùng Kim Khánh Trang 118


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 5

13 13
25 25
12 12
24 24
11 11
23 23
10 10
22 22
9 9
21 21
8 8
20 20
7 7
19 19
6 6
18 18
5 5
17 17
4 4
16 16
3 3
15 15
2 2
14 14
1 1

Hình 5.2 - Trao đổi dữ liệu qua cổng song song giữa 2 PC dùng chế độ mở rộng

Sơ đồ chân kết nối mô tả như sau:

PC1 PC2
Chức năng Chân Chân Chức năng
D0 2 2 D0
D1 3 3 D1
D2 4 4 D2
D3 5 5 D3
D4 6 6 D4
D5 7 7 D5
D6 8 8 D6
D7 9 9 D7
SELECT 13 17 SELECTIN
BUSY 11 16 INIT
ACK 10 1 STROBE
SELECTIN 17 13 SELECT
INIT 16 11 BUSY
STROBE 1 10 ACK

2.2. Giao tiếp thiết bị khác


Quá trình giao tiếp với các thiết bị ngoại vi có thể thực hiện thông qua chế độ chuẩn.
Để đọc dữ liệu, có thể dùng một IC ghép kênh 2Æ1 74LS257 và dùng 4 bit trạng thái của
cổng song song còn xuất dữ liệu thì sử dụng 8 đường dữ liệu D0 – D7.

Phạm Hùng Kim Khánh Trang 119


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 5

74LS06

9 8

1 STROBE
10K1
14
2 3 2 9
15 4 D0 Q0 5 8
3 7 D1 Q1 6 7
16 8 D2 Q2 9 6
4 13 D3 Q3 12 5 VCC
17 14 D4 Q4 15 4
5 17 D5 Q5 16 3
18 18 D6 Q6 19 2 1
6 D7 Q7
19 11
7 CLK
20 1
8 OE
21
9 74LS374
22
10 ACK
23
11 PAPER EMPTY 74LS257 SW0-7
10K
24
12 SELECT 4 2 2 3 9
25 74LS06 7 1Y 1A 5 5 Q0 D0 4 8
13 9 2Y 2A 11 6 Q1 D1 7 7
BUSY 2 1 12 3Y 3A 14 9 Q2 D2 8 6
4Y 4A 12 Q3 D3 13 5 VCC
3 15 Q4 D4 14 4
74LS06 1B 6 16 Q5 D5 17 3
2B 10 19 Q6 D6 18 2 1
AUTO FEED 3 4 3B 13 Q7 D7
4B 11
1 CLK
74LS06 A/B 15 1
G OE
SELECT IN 5 6
74LS374

Hình 5.3 – Mạch giao tiếp đơn giản thông qua cổng máy in

Giao diện:

Hình 5.4 – Giao diện của chưnơg trình giao tiếp với cổng máy in
Chương trình giao tiếp trên VB sử dụng thư viện liên kết động để trao đổi dữ liệu với
cổng máy in. Thư viện IO.DLL bao gồm các hàm sau:
- Hàm PortOut: xuất 1 byte ra cổng

Phạm Hùng Kim Khánh Trang 120


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 5

Private Declare Sub PortOut Lib "IO.DLL" (ByVal Port


As Integer, ByVal Data As Byte)
Port: địa chỉ cổng, Data: dữ liệu xuất
- Hàm PortWordOut: xuất 1 word ra cổng
Private Declare Sub PortWordOut Lib "IO.DLL" (ByVal
Port As Integer, ByVal Data As Integer)
- Hàm PortDWordOut: xuất 1 double word ra cổng
Private Declare Sub PortDWordOut Lib "IO.DLL" (ByVal
Port As Integer, ByVal Data As Long)
- Hàm PortIn: nhập 1 byte từ cổng, trả về giá trị nhập
Private Declare Function PortIn Lib "IO.DLL" (ByVal
Port As Integer) As Byte
- Hàm PortWordIn: nhập 1 word từ cổng
Private Declare Function PortWordIn Lib "IO.DLL"
(ByVal Port As Integer) As Integer
- Hàm PortDWordIn: nhập 1 double word từ cổng
Private Declare Function PortDWordIn Lib "IO.DLL"
(ByVal Port As Integer) As Long

Chương trình nguồn:


VERSION 5.00
Begin VB.Form Form1
Caption = "Printer Interface Example"
ClientHeight = 4665
ClientLeft = 60
ClientTop = 345
ClientWidth = 3585
LinkTopic = "Form1"
ScaleHeight = 4665
ScaleWidth = 3585
StartUpPosition = 3 'Windows Default
Begin VB.CommandButton cmdReceive
Caption = "Receive"
Height = 495
Left = 1200
TabIndex = 18
Top = 3960
Width = 1095

Phạm Hùng Kim Khánh Trang 121


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 5

End
Begin VB.CheckBox chkSW
Height = 375
Index = 7
Left = 1800
TabIndex = 17
Top = 3480
Width = 1575
End
Begin VB.CheckBox chkSW
Height = 375
Index = 6
Left = 1800
TabIndex = 16
Top = 3000
Width = 1575
End
Begin VB.CheckBox chkSW
Height = 375
Index = 5
Left = 1800
TabIndex = 15
Top = 2520
Width = 1575
End
Begin VB.CheckBox chkSW
Height = 375
Index = 4
Left = 1800
TabIndex = 14
Top = 2040
Width = 1575
End
Begin VB.CheckBox chkSW
Height = 375
Index = 3
Left = 1800

Phạm Hùng Kim Khánh Trang 122


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 5

TabIndex = 13
Top = 1560
Width = 1575
End
Begin VB.CheckBox chkSW
Height = 375
Index = 2
Left = 1800
TabIndex = 12
Top = 1080
Width = 1575
End
Begin VB.CheckBox chkSW
Height = 375
Index = 1
Left = 1800
TabIndex = 11
Top = 600
Width = 1575
End
Begin VB.CheckBox chkSW
Height = 375
Index = 0
Left = 1800
TabIndex = 10
Top = 120
Width = 1575
End
Begin VB.CommandButton cmdExit
Caption = "Exit"
Height = 495
Left = 2400
TabIndex = 9
Top = 3960
Width = 975
End
Begin VB.CommandButton cmdSend

Phạm Hùng Kim Khánh Trang 123


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 5

Caption = "Send"
Height = 495
Left = 0
TabIndex = 8
Top = 3960
Width = 1095
End
Begin VB.Label lblLED
BackStyle = 0 'Transparent
Caption = "LED7"
Height = 375
Index = 7
Left = 240
TabIndex = 7
Top = 3480
Width = 1095
End
Begin VB.Label lblLED
BackStyle = 0 'Transparent
Caption = "LED6"
Height = 375
Index = 6
Left = 240
TabIndex = 6
Top = 3000
Width = 975
End
Begin VB.Label lblLED
BackStyle = 0 'Transparent
Caption = "LED5"
Height = 375
Index = 5
Left = 240
TabIndex = 5
Top = 2520
Width = 975
End

Phạm Hùng Kim Khánh Trang 124


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 5

Begin VB.Label lblLED


BackStyle = 0 'Transparent
Caption = "LED4"
Height = 375
Index = 4
Left = 240
TabIndex = 4
Top = 2040
Width = 975
End
Begin VB.Label lblLED
BackStyle = 0 'Transparent
Caption = "LED3"
Height = 375
Index = 3
Left = 240
TabIndex = 3
Top = 1560
Width = 975
End
Begin VB.Label lblLED
BackStyle = 0 'Transparent
Caption = "LED2"
Height = 375
Index = 2
Left = 240
TabIndex = 2
Top = 1080
Width = 975
End
Begin VB.Label lblLED
BackStyle = 0 'Transparent
Caption = "LED1"
Height = 375
Index = 1
Left = 240
TabIndex = 1

Phạm Hùng Kim Khánh Trang 125


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 5

Top = 600
Width = 975
End
Begin VB.Label lblLED
BackStyle = 0 'Transparent
Caption = "LED0"
Height = 375
Index = 0
Left = 240
TabIndex = 0
Top = 120
Width = 975
End
Begin VB.Shape shpLED
BorderColor = &H000000FF&
FillColor = &H000000FF&
FillStyle = 0 'Solid
Height = 375
Index = 7
Left = 840
Shape = 3 'Circle
Top = 3480
Width = 375
End
Begin VB.Shape shpLED
BorderColor = &H000000FF&
FillColor = &H000000FF&
FillStyle = 0 'Solid
Height = 375
Index = 6
Left = 840
Shape = 3 'Circle
Top = 3000
Width = 375
End
Begin VB.Shape shpLED
BorderColor = &H000000FF&

Phạm Hùng Kim Khánh Trang 126


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 5

FillColor = &H000000FF&
FillStyle = 0 'Solid
Height = 375
Index = 5
Left = 840
Shape = 3 'Circle
Top = 2520
Width = 375
End
Begin VB.Shape shpLED
BorderColor = &H000000FF&
FillColor = &H000000FF&
FillStyle = 0 'Solid
Height = 375
Index = 4
Left = 840
Shape = 3 'Circle
Top = 2040
Width = 375
End
Begin VB.Shape shpLED
BorderColor = &H000000FF&
FillColor = &H000000FF&
FillStyle = 0 'Solid
Height = 375
Index = 3
Left = 840
Shape = 3 'Circle
Top = 1560
Width = 375
End
Begin VB.Shape shpLED
BorderColor = &H000000FF&
FillColor = &H000000FF&
FillStyle = 0 'Solid
Height = 375
Index = 2

Phạm Hùng Kim Khánh Trang 127


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 5

Left = 840
Shape = 3 'Circle
Top = 1080
Width = 375
End
Begin VB.Shape shpLED
BorderColor = &H000000FF&
FillColor = &H000000FF&
FillStyle = 0 'Solid
Height = 375
Index = 1
Left = 840
Shape = 3 'Circle
Top = 600
Width = 375
End
Begin VB.Shape shpLED
BorderColor = &H000000FF&
FillColor = &H000000FF&
FillStyle = 0 'Solid
Height = 375
Index = 0
Left = 840
Shape = 3 'Circle
Top = 120
Width = 375
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
'IO.DLL
Private Declare Sub PortOut Lib "IO.DLL" (ByVal Port
As Integer, ByVal Data As Byte)

Phạm Hùng Kim Khánh Trang 128


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 5

Private Declare Function PortIn Lib "IO.DLL" (ByVal


Port As Integer) As Byte
'Variable
Private BA_LPT As Integer

Private Sub cmdExit_Click()


End
End Sub

Private Sub cmdReceive_Click()


Dim n As Integer
Dim n1 As Integer
Dim i As Integer

PortOut BA_LPT + 2, &H8 'SELECTIN = 1


PortOut BA_LPT + 2, 0 'SELECTIN = 0
n1 = PortIn(BA_LPT + 1) 'Doc 4 bit thap
n1 = n1 / &H10 'Dich phai 4 bit
PortOut BA_LPT + 2, 2 'AUTOFEED=1
n = PortIn(BA_LPT + 1) 'Doc 4 bit cao
n = n And &HF0
n = n + n1
For i = 0 To 7
chkSW(i).Value = n Mod 2
If chkSW(i).Value = 0 Then
chkSW(i).Caption = "Switch " & Str(i) &
" off"
Else
chkSW(i).Caption = "Switch " & Str(i) &
" on"
End If
n = Fix(n / 2)
Next i
End Sub

Private Sub cmdSend_Click()


Dim t As Integer
Dim i As Integer

Phạm Hùng Kim Khánh Trang 129


Tài liệu này được upload & download miễn phí tại website: http://hutonline.net
Tài liệu Lập trình hệ thống Chương 5

Dim s As String
t = 0
For i = 0 To 7
t = t + (2 ^ i) * (1 - shpLED(i).FillStyle)
Next i
PortOut BA_LPT, t
PortOut BA_LPT, 1 'STROBE = 1
PortOut BA_LPT, 0 'STROBE = 0
End Sub

Private Sub Form_Load()


BA_LPT = &H378
PortOut BA_LPT + 2, 0
End Sub

Private Sub lblLED_Click(Index As Integer)


shpLED(Index).FillStyle = 1 -
shpLED(Index).FillStyle
End Sub

Phạm Hùng Kim Khánh Trang 130

You might also like