You are on page 1of 139

BỘ GIÁO DỤC VÀ ĐÀO TẠO

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN

LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

TRÌNH ĐỘ ĐÀO TẠO: ĐẠI HỌC


NGÀNH ĐÀO TẠO: KỸ THUẬT ĐIỆN TỬ
LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

LỜI NÓI ĐẦU

Module lập trình điều khiển hệ thống cung cấp các kiến thức về: Cấu trúc vật
lý và giao tiếp của các cổng LPT, COM, USB, cổng trò chơi (Game), card âm thanh
và một số card mở rộng khác; Sử dụng các điều khiển truyền thông nối tiếp, lớp
SerialPort, thư viện DLL trong VB, C++ hoặc C# để lập trình cho các cổng giao
tiếp; Một số thiết bị ngoại vi cơ bản.
Cuốn đề cương này được biên soạn dựa trên khung chương trình module
“Lập trình điều khiển hệ thống” thuộc chương trình đào tạo theo định hướng nghề
nghiệp trong khuôn khổ dự án Hà Lan.
Cuốn đề cương này chứa nội dung của 29 bài học theo đúng trình tự và mục
tiêu thiết kế của chương trình.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 2


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

MỤC LỤC

LỜI NÓI ĐẦU..............................................................................................2


MỤC LỤC....................................................................................................3
LÝ THUYẾT................................................................................................8
Bài 1: Tổng quan về lập trình điều khiển hệ thống ...................................8
1.1. Mục tiêu của lập trình điều khiển hệ thống.........................................8
1.2. Ghép nối máy tính với các thiết bị......................................................8
1.3. Giao diện điều khiển, mô phỏng.........................................................9
1.4. Lập trình điều khiển thông qua các cổng ..........................................10
1.5. Công cụ lập trình điều khiển ............................................................10
Bài 2: Tổng quan về lập trình VB6 ........................................................11
2.1. Giới thiệu .........................................................................................11
2.2. Cấu trúc chương trình.......................................................................14
2.3. Biến, kiểu dữ liệu .............................................................................29
2.4. Quy trình phát triển một phần mềm..................................................40
Bài 3: Các cấu trúc điều khiển trong VB6..............................................40
3.1. Giới thiệu các cấu trúc điều khiển ....................................................40
3.2. Cấu trúc điều kiện ............................................................................41
3.3. Cấu trúc lặp......................................................................................42
Bài 4: Chương trình con và tham số.......................................................44
4.1. Giới thiệu chương trình con .............................................................44
4.2. Chương trình con dạng thủ tục .........................................................44
4.3. Chương trình con dạng hàm .............................................................44
4.4. Tham số ...........................................................................................45
4.5. Giới thiệu một số chương trình con có sẵn .......................................45
Bài 5: Các điều khiển trong VB6 ...........................................................45
5.1. Giới thiệu .........................................................................................45
5.2. Các điều khiển thông dụng ...............................................................46
5.3. Các điều khiển mở rộng ...................................................................53

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 3


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Bài 6: Xử lý file trong VB6 ...................................................................53


6.1. Giới thiệu .........................................................................................53
6.2. Làm việc với file văn bản.................................................................53
6.3. Làm việc với file truy cập ngẫu nhiên ..............................................55
Bài 7: Thiết kế giao diện và lập trình mô phỏng.....................................56
7.1. Thiết kế giao diện điều khiển ...........................................................56
7.2. Lập trình mô phỏng đồ họa ..............................................................56
7.3. Lập trình sử dụng các hàm API, thư viện DLL .................................57
Bài 8: Cơ bản về cổng LPT....................................................................60
8.1. Giới thiệu cổng LPT.........................................................................60
8.2. Tài nguyên hệ thống.........................................................................61
8.3. Cấu hình cổng ..................................................................................63
8.4. Kiến trúc phần cứng .........................................................................64
Bài 9: Lập trình giao tiếp qua cổng LPT ................................................68
9.1. Chân tín hiệu....................................................................................68
9.2. Các thanh ghi ...................................................................................71
9.3. Địa chỉ cổng.....................................................................................72
9.4. Lập trình cổng LPT ..........................................................................72
Bài 10: Cơ bản về cổng COM..................................................................86
10.1. Giới thiệu cổng COM.....................................................................86
10.2. Kiến trúc cổng................................................................................87
10.3. Cable truyền dữ liệu .......................................................................88
10.4. Chân tín hiệu..................................................................................89
10.5. Điện áp làm việc ............................................................................91
Bài 11: Giao thức truyền thông nối tiếp ...................................................92
11.1. Giao thức .......................................................................................92
11.2. Định dạng dữ liệu...........................................................................94
11.3. Đảm bảo chất lượng truyền thông...................................................95
Bài 12: Lập trình giao tiếp qua cổng COM ..............................................96
12.1. Tài nguyên hệ thống.......................................................................96

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 4


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

12.2. Công cụ và kỹ thuật lập trình........................................................ 100


12.3. Mở kết nối.................................................................................... 107
12.4. Gửi dữ liệu ................................................................................... 107
12.5. Nhận dữ liệu................................................................................. 107
12.6. Xử lý lỗi.......................................................................................107
12.7. Chương trình mẫu lập trình cổng COM ........................................ 108
Bài 13: Cơ bản về cổng USB ................................................................. 115
13.1. Giới thiệu cổng USB .................................................................... 115
13.2. Đầu nối USB................................................................................ 116
13.3. Cable truyền dữ liệu ..................................................................... 118
13.4. Tín hiệu và điện áp làm việc......................................................... 120
Bài 14: Giao thức truyền thông cổng USB ............................................. 122
14.1. Cấu trúc chung ............................................................................. 122
14.2. Thứ tự bit ..................................................................................... 123
14.3. Trường đồng bộ ........................................................................... 123
14.4. Định dạng góis ............................................................................. 123
14.5. Truyền dữ liệu.............................................................................. 125
Bài 15: Lập trình cổng USB................................................................... 128
15.1. Cơ bản về trình điều khiển thiết bị................................................ 128
15.2. Mô hình trình điều khiển thiết bị Win32....................................... 129
15.3. Chọn kiểu thiết bị......................................................................... 129
15.4. Lập trình Driver ........................................................................... 130
Bài 16: Cổng GAME và các giao tiếp mở rộng...................................... 130
16.1. Giới thiệu chung........................................................................... 130
16.2. Đầu nối và chân tín hiệu............................................................... 131
16.3. Lập trình cho cổng GAME ........................................................... 132
16.4. Các giao tiếp mở rộng .................................................................. 132
THỰC HÀNH .......................................................................................... 132
Bài 17: Cơ bản về VB6.......................................................................... 132
17.1. Kiến thức lý thuyết liên quan........................................................ 132

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 5


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

17.2. Bài tập thực hành ......................................................................... 133


Bài 18: Lập trình chương trình con ........................................................ 134
18.1. Kiến thức lý thuyết liên quan........................................................ 134
18.2. Bài tập thực hành ......................................................................... 134
Bài 19: Sử dụng các điều khiển cơ bản VB6 .......................................... 134
19.1. Kiến thức lý thuyết liên quan........................................................ 134
19.2. Bài tập thực hành ......................................................................... 134
Bài 20: Sử dụng các điều khiển mở rộng VB6 ....................................... 134
20.1. Kiến thức lý thuyết liên quan........................................................ 134
20.2. Bài tập thực hành ......................................................................... 135
Bài 21: Lập trình xử lý file .................................................................... 135
21.1. Kiến thức lý thuyết liên quan........................................................ 135
21.2. Bài tập thực hành ......................................................................... 135
Bài 22: Thiết kế giao diện...................................................................... 135
22.1. Quy tắc trình bày giao diện .......................................................... 135
22.2. Bài tập thực hành ......................................................................... 135
Bài 23: Thiết kế mô phỏng .................................................................... 135
23.1. Kiến thức lý thuyết liên quan........................................................ 135
23.2. Bài tập thực hành ......................................................................... 136
Bài 24: Tạo ActiveX Control ................................................................. 136
24.1. Kiến thức lý thuyết liên quan........................................................ 136
24.2. Bài tập thực hành ......................................................................... 136
Bài 25: Lập trình truyền thông qua cổng LPT - 1................................... 136
25.1. Kiến thức lý thuyết liên quan........................................................ 136
25.2. Bài tập thực hành ......................................................................... 136
Bài 26: Lập trình truyền thông qua cổng LPT - 2................................... 136
26.1. Kiến thức lý thuyết liên quan........................................................ 137
26.2. Bài tập thực hành ......................................................................... 137
Bài 27: Lập trình tuyền thông qua cổng COM - 1 .................................. 137
27.1. Kiến thức lý thuyết liên quan........................................................ 137

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 6


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

27.2. Bài tập thực hành ......................................................................... 137


Bài 28: Lập trình tuyền thông qua cổng COM - 2 .................................. 137
28.1. Kiến thức lý thuyết liên quan........................................................ 137
28.2. Bài tập thực hành ......................................................................... 137
Bài 29: Lập trình mô phỏng điều khiển hệ thống qua cổng COM........... 137
29.1. Kiến thức lý thuyết liên quan........................................................ 137
29.2. Bài tập thực hành ......................................................................... 138
TÀI LIỆU THAM KHẢO......................................................................... 139

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 7


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

LÝ THUYẾT

Bài 1: Tổng quan về lập trình điều khiển hệ thống

1.1. Mục tiêu của lập trình điều khiển hệ thống


Mục tiêu:
Lập trình được phần mềm có giao diện và chức năng phù hợp, đáp ứng được
nhiệm vụ giao tiếp và điều khiển thiết bị được ghép nối với máy tính qua cổng
truyền thông lựa chọn.
Nhiệm vụ lập trình điều khiển các thiết bị từ máy tính:
- Tạo giao diện người dùng: biểu diễn, mô phỏng các hoạt động cần thiết cho
các thiết bị được điều khiển, thể hiện các số liệu được gửi từ thiết bị, gửi lệnh, dữ
liệu đến thiết bị.
- Thực hiện ghép nối, giao tiếp với các thiết bị thông qua các cổng giao tiếp
của máy tính như: COM, LPT, USB,...
- Thực hiện truyền thông với thiết bị, điều khiển thiết bị thông qua các giao
thức làm việc chung của thiết bị và phần mềm điều khiển trên máy tính

1.2. Ghép nối máy tính với các thiết bị


Máy tính có thể ghép nối với các thiết bị khác thông qua các cổng truyền
thông có sẵn trên máy tính như các cổng COM, LPT, USB,... Ngoài ra, tùy nhu cầu
ghép nối, các thiết bị có thể được ghép nối thông qua các card giao tiếp được lắp bổ
sung vào máy tính trên các khe cắm mở rộng ISA, PCI,...
Các giao diện truyền thông, ghép nối trên máy tính thường được dùng để
giao tiếp và điều khiển thiết bị:
- Giao diện nối tiếp RS232 (COM): truyền thông theo giao thức chuẩn, dễ
ghép nối, tốc độ thấp, nhiều thiết bị hỗ trợ giao tiếp vật lý cũng như giao thức
truyền thông theo giao diện này. Giao diện RS232 là một trong các giao diện được
sử dụng phổ biến để ghép nối và điều khiển thiết bị.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 8


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

- Giao diện song song LPT: cổng LPT được thiết kế với mục đích chủ yếu là
ghép nối với máy in và để xuất dữ liệu in ấn cũng như điều khiển máy in. Tuy nhiên
với khả năng ghép nối và điều khiển lập trình, cổng này cũng có thể được sử dụng
trong ghép nối và điều khiển các thiết bị khác. Mặc dù là cổng song song nhưng tốc
độ điều khiển, truyền dữ liệu trên cổng này cũng không cao, khó khăn trong giao
tiếp vật lý cũng như lập trình điều khiển. Trong thực tế ít được dùng để ghép nối các
thiết bị khác.
- Giao diện USB: đây là chuẩn truyền thông nối tiếp cho phép truyền với tốc
độ cao và có khả năng tương thích tốt với nhiều loại thiết bị. Cổng này hiện nay
đang được sử dụng khá rộng rãi trong việc ghép nối và điều khiển các thiết bị từ
máy tính.
Cổng này có một số ưu điểm nổi trội:
+ Tốc độ cao
+ Giao tiếp đơn giản
+ Dễ tương thích
+ Hỗ trợ nguồn 5V công suất nhỏ
- Một số giao diện khác: giao diện GAME (thường dùng ghép nối cần điều
khiển để điều khiển chương trình trò chơi trên máy tính), các cổng vào ra trên Card
âm thanh, các khe cắm mở rộng (ISA, PCI, ...).

1.3. Giao diện điều khiển, mô phỏng


Giao diện một trong các phần khá quan trọng của một phần mềm máy tính
bất kỳ và một phần mềm điều khiển hệ thống nói chung. Thông qua giao diện,
người sử dụng có thể nhận biết được hoạt động và trạng thái của thiết bị hiện hành
và thực hiện được các điều khiển cho thiết bị.
Giao diện phải đảm bảo cho các thao tác được thuận tiện, hình ảnh, phương
tiện điều khiển, cách bố trí càng giống với các bộ điều khiển thực của thiết bị càng
tốt vì điều này giúp người sử dụng dễ sử dụng hơn, tận dụng được thói quen cũ.
Giao diện phải đơn giản nhưng đẹp, màu sắc và bố cục thích hợp.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 9


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Phần biểu diễn các số liệu, trạng thái của thiết bị trên giao diện nên thiết kế
sao có sát với các thiết bị thể hiện trên thiết bị thực như các đèn báo, LED 7 thanh,
đồng số, đồng hồ kim, thậm chí là sự chuyển động của các thành phần của thiết bị
thực,... Để thực hiện được yêu cầu này, thông thường phần mềm điều khiển cần có
phần mô phỏng các thiết bị thực và hoạt động của nó.
Phần công cụ điều khiển nên bố trí các nút bấm, cần gạt, núm xoay... ở
những vị trí cũng như có hình dạng tương tự như trên bàn điều khiển của máy (nếu
có). Các điều khiển dạng này thường không có sẵn trong bộ công cụ chuẩn của các
ngôn ngữ hay môi trường phát triển phần mềm. Người lập trình cần thiết kế bổ
sung.
1.4. Lập trình điều khiển thông qua các cổng
Tùy nhu cầu và khả năng ghép nối của thiết bị cần điều khiển với máy tính
mà phần mềm có sự lựa chọn và lập trình truyền thông trên các cổng tươong ứng.
Nói chung, với mỗi cổng lựa chọn cần đảm bảo thực hiện được các hoạt động gửi
và nhận dữ liệu chính xác; phân tích và tổng hợp được gói tin theo đúng định dạng
yêu cầu của thiết bị và cổng truyền thông.
Với các cổng có hỗ trợ sẵn giao thức truyền thông, việc lập trình trở lên đơn
giản hơn, chỉ cần xử lý dữ liệu để đáp ứng được yêu cầu điều khiển của thiết bị
được điều khiển. Những cổng không hỗ trợ sẵn giao thức truyền thông, việc lập
trình truyền thông qua các cổng này cẩn thiết phải bổ sung giao thức để đảm bảo
truyền đúng dữ liệu (phát hiện, sửa sai) và điều khiển được lưu lượng cũng như tốc
độ dữ liệu được truyền.
1.5. Công cụ lập trình điều khiển
Để lập trình điều khiển các thiết bị từ máy tính ta có thể sử dụng nhiều ngôn
ngữ khác nhau tùy thuộc yêu cầu, môi trường làm việc, cổng truyền thông được sử
dụng. Một số ngôn ngữ lập trình được sử dụng phổ biến hiện nay có hỗ trợ để lập
trình ghép nối điều khiển thiết bị từ máy tính như: Visual C, C++, Visual Basic 6.0,
.Net, ....
Ngôn ngữ hỗ trợ mạnh trong lập trình can thiệp sâu đến các lớp thiết bị và
phù hợp cho lập trình điều khiển thiết bị trên môi trường Window là C++. Tuy

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 10


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

nhiên ngôn ngữ lập trình Visual Basic 6.0 cũng là một công cụ cho phép thực hiện
các công việc này khá tốt. Đặc biệt là thuận tiện trong thiết kế giao diện và viết mã
điều khiển.

Bài 2: Tổng quan về lập trình VB6

2.1. Giới thiệu


2.1.1. Giới thiệu các phần của IDE
IDE là tên viết tắt của môi trường phát triển tích hợp (Inegreated
Development Enviroment). IDE là nơi tạo ra các chương trình VB.
IDE của VB là nơi tập trung các menu, thanh công cụ và cửa sổ để tạo ra
chương trình. Mỗi phần của IDE có các tính năng ảnh hưởng đến các hoạt động lập
trình khác nhau. Thanh menu cho phép bạn tác động cũng như quản lý trực tiếp trên
toàn bộ ứng dụng. Thanh công cụ cho phép truy cập các chức năng của thanh menu
qua các nút trên thanh công cụ.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 11


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Các biểu mẫu (Form) - khối xây dựng các chương trình Visual basic - xuất
hiện trong cửa sổ form. Hộp công cụ để thêm các điều khiển vào các biểu mẫu của
đề án. Project explorer hiển thị các đề án mà bạn đang làm cũng như các thành phần
của các đề án. Bạn duyệt và cài đặt các thuộc tính của điều khiển, biểu mẫu và
module trong cửa sổ property. Cuối cùng, bạn bố trí và xem xét một hoặc nhiều
biểu mẫu trên màn hình thông qua cửa sổ form layout.
2.1.2. Thêm và xoá các thanh công cụ trong IDE của Visual basic
Thanh công cụ là tập hợp các nút bấm mang biểu tượng chứa trong một
thanh thường đặt dưới thanh menu. Các nút này đảm nhận các chức năng thông
dụng trong cấu trúc menu của Visual basic. Thanh công cụ rất hửu ích, thay vì phải
lần lượt chọn qua menu và menu con, ta nhấn một nút bấm nào đó trong thanh công
cụ để gọi một chức năng tương tự trên menu.
Sử dụng thanh công cụ debug: Thanh công cụ debug dùng để kiểm tra
chương trình và giải quyết các lỗi có thể xảy ra. Khi gỡ rối chương trình, ta làm một
số việc như chạy từng dòng lệnh chương trình, kiểm tra giá trị các biến, và dừng
chương trình tại một điểm nghi ngờ hoặc dưới những điều kiện nào đó.
Sử dụng thanh công cụ Edit: Thanh công cụ Edit được dùng để viết
chương trình trong cửa sổ code. Các tính năng của thanh công cụ Edit tương tự như
các tính năng khác ở menu edit. Bạn có thể Cut, Paste văn bản...
Một tính năng lý thú của IDE là thanh công cụ Edit dùng tính năng Coplete
Word, tự động hoàn tất từ khoá. Tính năng Complete Word rất hữu ích để tránh các
lỗi cú pháp.
Sử dụng thanh công cụ Form Editor: Thanh công cụ form editor dùng để
kéo giãn, di chuyển và sắp xếp các điều khiển trên biểu mẫu. Thanh công cụ Form
editor có các tính năng như menu Format.
Sử dụng thanh công cụ chuẩn(Standard): Là thanh công cụ trọng yếu
trong IDE. Thanh công cụ chuẩn cung cấp nhiều tính năng trong menu file, Project,
Debug, và Run.
2.1.3. Thêm các điều khiển vào hộp công cụ

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 12


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Hộp công cụ là bảng chứa các điều khiển và ta thiết kế giao diện người sử
dụng bằng cách chọn các điều khiển từ hộp công cụ và đưa chúng vào các biểu mẫu.
Một số điều khiển có sẵn trong Visual basic và không thể gỡ bỏ khỏi hộp
công cụ. Một số khác nằm bên ngoài Visual basicvà chứa trong các tập tin mà có
phần mở rộng là. ocx. Các điều khiển này có thể được thêm vào hoặc gỡ bỏ khỏi
thanh công cụ.
2.1.4. Định hướng thông qua cửa sổ form và code
Nếu điều khiển là những khối bê tông mà ta tập hợp trong ứng dụng thì biểu
mẫu là nền móng để ta xây dựng các khối này.
Các biểu mẫu chứa trong cửa sổ Thiết kế biểu mẫu. Ta sẽ làm việc trong cửa
sổ này để thêm các điều khiển vào biểu mẫu.
Đối với từng cửa sổ thiết kế mẫu, ta cũng có thể mở cửa sổ code. Cửa sổ
code là nơi ta viết các đoạn chương trình chạy bên dưới biểu mẫu. Ta có thể mở cửa
sổ code bằng cách nhấn đúp lên biểu mẫu hoặc điều khiển, hoặc chọn code từ menu.
2.1.5. Quản lý ứng dụng với project explorer
Project explorer trong Visual basic giúp quản lý và định hướng nhiều đề án.
Visual basic cho phép tổ chức nhiều đề án trong một nhóm gọi là project
group. Ta có thể lưu tập hợp các đề án trong Visual basic thành một tập tin nhóm đề
án. Các tập tin này có phần mở rộng là.vbg.
2.1.6. Cửa sổ properties
Mỗi thuộc tính có một hoặc nhiều giá trị. Cửa sổ properties giúp bạn xem sửa
đổi và điều khiển các thuộc tính của các điều khiển ActivateX trong chương trình.
2.1.7. Hiển thị IDE
Ta có thể xem IDE của Visual basic bằng 2 cách: MDI hoặc SDI. Hiển thị
kiểu MDI(Multiple document interface) cho phép trình bày tất cả các cửa sổ thành
phần trong IDE như là các cửa sổ con chứa trong một cửa sổ lớn.
Trái lại đối với hiện thị SDI(single document interface), các cửa sổ thành
phần hiển thị một cách độc lập với nhau. Không có một cửa sổ chính để chứa và
thống nhất các thành phần.
Chuyển đổi từ hiển thị MDI sang SDI

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 13


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

- Chọn Tools\option\
- Trên tang Advance, chọn hộp đánh dấu SDI development Enviroment;
nhấn OK. IDE của Visual basic sẽ định lại cấu hình cho hiển thị SDI trong lần khởi
động tiếp sau của Visual basic.
- Nhấn OK, thoát và khởi động lại Visual basic
2.1.8. Trợ giúp
Không những làm chủ ngôn ngữ lập trình Visual basic, bạn cũng cần phải sử
dụng thuần thục môi trường Visual basic cũng như hiểu các thông điệp mà Visual
basic gửi ra. Microsoft cung cấp một trong những hệ thống trợ giúp tốt nhất cho các
công cụ phát triển ứng dụng.
Trợ giúp nhạy với ngữ cảnh
Tại một vị trí bất kỳ trong Visual basic, bạn nhấn phím F1, nút trợ giúp. Nó
sẽ kích hoạt hệ thống trợ giúp của Visual basic, nơi có thể giải thích hoặc đưa ra
những lời khuyên, cũng như các đoạn chương trình mẫu.
Visual basic có hệ thống trợ giúp là hệ thông thư viện MSDN được sử dụng
rộng rãi cho các công cụ phát triển của Microsoft để cung cấp truy cập đến sổ tay
hướng dẫn sử dụng sản phẩm trực tuyến.

2.2. Cấu trúc chương trình


Một chương trình được viết trong Visual Basic 6 (VB) thường tổ chức thành
một dự án. Trong một dự án thường có module chuẩn, các form (biểu mẫu), các
điều khiển người dùng, các lớp. Trên các form thường có các điều khiển như nút
lệnh, hộp nhập văn bản...
Chương trình thường bắt đầu chạy từ một form nào đó trong số các form
hoặc từ một thủ tục có tên là Main thuộc một module chuẩn. Bắt đầu chạy từ form
hay một thủ tục trong module là do thiết lập cấu hình cho dự án.
2.2.1. Thuộc tính phương thức và sự kiện
Đối tượng
Trong VB, đối tượng là những thành phần tạo nên giao diện giữa người sử
dụng cho ứng dụng. Các điều khiển là những đối tượng. Những nơi chứa (container)

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 14


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

như biểu mẫu(form), khung(frame), gay hộp ảnh (picture box) cũng là một đối
tượng.
VB 6 hỗ trợ một cách lập trình tương đối mới, lập trình hướng đối tượng
(Object Oriented Programming).
Trong lập trình cổ điển, ta có kiểu lập trình theo cấu trúc. Nếu như ứng dụng
được thiết kế để giải quyết một vấn đề lớn, thì lập trình viên có thể chia thành nhiều
vấn đề nhỏ và viết các đoạn chương trình nhỏ để giải quyết riêng từng cái.
Với lập trình hướng đối tượng, lập trình viên sẽ chia nhỏ vấn đề cần giải
quyết hành các đối tượng. Từng đối tượng sẽ có đời sống riêng của nó. Nó có các
đặc điểm mà ta gọi là thuọcc tính và những chức năng riêng biệt mà ta gọi là
phương thức.
Lập trình viên cần đưa ra các thuộc tính và phơưng thức mà các đối tượng
cần thể hiện.
Thuộc tính
Nói một cách đơn giản, thuộc tính mô tả đối tượng.
Mỗi đối tượng cộng đều có một bộ thuộc tính mô tả đối tượng. Biểu mẫu và
điều khiển đều có thuộc tính. Thậm chí màn hình và máy in là những đối tượng chỉ
cho phép can thiệp lúc thi hành cũng có thuộc tính.
Mặc dù mỗi đối tượng có những bộ thuộc tính khác nhau, nhưng trong đó
vẫn còn một số thuộc tính thông dụng cho hầu hết các điều khiển.(bạn có thể xem
toàn bộ thuộc tính của một điều khiển bằng cách chọn vào điều khiển và mở cửa
sổ PROPERTIES trong Visual Basic).
Các thuộc tính thông dụng:

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 15


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Một thuộc tính quan trọng khác là BorderStyle, quyết định các thành phần
của cửa sổ (như thanh tiêu đề, nút phóng to thu nhỏ…) mà một biểu mẫu sẽ có

Bảng sau đây liệt kê 6 giá trị của thuộc tính này.

Phương thức
Là những đoạn chương trình chứa trong điều khiển, cho điều khiển biết cách
thức để thực hiện một công việc nào đó, chảng hạn dời điều khiển đến một vị trí

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 16


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

mới trên biểu mẫu. Tương tự thuộc tính, mỗi điều khiển có những phương thức
khác nhau, nhưng vẫn có một số phương thức rất thông dụng cho hầu hết các điều
khiển..
Các phương thức thông dụng

Sự kiện
Nếu như thuộc tính mô tả đối tượng, phương thức chỉ ra cách thức đối tượng
hành động thì sự kiện là những phản ưúng của đối tượng.
Tương tự thuộc tính và phương thức, mỗi điều khiển có những bộ sự kiện
rất thông dụng với hầu hết các điều khiển. Các sự kiện này xảy ra thường là kết quả
của một hành động nào đó, như là di chuyển chuột, nhấn nút bàn phím, hiặc gõ vào
hộp văn bản. kiểu sự kiện này được gọi là sự kiện khởi tạo bởi người sử dụng, và ta
sẽ phải lập trình cho chúng.
Các sự kiện thông dụng

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 17


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Mối quan hệ giữa phương thức, thuộc tính và sự kiện


Mặc dù thuộc tính, phương thức và sự kiện có vai trò khác nhau nhưng
chúng thường xuyên liên hệ với nhau. Ví dụ nếu ta di chuyển một điều khiển bằng
phương thức Move (thường đáp ứng một số sự kiện) một số thuộc tính như Top,
Height, Left, Width sẽ thay đổi theo. Bởi vì khi kích cỡ của điều khiển thay đổi,
sự kiện Resize sẽ sảy ra.
Phụ thuộc lẫn nhau còn có nghĩa là ta có thể đạt được mjục đích công việc
bằng nhiều cách: xử lýu trên thuộc tính hoặc phương thức. Ví dụ, ta có 2 cách để di
chuyển nút lệnh:
a. thuộc tính
cmdMove.Left=100
cmdMove.Top=100
b. phương thức
cmdMove.Move 100,100
Một ví dụ khác, làm một biểu mẫu xuất hiện và biến mất trên màn hình

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 18


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

c. thuộc tính
‘xuất hiện
frmMyForm.Visible =True
‘Biến mất
frmMyForm.Visible =False
d. phương thức
‘xuất hiện
frmMyForm.Show
‘Biến mất
frmMyForm.Hide

2.2.2. Cửa sổ Properties


Cửa sổ này cho phép lập trình viên xem xét và sửa đổi các thuộc tính của
biểu mẫu và các điều khiển trong lúc thiết kế Phần trên cửa sổ là các danh sách đối
tượng, đối tượng được chọn trong danh sách này có các thuộc tính của nó hiển thị
trong phần bên dưới của cửa sổ.

Thuộc tính Caption được đánh dấu, nghĩa là ta có thể sửa đổi thuộc tính này.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 19


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Từng thuộc tính có một giá trị mặc định. ta có thể sửa đổi bằng tay trong lúc
thiết kế, hoặc bằng chương trình trong lúc thi hành.
Một biểu mẫu có khoảng 40 thuộc tính được hiển thị trong lúc thiết kế,
nhưng ta có thể truy cập một số thuộc tính khác vào trong lúc thi hành.
Ta có thẻ xem toàn bộ thuộc tính xắp xếp theo thứ tự bảng chữ cái bằng cách
chọn vào tab Alphabetic, hoặc xem theo từng nhóm bằng cách chọn vào tab
Categozized.
Ta có thể mở cửa sổ Properties bằng nhiều cách:
a. nhấn chuộtvào biểu mẫu để chpnj nó như một đối tượng hiện hành, nhấn
phím F4 để hiển thị cửa sổ Properties
b. Hoặc là từ menu_View, chọn Properties
c. hoặc là nhấn nút phải chuột lên biểu mẫu, ta sẽ thấy một menu hiển thị
chọn Properties.

2.2.3. Làm việc với một đề án


Một đề án thường có :
a. 1 tệp tin đề án (.vbp) theo dõi toàn bộ các thành phần
b. 1 tệp tin cho biểu mẫu (.frm)
c. 1 tệp tin nhị phân (.frx) cho từng biểu mẫu. Người sử dụng không được
sửa đổi. Các tập tin này được phát sinh tự động cho mỗi tập tin .frm bất kỳ và dùng
để chứa các thuộc tính nhị phân như Picture hay Icon.
d. 1 tệp tin cho từng module lớp (.cls)- tuỳ chọn
e. 1 tệp tin cho từng module chuẩn (.bas)- tuỳ chọn
f. 1 hoặc nhiều tệp tin chứa các điều khiển Activex (.ocx)- tuỳ chọn
g. 1 tệp tin tài nguyên (.res)- tuỳ chọn
Cửa sổ Project Explorer
Cửa sổ này thường được hiển thị bên góc phải trên màn hình Visual Basic.
Project Explorer giúp ta tổ chức các tệp tin trong đề án và truy cập chúng dưới
dạng thiết kế biểu mẫu hoặc chương trình.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 20


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Để làm việc với cửa sổ này ta dùng menu nhạy với ngữ cảnh. menu này xuất
hiện khi ta nhấn nút phải chuột vào một tệp tin trong cửa sổ. Khi đó, ta có thể:
a. xem một tệp tin dưới dạng thiết kế biểu mẫu hoặc chương trình
b. xem thuộc tính của tệp tin
c. Thêm một biểu mẫu hoặc module vào đề án
d. Lưu tệp tin hiện hành
e. Xoá một tệp tin khỏi đề án
f. in tệp tin
g. ghi hoặc thả cho cửa sổ Project Explorer di động trong màn hình VB
h. che cửa sổ Project Explorer
Tạo đề án
Mỗi lần khởi động Visual Basic, ta sẽ thấy hộp thoại New Project. Từ đây, ta
có thể chọn loại đề án mà ta muốn tạo và ấn Open.
Khi Visual Basic đã có sẵn, ta có thể tạo đề án bằng cách: từ menu File chọn
New Project. Hộp thoại New Project xuất hiện, ta chọn loại đề án cần thiết và nhấn
OK.
Đổi thuộc tính đề án

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 21


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Một số thông tin liên quan đề án như tên đề án, số phiên bản, chuỗi ký tự
dùng hiển thị trên thanh tiêu đề khi ứng dụng hoàn thành. Ta có thể xem các thông
tin khác trong hộp thoai Project Properties
Hộp thoại Project Properties
1. trong cửa sổ Project Explorer, nhấn nút phải chuột lên tệp tin đề án
2. trong menu ngữ cảnh, Chọn Project Name Properties. Hộp thoại
Project Properties xuất hiện
3. Hoặc là từ menu Properties, chọn Project Name Properties
Lưu đề án
Khi lưu đề án từng tập tin trong đề án sẽ được lưu trước kế tiếp là tệp tin đề
án. Trong lần lưu đề án đầu tiên, Visual Basic đề nghị tên cho từng tệp tin, thường
nó lấy tên biểu mẫu và có phần mở rrộngt uỳ thuộc vào loại tệp tin
1. từ menu file chọn Save Project
2. nếu đây là lần đầu lưu đề án hoặc ta vừa thêm một biểu mẫu hoặc
module, hộp thoại save File as xuất hiện lần lượt cho từng tệp tin
Đổi tên
Ta không nhất thiết dùng tên mà Visual Basic đề nghị, mà có thể đặt tuỳ ý,
tuy nhiên nên đặt tên sao cho gợi nhớ:
1. Đưa vào một tên và ấn nút save
2. Tập tin cuối cùng được lưu là tệp tin đề án Nếu ta đã đặt tên cho đề án
thông qua hộp thoại project properties, Visual Basic sẽ tự động đề nghị
Project_Name.vbp. Lúc này, ta có thể đổi lại tên khác tuỳ thích, ví dụ như
SaveTest.vbp
Mở đề án có sẵn
Ta có một số đề án đang làm việc. Khởi động Visual Basic, chọn menu File.
Phần dưới menu liệt kê danh sách các đề án mới nhất mà ta đã làm việc, chọn đề án
cần mở. Nếu đề án không xuất hiện trong danh sách, ta phải chỉ ra đường dẫn.
Mở tệp tin vào lúc khởi động Visual Basic
Lần đầu khởi động Visual Basic, hộp thoại New project xuất hiện. ta có thể
chọn mở đề án mới nhất hoặc có sẵn trên đĩa ngay từ hộp thoại này. nếu không

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 22


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

muốn hộp thoại này xuất hiện mỗi lần khởi động Visual Basic, xoá đánh dấu trên
hộp đánh dấu (checkbox) nằm ở bên dưới hộp thoại.
Mở đề án
a. Từ menu File, chọn Open Project.
b. trên trang Existing, chuyển đén thư mục chứa đề án. nếu đề án cần mở là
đề án lưu gần nhất, chuyển sang trang Recent
c. chọn tên tệp tin đề án và nhấn OK

Thêm xoá và lưu tập tin trong đề án


Thêm mới tệp tin
Thông thường, một biểu mẫu cần nhiều biểu mẫu hợăc module. Ví dụ muốn
thêm hộp thoại About, ta cần thêm một biểu mẫu.
Dưới đây là các dạng tệp tin có thể thêm vào đề án :
a. biểu mẫu (form): tệp tin.frm chứa môtả của một biểu mẫu và các điều
khiển, kể cả các thuộc tính của chúng. Nó cũng chứa khai báo các hằng, biến và thủ
tục

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 23


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

b. Lớp (Class) là một trong những tính năngquan trọng nhất của Visual
Basic, được dùng trong lập trình hướng đối tượng để định nghĩa các khuôn mẫu cho
các đối tượng.
c. module chuẩn chứa các khai báo kiểu, hằng, biến, thủ thuộc phạm vi
public hoặc ở mức module
d. tệp tin tài nguyên; chứa hình ảnh, chuối ký tự và các dữ liệu khác ta có
thể soạn thảo mà không cần sửa lại mã nguồn
e. tài liệu ActiveX (.dob) tương tự biểu mẫu nhưng được hiển thị trong trình
duyệt xét WEB, như là Internet Explorer.
f. Module điều khiển (.ctl) và module Property page (.pag) tương tự biểu
mẫu, nhưng được dùng để tạo điều khiển ActiveX và danh sách các thuộc tính của
chúng để hiển thị khi thiết kế
g. điều khiển ActiveX (.ocx) có thể được thêm vào hộp công cụ để dùng
trong biểu mẫu. Khi Visual Basic được cài đặt, một số tệp tin dạng này kèm theo
Visual Basic sẽ được chép vào trong máy
h. đối tượng, như là Worksheet của Excel
i. tham chiếu (Reference)
j. trình thiết kế ActiveX : là công cụ dùng để thiết kế các lớp cho đối tượng.
Giao diện thiết kế biểu mẫu là một trình thiết kế mặc định
k. các điều khiển thông dụng là nút lệnh điều khiển khung được Visual
Basic cung cấp sẵn.ẫnt có thể thêm tệp tin bằng hai cách;
Cách 1:
- từ menu Project, chọn Add, một hộp thoại xuất hiện

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 24


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

- nếu muốn tạo mới, chọn tab new. Visual Basic cung cấp các danh sách có
sẵn
- nếu muốn dùng một tệp tin có sẵn, chọn Tab Existing, chọn tên tệp tin,
nhấn Open
Cách 2:
- Nhấn nút chuột trong cửa sổ Project Explorer
- Trong menu ngữ cảnh chọn Add
- xuất hiện hộp thoại như trên

Xoá tệp tin


a. Chọn tệp tin trong cửa sổ Project Explorer
b. Từ menu Project chọn Remove
c. Tham chiếu tệp tin bị xoá trong đề án (thực chất nó vẫn được lưu trên đĩa)
Khi một tệp tin trong đề án bị xoá Visual Basic sẽ cập nhật những thay đổi
này trong tập tin.vbp khi ta lưu đề án. Do đó néu ta xoá tệp tin bên ngoài Visual
Basic, tệp tin đề án sẽ không được cập nhật. khi ta mở lại đề án Visual Basic sẽ báo
lỗi là thiếu tệp tin
Lưu tệp tin

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 25


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

a. Chọn tệp tin trong cửa sổ Project Explorer


b. từ menu chọn Save

Thêm điều khiển vào đề án


Thêm điều khiển ActiveX
Ta có thể thêm vào đề án một điều khiển ActiveX và các đối tượng nhúng
được bằng cách thêm nó vào hộp công cụ.
1. Từ menu Project chọn components
2. Để thêm một điều khiển (.ocx) hoặc thêm một đối tượng nhúng vào hộp
công cụ, chọn vào hộp đánh dấu bên trái tên điều khiển
3. Chọn OK để đóng hộp thoại. Các điều khiển đánh dấu sẽ hiển thị trên hộp
công cụ.

Để thêm điều khiển ActiveX vào hộp thoại Components, nhấn nút Browse
để tìm đường dẫn cho tệp tin.OCX mỗi điều khiển ActiveX có kèm theo một tệp tin
mở rộng là.OCA Tệp tin này chứa các thông tin cảu thư viện kiểu lưu trữ và các dữ
liệu liên quan đến điều khiển.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 26


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Các tệp tin.OCA chứa trong cùng thư mục với điều khiển ActiveX và được
tạo lại khi cần.
Xoá điều khiển khỏi đề án
1. từ menu project, chọn Components
2. hộp thoại Components xuất hiện, chọn điều khiển mà ta muốn xoá, xoá
hộp đánh dấu kế bên nó, điều khiển sẽ bị xoá khỏi hộp công cụ. Chú ý là chỉ bỏ
được điều khiển khỏi công cụ khi nó không được sử dụng trong đề án.
Sử dụng đối tượng của ứng dụng khác
Để lấy đối tượng từ một ứng dụng nào đó, ví dụ ta muốn sử dụng thư viện
đối tượng của Microsoft Excel, đặt tham chiếu đến thư viện đối tượng của ứng dụng
đó Thêm tham chiếu đến thư viện đối tượng của ứng dụng khác
1. từ menu Project, chọn References

2. Hộp thoại References xuất hiện, chọn vào hộp đánh dấu. nếu tên tham
chiếu chưa có sẵn trong danh sách, nhấn Browse vào ứng dụng và ấn OK .
Nếu không muốn tiếp tục sử dụng đối tượng của thư viện tham chiếu. Ta nên
xoá đánh dấu tham chiếu để giảm số tham chiếu mà Visual Basic đang quản lý,
giảm được thời gian biên dịch đề án,...

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 27


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Khi có tham chiếu đến thư viện đối tượng, ta có thể lấy được đối tượng cùng
với các thuộc tính và phương thức của nó bằng cách vào menu view, chọn Object
Browser.
Thêm tệp tin tài nguyên vào đề án
Tệp tin tài nguyên chứa toàn bộ các hình ảnh, biểu tượng, chuỗi văn bản hiển
thị trên màn hình và các thành phần khác liên quan đến việc địa phương hoá ứng
dụng.
a. từ menu project, chọn Add File
b. Chọn tệp tin tài nguyên có sẵn (.RES) và chọn Open
Một đề án đơn giản chỉ có một tệp tin tài nguyên, nếu thêm một tệp tin.RES
thứ hai, Visual Basic sẽ báo lỗi.

Tạo tệp tin EXE


Các ví dụ trên đây được thi hành thông qua nút Start của Visual Basic hoặc
nhấn F5. Tuy nhiên khi chương trình hoàn tất, ta cần có một tệp tin thi hành, hay tập
tin EXE. Để tạo tệp tin EXE, ta vàomenu File, chọn Make ... (sau Make là tên file
EXE sẽ được tạo ra, thường lấy tên đề án).

Sửa đổi thuộc tính đề án


Từ menu Project, chọn <tên đề án > Properties. Hộp thoại Project Properties
xuất hiện. những sửa đổi trên hộp thoại này sẽ được lưu trên tệp tin.vbp

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 28


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Bảng sau là giải thích cho một số lựa chọn:

2.3. Biến, kiểu dữ liệu


Biến dùng để chứa dữ liệu tạm thời cho tính toán, so sánh các hoạt động
khác. Ta dùng toán tử (=) để tính toán và chứa giá trị vào biến.
2.3.1. Khai báo biến
Để khai báo biến ta dùng lệnh Dim:
Dim <Tên biến > [As<kiểu dữ liệu>]
Biến khai báo trong thủ tục chỉ tồn tại khi thủ tục thi hành. Nó sẽ biến mất
khi thủ tục chấm dứt. Giá trị của biến trong thủ tục là cục bộ đối với thủ tục đó,

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 29


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

nghĩa là ta không thể truy nhập biến từ bên ngoài thủ tục. Nhờ đó, ta có thể dùng
trùng tên biến cục bộ trong những thủ tục khác.
Kiểu dữ liệu trong khai báo Dim có thể là những kiểu cơ bản như Integer,
String hoặc Currency. Ta cũng có thể dùng đối tượng của VB (như Object, Form1,
TextBox) hoặc của các ứng dụng khác.
Khai báo biến trong phần Declarations của một module nghĩa là biến đó tồn
tại và có tầm hoạt động trong module đó.
Khai báo biến với từ khoá Public nghĩa là biến đó tồn tại và có tầm hoạt
động của toàn ứng dụng .
Khai báo biến cục bộ với từ khoá Static nghĩa là mặc dầu biến đó biến mất
khi thủ tục chấm dứt, nhưng giá trị của nó vẫn được giữ lại để tiếp tục hoạt động khi
thủ tục được gọi trong lần sau.
2.3.2. Khai báo ngầm
Nghĩa là ta không cần khai báo tường minh trước khi sử dụng biến. Ví dụ:
Function SafeSqr(num)
TempVal = Abs(num)
SafeSqr = Sqr(TempVal)
End Function
Mặc dù cách này có vẻ thuận tiện nhưng có thể gây lỗi nếu ta gõ nhầm tên
biến.
Function SafeSqr(num)
TempVal = Abs(num)
SafeSqr = Sqr(TemVal)
End Function
Hàm này trả về zero. Khi VB gặp tên mới, nó tạo ra một biến khác với tên
đó.
2.3.3. Khai báo tường minh
Để tránh những rắc rối trên, ta nên quy định VB phải báo lỗi khi gặp một tên
biến không khai báo. Ta đặt dòng lệnh:
Option Explicit

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 30


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Trong phần Declarations của mô-đun. Một cách khác, từ menu Tools, chọn
Options, chọn tab Editor và đánh dấu vào tuỳ chọn Require Variable Declaration.
VB tự động chèn dòng lệnh Option Explicit vào một mô-đun mới, nhưng không
phải là những mô-đun đã được tạo. Do đó, đối với các mô-đun này, ta phải thêm
dòng lệnh bằng tay.
Option Explicit chỉ hoạt động trên từng mô-đun. Vì vậy, ta phải thêm dòng
này vào mỗi mô-đun của biểu mẫu, mô-đun chuẩn, hay mô-đun lớp.
2.3.4. Hằng
Dùng để chứa những dữ liệu tạm thời nhưng không thay đổi trong suốt thời
gian chương trình hoạt động. Sử dụng hằng số làm chương trình sáng sủa và dễ đọc
nhờ những tên gợi nhớ thay vì các con số. VB cung cấp một số hằng định nghĩa sẵn,
nhưng ta có thể tự tạo hằng.
Ta có thể dùng cửa sổ Object Browser để xem danh sách các ứng dụng hằng
có sẵn của VB và VBA( Visual basic for Application). Các ứng dụng khác cung cấp
những thư viện đối tượng, như Microsoft Exel, Microsoft Project, hoặc các thư viện
của điều khiển ActiveX cũng có hằng định nghĩa sẵn.
Trong trương hợp trùng tên hằng trong những thư viện khác nhau, ta có thể
dung cách chỉ rõ tham chiếu hằng:
[<Libname>][<tên mô-đun>]<tên hằng>
Libname là tên lớp, tên điều khiển hoặc tên thư viện.
Khai báo hằng
|Public|private|Const<tên hằng>[As<kiểu dữ liệu>]= <biểu thức>
Tầm hoạt động
Hằng cũng có tầm hoạt động tương tự biến:
• Hằng khai báo trong thủ tục chỉ hoạt động trong thủ tục
• Hằng khai báo trong mô-đun chỉ hoạt động trong mô-đun
• Hằng khai báo Public trong phần Declarations của mô-đun chuẩn có tầm
hoạt động trên toàn ứng dụng.Khai báo Public không thể dùng trong mô-đun của
biểu mẫu hoặc mô-đun lớp.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 31


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

2.3.5. Kiểu dữ liệu


Kiểm soát nội dung của dữ liệu. VB dùng kiểu Variant như là kiểu mặc định.
Ngoài ra, một số kiểu dữ liệu khác cho phép tối ưu hoá về tốc độ và kích cỡ chương
trình. Khi dùng Variant, ta không phải chuyển đổi giữa các kiểu dữ liệu. VB tự
động làm việc đó.
Một dòng lệnh có thể kết hợp nhiều kiểu khai báo :
Private I as Interger, Amt as double
Private YourName as String, BillsPaid as Currency
Private Test,Amount, J as integer
Kiểu số
Integer, Long, Double và Currency. Kiểu số tốn ít vùng chứa hơn kiểu
Variant. Tất cả biến kiểu số có thể được gán cho nhau và cho biến Variant. VB làm
tròn thay vì chặt bỏ phần thập phân trước khi gắn nó cho số Integer.
Kiểu Integer tốn ít vùng nhớ hơn các kiểu khác, nó thường dùng làm biến
đếm trong các vòng lặp For....Next.
Kiểu Single, Double, Currency dùng cho các số có phần thập phân. Currency
hỗ trợ đến 4 chữ số phần thập phân và 15 chữ số cho phần nguyên, đùn cho ácc tính
toán tiền tệ.
Các giá trị dấu chấm động được thể hiện là :A*10B
.Ví dụ:
1.2341E12=1.2341 *1012
3.402823E+38 cho số Single hoặc 1.7976931486232D+308 cho số Double
Ta dùng các phép cộng (+), trừ(-) nhân(*), chia(/ hoặc\). Dấu / là số chia thập
phân.
Ví dụ: 5/3 cho kết quả là 1.66666666667. Trong khi 5/3 cho kết quả là 1,
phần thập phân bị chặt bỏ. Phép tính này đặc biệt nhanh khi sử dụng trong vòng lặp.
Kiểu Byte
Thường dùng đẻ chứa dữ liệu nhị phân. Tất cả các thao tác trên kiểu Integer
có thể thực hiện trên kiểu Byte, ngoại trừ dấu. Vì Byte là kiểu không dấu (trong
khoản từ 0-255), nó không thể nhận ra số âm.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 32


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Kiểu String
Mặc định, biến hay tham số kiểu chuỗi có chiều dài thay đổi, nó có thể tăng
hoặc giảm tuỳ theo ta gán dữ liệu. Ta có thể khai báo chuỗi có chiều dài cố định:
Dim EmpName As String *50
Nếu ta gán một chuỗi ngắn hơn 50 ký tự, EmpName sẽ được thêm vào phần
đuôi các kỹ tự khoảng trắng cho đầy 50 ký tự, nếu chuỗi gán vào dài hơn 50 ký tự,
VB tự động chặt bỏ.
Khi làm việc với chuỗi, ta cần dùng các ham Trim và RTrim để cắt bỏ các ký
tự trắng không cần thiết. Ngoài ra một số hàm thông dụng để thao tác trên chuỗi
như:
a. Len: Lấy chiều dài chuỗi
b. Mid$: Trích chuỗi con từ chuỗi gốc
c. Left$: Trích chuỗi con từ phần đầu chuỗi gốc.
d. Right$:Trích chuỗi con từ phần đuôi của chuỗi gốc.
e. InStr: Tìm chuỗi con trong chuỗi gốc. Nếu hàm InStr trả về 0, nghĩa là
không tìm thấy.
Tìm kiếm không phân biệt cõ chữ. Nhưng nếu tham số thứ 3 là
vbBinaryCompare thì đây là tìm kiếm chuỗi có phân biệt chữ in hoa và chữ in
thường.
f. Replace: Tìm và thay thể chuỗi. Replace(“Peter PeterWright”,” Peter
”,John,6). Chuỗi kết quả là “John Wright”, bắt đầu từ vị trí thứ 6. Nếu muốn giữ lại
phần đầu ta làm như sau:
Left$(“Peter Peter Wright”,5)&Replace (“Peter Peter
Wright”,”Peter”,”John”,6)
Một tham số khác là số lần thay thế:
Replace(“Peter Peter Peter Wright”,”Peter”,”Hooray”,1,2)
Kết quả là “Hooray Hooray Peter Wright”, nghĩa là hai lần thay thế. THam
số này mang giá trị mặc định là -1, nghĩa là thay thế toàn bộ.
Tham số cuối cùng tương tự hàm Instr(), cho biết nó có phân biệt chữ in hoa
và chữ thường hay không

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 33


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Replace(“Peter Wright, “Peter”, “P.”,1,-1,vbTextCompare)


Kết quả là “P.Wright”.
Chuỗi có chiều dài cố định được khai báo Public hay Private trong mô-đun
chuẩn. Trong mô-đun của biểu mẫu hoặc mô-đun lớp, nó phải được khai báo
Private. VB cho phép chuyển đổi một chuỗi thành thành một số nếu chuỗi đang thể
hiện một con số. Ngược lại, ta cũng có thể chuyển một số thành chuỗi. Tuy nhiên
nên cẩn thận, vì chuyển đổi một chuỗi có giá trị không phải số sẽ gây lỗi chương
trình thi hành.
Một số lập trình viên Visual Basic thích dùng dấu + để nối chuỗi thay vì
dùng dấu &. Mặc dù không khác nhau lắm, nhưng thực ra dùng dấu + có điểm bất
tiện. Vì là phép toán, nó có kiểm tra kiểu. Nếu ta có một số và một chuỗi nối với
nhau, nó sẽ chuyển đổi từ số sang chuỗi trước khi thực sự kết nối. Hơn nữa, việc
chuyển đổi này được làm tự động, không hề báo lỗi khi biên dịch.
Kiểu Boolean
Nếu ta có một biến có hai giá trị True/False, Yes/No,On/Off, ta nên dùng
kiểu Boolean. Giá trị mặc định của Boolean là False.
Dim blnRunning as Boolean
‘ Check to see ì the tape is running.
If recorder.Direction = 1 Then
blnRunning = True
End if

Kiểu Date
Khi các kiểu dữ liệu khác được chuyển sang Date, giá trị đứng trước dấu
chấm là ngày, giá trị đứng sau dấu chấm là giờ. Nửa đêm là 0, giữa ngày là 0,5. Dấu
âm thể hiện ngày trước 30/12/1999. Kiểu Date đã giải quyết vấn đề Y2K.
Nhấn Ctrl-G để hiển thị cửa sổ Immediate.
Gõ vào:
“01/02/98” và nhấn Enter.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 34


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Nếu hiểu theo người Mỹ, “01/02/98” có nghĩa là ngày 2 tháng Giêng năm
1998, nếu hiểu theo người Anh thì đây là ngày 1 tháng 2 năm 1998. Nếu dùng ngày
như trong hình trên thì VB hiểu rằng lấy 1 chia cho 2 rồi lấy kết quả chia cho 98!
Trở lại cửa sổ Immediate gõ vào: ?#01/02/98#
Dấu # cho biết là dữ liệu kiểu Date, không phải một biểu thức toán học. Tuy
nhiên, định dạng ngày tháng hiển thị phụ thuộc vào quy định của Windows.
Hộp thoại này hiển thị khi người sử dụng nhấp đúp chuột vào biểu tượng
Regional Setting trong cửa sổ Control Panel của Windows. Nó cho phép quy định
kiểu ngày tháng tuỳ thuộc quốc gia. Bên trong chương trình VB xử lý ngày tháng
theo kiểu Mỹ #01/02/98# là ngày 2 tháng Giêng năm 1998, nhưng nếu máy đang
dùng theo hệ Anh thì nó sẽ hiển thị trên cửa sổ Immediate là 2/1/98.
Kiểu Object
Biến kiểu Object chứa một địa chỉ 4 byte (32bit) trỏ đến đối tượng trong ứng
dụng hiện hành hoặc các ứng dụng khác. Dùng lệnh Set để chỉ ra đối tượng thực sự:
Dim objDb As Object
Set objDb=OpenDatabase(“c:\vb5\Biblio.mdb”)
Khi khai báo biến đối tượng, nên chỉ ra tên lớp tường minh, như TextBox
thay vì Control, Database thay vì Object). Ứng dụng sẽ chạy nhanh hơn, ta có thể
xem danh sách các lớp trong cửa sổ Object Browser.
Kiểu Variant
Có thể chứa mọi loại dữ liệu, số, thậm chí mảng. Ta không cần chuyển đổi
kiểu dữ liệu, VB làm việc đó một cách tự động.
Dim Somevalue 'Variant by default
Somevalue = "17" 'SomeValue contains "17"(a two character
string).
Somevalue = Somevalue – 15 'somevalue now cotains the numeric value
2.
Somevalue = "U" & Somevalue 'somevalue now cotains.

Variant cũng thuận tiện khi ta không biết trước kiểu dữ liệu

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 35


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Private Sub cmdExplore_click()


Dim VarVariant As Variant
VarVariant = 12
Form1.Print VarType(VarVariant)
VarVariant = "Peter"
Form1.Print VarType(VarVariant)
VarVariant = True
Form1.Print VarType(VarVariant)
VarVariant = #1/1/2001#
Form1.Print VarType(VarVariant)
End Sub

Giá trị Empty


Đôi khi ta cần kiểm tra một giá trị có được gán cho biến hay chưa. Biến
Variant có giá trị Empty trước khi nó được gán giá trị. Giá trị Empty là một giá trị
đặc biệt không phải zero, không phải chuỗi rỗng(“”), không phải giá trị Null. Ta
dùng ham IsEmpty để kiểm tra giá trị Empty:
If IsEmpty(z) then z =0
Khi một biến Variant chứa giá trị Empty, ta có thể dùng nó trong biểu thức.
Nó có thể được xem là 0 hoặc chuỗi rỗng tuỳ theo biểu thức.
Giá trị Empty biến mất khi có một giá trị bất kỳ được gán cho Variant. Muốn
trở về giá trị Empty, ta gán từ khoá Empty cho Variant.
Giá trị Null
Biến Variant chứa giá trị Null dùng trong những ứng dụng cơ sở dữ liệu thể
hiện không có dữ liệu hoặc dữ liệu không xác định.
Dùng hàm IsNull để kiểm tra biến Variant có chứa Null hay không. Biến
không bao giờ mang giá trị Null nếu ta không gán trực tiếp cho nó. Vì vậy, không
cần phải dùng hàm IsNull.
Nếu gán Null cho một biến khác kiểu Variant, VB sẽ báo lỗi.
Giá trị Error

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 36


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Trong một biến Variant, Error là một giá trị đặc biệt thể hiện một điều kiện
lỗi vừa xảy ra trong thủ tục. Tuy nhiên, không như các lỗi khác, các xử lý lỗi thông
thường của ứng dụng không xảy ra. Do đó, ta có thể xử lý dựa trên các giá trị lỗi.
Giá trị Error được sinh ra bằng cách chuyển đổi giá trị lỗi dùng cho hàm CVErr.
Kiểu mảng(Array)
Mảng là một xâu các biến có cùng tên và cùng kiểu dữ liệu. Dung Array làm
chương trình đơn giản và rút gọn, vì ta có thể dùng vòng lặp. Mảng có biên trên và
biên dưới, và các thành phần trong mảng là liên tục giữa 2 biên.
Khái niệm mảng ở đây khác với mảng các điều khiển (Control Array).
Control Array không cho phép nạp hay thoát khỏi một thành phần ở giữa Array.
Có 2 loại biến mảng mảng có chiều dài cố định và mảng động, có chiều dài
thay đổi lúc thi hành. Mảng có chiều dài cố định có thể được khai báo Public trong
ứng dụng.
Private trong mô-đun hoặc Private trong một thủ tục.
Mảng có chiều dài cố định
Có biên trên và biên dưới. Biên trên được xác định ngay lúc khai báo.
Dim counters(14) As Integer
Public sums(20) As Double
Mặc định, biên dưới là 0. Ta có thể khai báo tường minh biên dưới:
Dim counter(1 To 15) As Integer
Dim sums(100 To 120) As String
a. Hàm UBound trả về phần tử cuối của mảng(Upper Bound).
b. Hàm LBound trả về phần tử đầu tiên của mảng (Lower Bound).
Mảng trong mảng
Private Sub command1_click()
Dim intX As Integer
'Declare and populate an integer array
Dim countersA(5) As Integer
For intX = 0 To 4
countersA(intX) = 5

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 37


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Next intX
'Declare and populate a string array
Dim countersB(5) As String
For intX = 0 To 4
countersB(intX) = "Hello"
Next intX
Dim arrX(2) As Variant 'Declare a new two-member
arrX(1) = countersA()
arrX(2) = countersB()
MsgBox arrX(1)(2) ' display a member of each array
MsgBox arrX(2)(3)
End Sub
Mảng nhiều chiều
Ta khai báo một mảng 2 chiều có 10 phần tử
Static MatrixA(9, 9) As Double
Static MatrixA(1 To 10, 1 To 10) As Double
Dim MultiD(3, 1 To 10, 1 To 15)
Khai báo này tạo ra một mảng 3 chiều có kích cỡ 4×10×15, là số phần tử của
ma trân là 600. Nên thận trọng trong khi sử dung các mảng nhiều chiều, nhất là các
mảng các Variant vì nó lớn hơn các kiểu dữ liệu khác.
Mảng động (dynamic Array)
Mảng này có thể thay đổi kích cỡ. là một trong những ưu điểm của Visual
Basic, mảng động giúp quản lý bộ nhớ một cách hiệu quả. Ta có thể dùng một mảng
lớn trong thời gian ngắn, sau đó xoá bỏ để trả vùng nhớ cho hệ thống
Khai báo
• Khai báo Public hoặc Dim trong mô-đun, hoặc khai báo Static hay Dim
trong thủ tục. Khai báo một mảng động bằng cách cho nó một danh sách không
theo chiều nào cả.
Dim DynArray()
• Cấp phát số phần tử thực sự bằng dòng lệnh ReDim.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 38


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

ReDim DynArray(x+1)
Sử dụng ReDim
Dòng lệnh ReDim chỉ có thể xuất hiện trong thủ tục. Khác với Dim hay
Static, ReDim là một dòng lệnh thi hành, nó làm ứng dụng phải thực hiện một hành
động lúc chạy chương trình. Sử dụng ReDim tương tự trong mảng có chiều dài cố
định, dùng thay đổi số phần tử cũng như biên trên hoặc biên dưới. tuy nhiên, số
chiều không thay đổi.
ReDim DynArray(4 to 12)
Dim Matrix1() as integer
Sub CalcValuesNow()
-
-
-
ReDim Matrix1(19,29)
End sub
Mỗi lần gọi ReDim, tất cả các giá trị chứa trong mảng hiện hành bị mất. Vb
khởi tạo lại giá trị cho chúng (Empty đối với mảng Variant, 0 cho mảng số, chuỗi
rỗng cho mảng chuỗi, hoặc nothing cho mảng các đối tượng). Cách này tiện lợi khi
ta muốn thêm dữ liệu mới hoặc muốn xoá bớt vùng nhớ. Đôi khi, ta muốn thay đổi
kích cỡ của mảng mà không mất dữ liệu. Ta dùng ReDim với từ khoá Preserve. Ví
dụ, mở rộng mảng thêm một phần tử và không mất dữ liệu:
ReDim Preserve DynArray(UBound(DynArray)+1)
Tuy nhiên chỉ có biên trên của chiều cuối cùng trong mảng được thay đổi khi
ta dùng Preserve. Nếu thay đổi chiều khác, hoặc biên dưới của chiều cuối cùng VB
sẽ báo lỗi.
Một số tính năng mở rộng của mảng
Không những gán mảng cho một mảng, ta còn tạo các hàm trả về mảng và
các thuộc tính trả về mản. Trong nhiều trường hợp, những kỹ thuật này sẽ cải tiến
đáng kể tốc độ xử lý chương trình
Sao chép mảng

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 39


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Trong Visual Basic 5, để sao chép từ một mảng sang một mảng khác, ta phải
dung vòng lặp For Each quét qua mảng nguồn, rồi tuần tự ReDim lại mảng đích để
copy từng phần tử.
Tuy nhiên cách này chỉ áp ụng cho mảng Dynamic mà thôi. Khi gán biến, có
một số quy luật mà ta cần nhớ. Ví dụ: Ta có thể gán một giá trị kiểu Integer vào
biến long, không vấn đề nhưng gán Long cho Integer sẽ gây lỗi tràn. Ngoài quy luật
về kiểu dữ liệu, việc gán mảng cũng có những quy luật liên quan đên số chiều, kích
thước của chiều và laọi mảng gì (mảng có chiều dài cố định hay mảng động).
Gán mảng với chiều và kiểu dữ liệu khác nhau có thể không thành công, do
những nguyên nhân sau:
• Mảng bên trái dấu gán(=) là mảng chiều dài cố định hay mảng động
• Số chiều của mảng bên trái có đồng nhất với số chiều của mảng bên phải
không
• Số phần tử trên mỗi chiều của mỗi bên có tương thích không. Chiều có thể
tương thích thậm chí khi khai báo khác nhau, ví dụ như một mảng bắt đầu từ số 0
trong khi mảng kia bắt đầu từ số 1 miên là chúng có cùng số phần tử Kiểu dữ liệu
cảu các phần tử mỗi bên phải tương thích.

2.4. Quy trình phát triển một phần mềm


Thông thường để phát triển một phần mềm, người ta cần thực hiện các bước
sau:
- Phân tích, thiết kế hế thống (phần mềm cần phát triển)
- Cài đặt (lập trình) theo thiết kế đã có
- Kiểm thử phần mềm sau hoặc trong khi lập trình
- Cung cấp phần mềm đến người sử dụng
- Bảo trì phần mềm

Bài 3: Các cấu trúc điều khiển trong VB6

3.1. Giới thiệu các cấu trúc điều khiển

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 40


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Tương tự như nhiều ngôn ngữ lập trình bậc cao khác, VB cung cấp cho
người lập trình các cấu trúc điều khiển chương trình theo vòng lặp và rẽ nhanh theo
điều kiện.
Cấu trúc điều kiện khá phong phú: cấu trúc If với nhiều cách sử dụng khác
nhau, cấu trúc Select case cho phép rẽ nhánh theo nhiều hướng.
Cấu trúc lặp có các dạng For, Do while,...
3.2. Cấu trúc điều kiện
3.2.1. If.. Then
Một dòng lệnh
If <điều kiện> Then <dòng lệnh>
Nhiều dòng lệnh
If <điều kiện> Then
<dòng lệnh>
End if
Điều kiện là một so sánh hay một biểu thức mang giá trị số. Visual basic
thông dịch giá trị này thành True / False. Nếu True thì Visual basic thi hành dòng
lệnh sau từ khoá Then.
3.2.2. If.. Then...Else
If <điều kiện 1> Then
[Khối lệnh - 1]
ElseIf <điều kiện 2> Then
[Khối lệnh - 2]
......
Else
[Khối lệnh - n]
End if
3.2.3. Select Case
Giải quyết trường hợp có quá nhiều ElseIf được dùng, giúp chương trình
sáng sủa dễ đọc. Biểu thức để so sánh được tính toán một lần vào đầu cấu trúc. Sau

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 41


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

đó Visual basic so sánh kết quả biểu thức với từng Case. Nếu bằng nó thi hành khối
lệnh trong Case đó.
Select Case <biểu thức kiểm tra>
Case <danh sách biểu thức 1>
Khối lệnh 1
Case <danh sách biểu thức 2>
Khối lệnh 2
....................
Case else
Khối lệnh n
End Select
Mỗi danh sách biểu thức chứa một hoặc nhiều giá trị, các giá trị cách nhau
bằng dấu phảy. Mỗi khối lệnh có thể chứa từ 0 đến nhiều dòng lệnh. Nếu có hơn
một Case thoả mãn điều kiện thì Case đầu tiên được thực hiện. Case else không nhất
thiết phải có, dùng trong trường hợp còn lại của các Case trước.

3.3. Cấu trúc lặp


3.3.1. Do..loop
Thi hành một khối lệnh với số lần lặp không định trước, tỏng đó, một biểu
thức điều kiện dùng so sánh để quyết định vòng lặp có tiếp tục hay không. điều kiện
phải quy về False hoặc True.
Kiểu 1:
Do While <điều kiện>
<khối lệnh>
Loop
Kiểu 2:Vòng lặp luôn có ít nhất một lần thi hành khối lệnh
Do
<Khối lệnh>
Loop While <điều kiện>
Kiểu 3: Lặp trong khi điều kiện là False

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 42


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Do until <điều kiện>


<khối lệnh>
Loop
Kiểu 4: Lặp trong khi điều kiện là False và có ít nhất một lần thi hành khối
lệnh
Do
<khối lệnh>
Loop Until
3.3.2. For...Next
Biết trước số lần lặp. Ta dùng biến đếm tăng dần hoặc giảm dần trong vòng
lặp.
For <biến đếm> = <điểm đầu> To <điểm cuối> [Step <bước nhảy>]
<Khối lệnh>
Next [<Biến đếm>]
Biến đếm, điểm đầu, điểm cuối và bước nhảy là những giá trị số.
Bước nhảy có thể là âm hoặc dương. Nếu bước nhảy là dương, điểm đầu phải
nhỏ hơn hoặc bằng điểm cuối, nếu bước nhảy là âm thì ngược lại.
3.3.3. For Each...Next
Tương tự vòng lặp For... Next, nhưng nó lặp khối lệnh theo số phần tử của
một tập các đối tượng hay một mảng thay vì theo số lần lặp xác định. Vòng lặp này
tiện lợi khi ta không biết chính xác bao nhiêu phần tử trong tập hợp.
For Each <phần tử> In <Nhóm>
<khối lệnh>
Next <phần tử>
3.3.4. Vòng lặp While...Wend
Tương tự vòng lặp Do...While, nhưng ta khôing thể thoát vòng lặp bằng lệnh
Exit.
Vì vậy, vòng lặp kiểu này chỉ thoát khi biểu thức điều kiện sai.
While <điều kiện>
<khối lệnh>

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 43


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Wend
3.3.5. Câu lệnh GoTo
Được dùng cho bẫy lỗi.
On Error Goto ErrorHandler
Khi có lỗi, chương trình sẽ nhảy đến nhãn ErrorHandler và thi hành lệnh ở
đó.

Bài 4: Chương trình con và tham số

4.1. Giới thiệu chương trình con


Công dụng của chương trình con:
- Chia nhỏ chương trình thành nhiều phần logic, giúp gỡ rối dễ dàng.
- Thủ tục có thể được sử dụng lại trong một ứng dụng khác.
Các loại chương trình con:
- Thủ tục
- Hàm

4.2. Chương trình con dạng thủ tục


Thủ tục không trả về giá trị, cú pháp trình bày như sau:
[Private | Public | Static] Sub <Tên thủ tục> (Tham số)
Các dòng lệnh
End sub

4.3. Chương trình con dạng hàm


Hàm trả về giá trị qua tên hàm, cú pháp trình bày như sau:
[Private | Public | Static] Function <Tên hàm> (Tham số) [As <Kiểu dữ
liệu>]
Các dòng lệnh
End Function

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 44


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Trong trường hợp không khai báo As <type>, mặc định, VB hiểu là kiểu
variant.

4.4. Tham số
Tham số được sử dụng cả trong thủ tục và hàm để truyền vào hoặc lấy ra các
giá trị. Tham số có 2 loại là tham số dạng tham biến (tham chiếu) và tham số dạng
tham trị (theo giá trị).
Tham biến: được xác định vởi từ khóa byref khi khai báo. Tham số dạng này
có thể nhận giá trị trả về. Khi gọi chương trình con, với tham số là tham biến cần
phải truyền một biến có kiểu tương ứng.
Tham trị: được xác định bởi từ khóa byval. Tham số dạng này không thể
nhận giá trị trả ra từ chương trình con. Khi gọicó thể truyền trực tiếp giá trị hoặc
biến có kiểu tương thích.

4.5. Giới thiệu một số chương trình con có sẵn


Chương trình con xử lý ký tự: CHR, ASC
Chương trình con xử lý xâu ký tự: TRIM, LEFT, RIGHT, MID, UCASE,
LCASE, SPLIT,...
Chương trình con xử lý mảng: LBOUND, UBOUND,...

Bài 5: Các điều khiển trong VB6

5.1. Giới thiệu


Trong Visual Basic có ba nhóm điều khiển
• Điều khiển nội tại, ví dụ như là các điều khiển nút lệch và khung. Các điều
khiển này được chứa trong các tập tin. EXE của Visual Basic. Các điều khiển nội tại
luôn chứa sẵn trong hộp công cụ, ta không thể gỡ bỏ hay thêm chúng vào hộp công
cụ.
• Điều khiển ActiveX, tồn tại trong các tập tin độc lập có phần mở rộng là
.OCX. Chúng có thể đưa ra các điều khiển hiện diện trong mọi ấn bản của Visual

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 45


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Basic(ví dụ DataCombo, Datalist,....) hoặc là các điều khiển chỉ hiện diện trong ấn
bản Professional và Enterprise(như ListView,Toolbar,Animation ). Ngoài ra, còn rất
nhiều điều khiển ActiveX do các nhà cung cấp thứ ba đưa ra
• Đối tượng chèn được, ví dụ như đối tượng bảng tính (Worksheet) của
Microsoft Excel chứa một danh sách các nhân viên của một công ty hay đối tưọng
lịch biểu (Calendar) của Microsoft Project chứa việc lập biểu thông tin cho một đề
án. Bởi vì chúng có thể thêm vào hộp công cụ, chúng có thể là các điều khiển được
chuẩn bị chu đáo. Một vài đối tượng kiểu này cũng cung cấp phần Automation lập
trình với các đối tượng sinh ra từ những ứng dụng khác ngay trong ứng dụng của
Visual Basic.
5.2. Các điều khiển thông dụng
Bảng sau liệt kế một số điều khiển thông dụng (nhóm điều kiện nội tại):

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 46


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

 Điều khiển Label


+ Thường dùng để hiển thị thông báo, xâu ký tự và thường đi kèm với hộp
văn bản, các thuộc tính thông dụng như: Caption, Font, Border, Backcolor,
Forecolor.
+ Nhãn: là điều khiển ít tốn tài nguyên, bộ nhớ và tốc độ xử lý như các điều
khiển khác.

 Điều khiển Textbox


+ TextBox: là một điều khiển rất thông dụng của ứng dụng, thường dùng để
nhập dữ liệu từ người sử dụng cũng như hiển thị trên màn hình. Visual Basic và
Windows tự động xử lý những hoạt động như hiển thị ký tự khi người sử dụng gõ
vào, chèn, xoá, cuộn dữ liệu, cát, dán ...
+ Các thuộc tính thông dụng.
- ForeColor: xác định màu của văn bản hiển thị.
- Text: Xác định nội dung của văn bản được nhập.
- Alignment: Căn chỉnh văn bản trong hộp (Left, Right, Center).
- Multiline: Cho phép hiển thị nhiều dòng văn bản trên hộp, thường đi kèm
với thanh cuộn.
- Scollbars: Xác định hộp văn bản có xuất hiện các thanh cuộn dọc, ngang,
có giá trị (True, False).
- BorderStyle: kiểu đường viền : =1: có (mặc định), =0: không có.
- MaxLength: Xác định số lượng ký tự tối đa mà hộp văn sẽ nhận.
- PassWordChar: Dùng cho công tác bảo mật, quy ước dùng dấu"*" cho mật
hiệu, thường đi cùng với MaxLength.
+ Các phương thức: Move, Refesh, Setfocus ...
- Move: Di chuyển hộp văn bản đến vị trí khác tên điều khiển chứa nó.
- Refesh: Làm tươi hộp văn bản (sơn lại những thay đổi vừa sảy ra….).
- Setfocus: Thiết lập tiêu điểm chỉ đến hộp văn bản.
+ Các sự kiện thông dụng:
- Change: xảy ra khi giá trị hộp văn bản thay đổi.
- KeyPress, KeyDown, KeyUp, MouseDown, MouseUp ...
Vd: Xử lý phím Enter, khi bạn đưa nội dung vào hộp văn bản, Khi nhấn
Enter thì xuất hiện hộp hội thoại đưa nội dung hộp văn bản.
Private Sub T1 Keydown( ... )

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 47


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

If KeyCode = 13 Then
MgBox" Nội dung văn bản vừa vào là: "& T1.Text
End if
End Sub

 Điều khiển Option button


+ Hộp tuỳ chọn (hay hộp đánh dấu): Liệt kê các danh sách chọn lựa,
ta có thể chọn hoặc không chọn.
- Thuộc tính Value: = 0: không được chọn
1: chọn
2: Cấm chọn
Vd: Tạo đề án mới: - Vẽ một vài hộp đánh dấu vào
- Mở cửa sổ Code. Ta muốn hiển thị một thông điệp
khi hộp đánh dấu được chọn.
Private Sub Check1_ Click()
Mrgbox ''The value í now" & check1.value
End Sub
- Mỗi lần nhấn lên hộp đánh dấu, 1 thông điệp xuất hiện hiển thị trạng thái
của hộp đánh dấu. - Nếu có được đánh dấu, Value = 1.
- không được đánh dấu Value = 0.
- Không thấy Value = 2
- Các thuộc tính Caption, Alignment ... tương tự các điều khiển khác.
+ Nút tuỳ chọn: Tương tự như hộp đánh dấu, nhưng điểm khác là nút tuỳ
chọn là loại trừ lẫn nhau nghĩa là trong 1 nhóm có vài hộp đánh dấu (checkbox) thì
ta có thể chọn tất cả. Nhưng một nhóm các nút tuỳ chọn (RadioButton) ta chỉ được
phép chọn một mà thôi.
- Nút tuỳ chọn chỉ có hai giá trị: True và False. Nếu bằng True, nút sẽ được
chọn.

 Điều khiển CheckBox


+ Hộp kiểm (hay hộp đánh dấu): Liệt kê các danh sách chọn lựa, ta có
thể chọn hoặc không chọn.
- Thuộc tính Value: = 0: không được chọn
1: chọn
2: Cấm chọn

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 48


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Vd: Tạo đề án mới: - Vẽ một vài hộp đánh dấu vào


- Mở cửa sổ Code. Ta muốn hiển thị một thông điệp
khi hộp đánh dấu được chọn.
Private Sub Check1_ Click()
Mrgbox ''The value í now" & check1.value
End Sub
- Mỗi lần nhấn lên hộp đánh dấu, 1 thông điệp xuất hiện hiển thị trạng thái
của hộp đánh dấu. - Nếu có được đánh dấu, Value = 1.
- không được đánh dấu Value = 0.
- Không thấy Value = 2
- Các thuộc tính Caption, Alignment ... tương tự các điều khiển khác.
+ Nút tuỳ chọn: Tương tự như hộp đánh dấu, nhưng điểm khác là nút tuỳ
chọn là loại trừ lẫn nhau nghĩa là trong 1 nhóm có vài hộp đánh dấu (checkbox) thì
ta có thể chọn tất cả. Nhưng một nhóm các nút tuỳ chọn (RadioButton) ta chỉ được
phép chọn một mà thôi.
- Nút tuỳ chọn chỉ có hai giá trị: True và False. Nếu bằng True, nút sẽ được
chọn.

 Điều khiển Image


- Dùng để hiển thị hình ảnh như BMP,WMF, GIF, ICO..
- Ta có thể nạp hình ảnh vào lúc thiết kế hoặc khi thi hành ứng dụng. Để nạp
ảnh ta đưa vào thuộc tính Picture và chọn tên tệp tin…

 Điều Picture Box


- Dùng để hiển thị hình ảnh cơ bản tương tự như Image
- Chứa các điều khiển khác, cho phép tạo nhóm và xử lý các điều khiển khác
theo nhóm.

 Điều khiển Listbox


- Trong thực tế, danh sách rất cần thiết. Một hệ thống nhân sự cần liệt kê các
công việc và tên các phòng ban để đưa các nhân viên vào hệ thống. Người sử
dụng chỉ thấy những gì có trong danh sách và họ xẽ được phép chọn một
hoặc một vài phần tử trong danh sách.
- Đưa dữ liệu vào danh sách dùng phương thức AddItem

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 49


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Vd: Tạo một Form, đưa một hộp danh sách vào biểu mẫu đưa đoạn chương
trình sau vào sự kiện Load của Form
- Giải thích hoạt động: Dùng Phương thức AddItem của danh sách để tạo
danh sách. Vì danh sách rỗng vào lúc khởi tạo nên số đếm bắt đầu bằng 0 thuộc tính
LitsCount được Windown cập nhật tự động và luôn chứa tổng số thành phần(phần
tử) trong danh sách.
- Thuộc tính IntegralHeight có giá tri bằng True. Tức là hộp danh sách sẽ tự
động điều chỉnh kíck cỡ cho vừa khít với số phần tử có trong danh sách. Nếu đổi
thuộc tính này là False, danh sách chỉ hiển thị một phần.
- Để sắp xếp mục chọn trong danh sách ta đổi thuộc tính Sorted = True.
- Các phàn tử trong danh sách xẽ dược sắp xếp theo thử tự Abc ( chỉ được
đổi khi thiết kế ).
- Chọn phần tử trong danh sách ta có thể kiểm tra giá trị thuộc tính Text
(hoặc thuộc tính Value) của danh sách khi người sử dụng nhắp chuột vào hộp danh
sách (sự kiện Click sẽ sảy ra ). Nếu không có phần tử nào được chọn thuộc tính
Text = Null.
- Xoá phần tử trong danh sách:(dùng thuộc tính Removeitem )
Lits1. ReMoveItem 3 : Dòng lệnh này sẽ xoá phần tử thứ 3 trong danh
sách. Ta có thể dùng phương thức Clear để xoá toàn bộ phần tử trong danh sách .
- Dòng lệnh này sẽ xoá phần tử hiện hành :
Lits 1. RemoveItem Lits1.LitsIndex
- Dòng lệnh này sẽ xoá toàn bộ nội dung trong danh sách
List1.Clear
+ Hiển thị nhiều cột: Đây là điểm tiện lợi của hộp danh sách so với hộp kết
hợp (ComBox) dùng thuộc tính Comlumns, ta có thể hiển thị danh sách theo nhiều
cột.
Trở lại vị dụ trên, tìm và đổi thuộc tính Columns = 2 (Nghĩa là 2 cột)

 Điều khiển hộp Combobox


Các đặc tính của hộp kết hợp:
Hộp kết hợp= Hộp danh sách + Hộp văn bản (và có 3 loại)
+ Hộp kết hợp thả xuống (Drop-Down ComBo): kiểu =0 :
Là một hộp văn bản cho phép ngườn sử dụng gõ vào, kế bên có một
mũi tên nhấn vào đó nó sẽ sổ ra 1 danh sách cho phrps người sử dụng lựa chọn.
Hộp kết hợp đơn giản(Simple ComBo): kiểu =1

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 50


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Luôn hiển thị danh sách và cho phép người sử dụng gõ vào hộp văn
bản.
Hộp kết hợp thả xuống(Drop-Down ListBox):kiểu =2
Tương tự kiểu 0, danh sách không hiển thị sẵn nếu không nhấn vào
mũi tên xuống. Người sử dụng chỉ có thể chọn từ danh sách, gõ vào hộp văn bản thì
danh sách sẽ cuộn đến đúng phần tử yêu cầu và đánh dấu nó.

 Điều khiển Frame


+ Dùng để gộp, nhóm các điều khiển khác ,hay thường dùng làm thùng chứa.
Trong hầu hết các trường hợp, ta dùng điều khiển này rất đơn giản, ít cần đáp ứng
sự kện. Tuy nhiên ta cần thay đổi tên các thuộc tính Name, Caption và Font.

 Điều khiển Command button


+ Thuộc tính: Height,Width, Font, BackColor, Caption, Picture ...
+ Phương thức: : Move, Refesh, SetFocus ...
+ Sự kiện: MouseMove, MouseDowm, MouseUp, KeyDown, Click,
KeyUp ...
+ Đặt tên (Name) cho nút lệnh thường bắt đầu = CMD.

Vd: CMDQuit, hộp văn bản thường là TXT, nút tuỳ chọn là OPT..vv.
Chú ý : Khi đặt tên cho các điều khiển, ta cần tuân theo một số quy tắc, điều
này sẽ giúp chương trình của chúng ta sáng sủa, dễ đọc, nhất là khi gỡ rối và bảo trì
chương trình.
+ Phân biệt hai thuộc tính Caption và Text.
- Caption: Dùng cho các đối tượng như biểu mẫu, khung, nút lệnh và thường
để hiển thị tiêu đề cho đối tượng.
+ Text: dùng cho những điều khiển thuộc loại nhận dữ liệu từ người sử dụng
nhập vào như hộp văn bản (Textbox), hộp kết hợp (Conbobox).
- Ngoài ra ta có thể quy định phím nóng (Hotkey) cho các điều khiển có
thuộc tính Caption bằng cách đặt dấu "&" kế bên ký tự.
Vd: Nút lệnh có Caption = &Quit = Quit(Ký tự Q sẽ được VB gạch chân):
- Khi người sử dụng ấn Alt + Q, nút lệnh Quit sẽ được kích hoạt,
tương tự nhấn chuột vào nút lệnh.
Vd: Hộp văn bản chỉ nhận ký tự số.
Private Sub Txt_Keypress (KeySscii as integer)
If KeyAscii < asc("0") or KeyAscii > Asc("9") then

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 51


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

KeyAscii = 0
End if
EndSub
- Giải thích:
Dòng lệnh KeyAscii as integer đặt trong dấu ngoặc đơn cho biết đây là tham
số của thủ tục. Khi một phím được nhấn, tham số này sẽ giữ mã Ascii của phím đó.
Vd: Nếu nhấn vào ký tự "A", KeyAscii sẽ = 65.
Acs("0") trả về mã ASCII của ký tự "0".
- Dòng lệnh if kiểm tra: Nếu phím gõ vào nằm ngoài khoảng từ 0 đến 9 thì
tắt phím đó đi = cách cho KeyAscii = 0.

 Điều khiển thanh trượt Horizontal, Vertical bar control


+ ScrollBar: Cho phép duyệt dễ dàng qua một danh sách dài gồm
nhiều phần tử hoặc một lượng lớn thông tin bằng cách cuộn ngang hay cuộn dọc ở
trong ứng dụng hay điều khiển.
+ Các điều khiển thanh cuộn không giống như các thanh cuộn trong Window
hoặc những thanh cuộn gắn kết với hộp văn bản, hộp danh sách.
+ Thuộc tính Value (mặc định = 0): Là một số nguyên tương ứng với vị trí
của hộp cuộn trong thanh cuộn. Khi hộp cuộn có giá trị nhỏ nhất, nó dịch chuyển về
bên trái (đối với thanh cuộn ngang) hay phía trên cùng đối với thanh cuộn dọc). Khi
hộp cuộn có giá trị lớn nhất, nó dịch chuyển về bên phải hoặc phía dưới cùng.
Ngoài việc nhấn chuột để thanh đổi giá trị thanh cuộn, người sử dụng có thể
kéo hộp cuộn đến 1 vị trí bất kỳ trên thanh cuộn. Giá trị kết quả tuỳ thuộc vào vị trí
hộp cuộn nhưng luôn luôn nằm giữa 2 thuộc tính Min và Max
+ Sự kiện
- Change: Xảy ra sau khi hộp cuộn thay đổi.
- Scroll: Xảy ra sau khi hộp cuộn dịch chuyển, không sảy ra nếu mũi tên
cuộn hoặc thanh cuộn được nhấn.
- Sử dụng sự kiện Scroll cho phép truy cập đến giá trị thanh cuộn khi nó
được kéo đi.
- Sự kiện Change xảy ra sau khi hộp cuộn được nhả hay là khi thanh cuộn
hoặc mũi tên cuộn được nhấn.

 Điều khiển Timer

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 52


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

+ Điều khiển Timer đáp ứng với thời gian trôi qua. Chúng độc lập với
người sử dụng, ta có thể lập trình với chúng để thi hành một hành động trong các
khoảng thời gian đều đặn.
+ Điều khiển Timer chỉ xuất hiện trên biểu mẫu lúc thiết kế (lúc thi
hành người sử dụng sẽ không nhìn thấy).
- Thuộc tính Interval chỉ ra số phần nghìn giây giữa hai sự kiện timer.
- Thuộc tính Enable = True điều khiển timer mới hoạt động = False
điều khiển timer ngưng hoạt động

5.3. Các điều khiển mở rộng


Các điều khiển mở rộng thường được cung cấp bởi các hãng thứ ba, kèm
theo các phần mềm khác.
Để sử dụng các điều khiển này ta cần bổ sung vào danh sách các điều khiển
trên hộp công cụ của VB sau đó sử dụng theo hướng dẫn của từng điều khiển.
Một số điều khiển mở rộng: CommonDiaglog Box, Flexgrid, nhóm các điều
khiển trong các gói Microsoft Windows Common Control...

Bài 6: Xử lý file trong VB6

6.1. Giới thiệu


VB cung cấp các công cụ giúp truy cập và xử lý file. Qua đó chương trình có
thể thao tác được với các file trên đĩa.
VB hỗ trợ truy cập file theo nhiều kiểu khác nhau như file văn bản (truy cập
tuần tự), file nhị phân (truy cập ngẫu nhiên), file có phần tử là các bản ghi (truy cập
ngẫu nhiên).
6.2. Làm việc với file văn bản
6.2.1. Mở file
Open pathname For | Input | Output | Append | As filenumber | Len =
buffersize|
Khi mở một tập tin tuần tự với Input, tập tin phải có sẵn. Nếu không Visual
basic sẽ báo lỗi. Khi ta mở một tập tin chưa có sẵn với Output hoặc Append lệnh
Open sẽ tạo mới tập tin và mở nó.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 53


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Tham số tuỳ chọn Len chỉ ra số ký tự trong vùng đệm khi sao chép dữ liệu
giữa tập tin và chương trình.
Sau khi mở tập tin với Input, Output hoặc Append ta phải đóng nó bằng lệnh
Close.
6.2.2. Soạn thảo nội dung
Trước hết, đọc nội dung tập tin vào biến, sửa biến và ghi biến vào tập tin.
Đọc chuỗi từ tập tin:
Mở tập tin với Input. Sau đó, dùng dòng lệnh Line Input #, Input() hoặc
Input # để sao chép nội dung tập tin vào biến. Visual basic cung cấp những hàm để
đọc ghi 1 ký tự hoặc một dòng vào tập tin. Đoạn code sau đọc từng dòng:
Dim LinesFromFile, NextLine As String
Do Until EOF(FileNum)
Line Input #FileNum, NextLine
LinesFromFile = LinesFromFile + NextLine + Chr(13) + Chr(10)
Loop
Mặc dù Line Input# nhận ra cuối chuỗi khi nó đọc đến ký tự xuống dòng,
nhưng nó không lấy ký tự này khi đưa và biến. Nếu muốn lấy ký tự xuống dòng ta
phải tự xử lý code.
Ta cũng có thể dùng Input # để đọc một danh sách gồm các số hay chuỗi
trong tập tin. Ví dụ, để đọc một dòng trong tập tin danh sách thư điện tử:
Input #filename, name, street, city,state,zip
Dùng Input để sao chép một số ký tự từ tập tin vào biến:
LinesFromFile = Input(n, Filename)
Để copy toàn bộ tập tin vào biến, dùng InputB để copy từng byte. Vì InputB
trả về
chuỗi ANSI, ta phải dùng StrConv để chuyển đổi từ ANSI sang UNICODE.
LinesFromFile= StrConv(InputB(LOF(FileNum), FileNum), vbUnicode)
Ghi chuỗi và tập tin

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 54


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Để ghi nội dung biến vào tập tin, mở tập tin với Output hay Append, sau đó
dùng Print #. Ví dụ, tình soạn thảo văn bản copy nội dung của hộp văn bản vào tập
tin:
Print #FileNum, Thebox.text
Visual basic cũng hỗ trợ lệnh Write #, dùng để ghi một danh sách các số,
chuỗi vào tập tin. Dấu phẩy được dùng để tách biệt:
Dim strString as String, intNumber as Integer
strString = “AnyCharacters”
intNumber = 23456
Write #Filenum, strString, intNumber
Đoạn code này ghi một chuỗi và một số vào một tập tin được chỉ ra bởi
FileNum.

6.3. Làm việc với file truy cập ngẫu nhiên


6.3.1. Mở file
Open pathname [ For Random ] As filenumber Len = reclength
Vì Random là kiểu mặc định từ khoá For random là tuỳ chọn.
Biểu thức Len = reclength chỉ ra kích thước tính bằng byte của một bản ghi.
Lưu ý rằng mỗi biển chuỗi trong Visual basic chứa một chuỗi Unicode và ta phải
chỉ ra chiều dài tính bằng byte của chuỗi đó. Nếu reclength nhỏ hơn chiều dài thực
sự của bản ghi ghi đến tập tin, lỗi sé sinh ra. Nếu reclength lớn hơn chiều dài thực
sự của bản ghi, bản ghi sẽ được ghi, mặc dù một số khoảng trống đĩa bị lãng phí.
Mở tệp nhị phân:
Open pathname For Binary As filenumber
6.3.1. Ghi/đọc
Để ghi dữ liệu ta dùng lệnh Put #
Để đọc dữ liệu, sử dụng lệnh Get #

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 55


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Bài 7: Thiết kế giao diện và lập trình mô phỏng

7.1. Thiết kế giao diện điều khiển


Một số lưu ý trong thiết kế giao diện:
- Màu sắc: lựa chọn màu sắc hài hòa, phù hợp với đối tượng sử dụng và
môi trường làm việc.
- Bố cục, kích thước: các điều khiển trên form phải sắp xếp sao cho hợp lý:
thuận tiện cho thao tác, đẹp mặt. Kích thước các điều khiển nên có sự
tương quan lẫn nhau và so với dữ liệu xử lý, có dóng hàng, cột, căn lề
thích hợp.
- Font chữ: nên chọn font chữ chung cho form ngay từ đầu (trước khi đưa
các điều khiển vào form). Không nên dùng quá nhiều font chữ khác nhau.
Việc sử dụng font chữ dẫn đến phải thay đổi font hệ thống là không nên.
- Ngoài các điều khiển thông thường, với giao diện điều khiển thiết bị
thường sử dụng các điều khiển bổ sung có hình dáng, chức năng đặc biệt
đáp ứng yêu cầu điều khiển cũng như cách thức điều khiển của thiết bị.

7.2. Lập trình mô phỏng đồ họa


Lập trình mô phỏng đồ họa là kỹ thuật thường dùng để thiết kế các điều
khiển bổ sung cho phần mềm điều khiển nhằm tạo ra các công cụ biểu diễn giá trị
hoặc điều khiển hoạt động của thiết bị. Ví dụ như: các bộ hiển thị LED, LED 7
thanh, ma trận LED, đèn báo các loại, các nút nhấn, công tắc gạt/xoay,...
Để lập trình mô phỏng đồ họa, người lập trình có thể tiến hành theo các cách
sau hoặc phối hợp các cách này lại với nhau:
- Vẽ trực tiếp bằng cách lệnh (phương thức) vẽ của đối tượng như form,
picture box,..
- Sử dụng các điều khiển hiển thị ảnh để nạp và hiển thị hình ảnh có sẵn.
Kỹ thuật tạo chuyển động:
- Vẽ vật chuyển đổi ở các trạng thái và vị trí chuyển động khác nhau theo
tiến trình chuyển động.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 56


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

- Lần lượt hiển thị hỉnh ảnh biểu diễn bị trí, trạng thái của vật chuyển động
theo tiến trình chuyển động.
- Sử dụng timer để điều khiển chuyển động một cách tự động và thực hiện
song song với các hoạt động khác.
Tạo điều khiển riêng: trong VB, người lập trình có thể tạo ra điều khiển của
riêng mình và sử dụng giống như các điều khiển có sẵn của VB bằng kỹ thuật tạo
Usercontrol.

7.3. Lập trình sử dụng các hàm API, thư viện DLL
7.3.1. Thư viện liên kết động
Đối với các ngông ngữ lập trình cổ điển như C, khi biên dịch chương trình,
ta có một tập tin EXE duy nhất có thể được thi hành mà không cần bất cứ tập tin
nào khác (tập tin.vbp của Visual Basic không phảI trường hợp này, vì nó chỉ chạy
trong môi trường Visual Basic). Toàn bộ chương trình cần thiết được chứa hết trong
một tập tin EXE. Tuy nhiên, cũng có rất nhiều thư viện C được dùng rộng rãi. Vấn
đề là làm sao sử dụng lạI các đoạn chương trình viết sẵn trong chương trình của ta.
Đó chính là liên kết (link). Có hai loạI liên kết : liên kết tĩnh ( static link) và liên
kết động (dynalic link).
Liên kết tĩnh
Cung cấp một kết nốI nền vững giữa chương trình và module viết sẵn ngay
lúc thiết kế; tương tự ta tạo module trong Visual Basic và gọI thủ tục trong đó, chỉ
khác là liên kết tĩnh thì chứa bên ngoài Visual Basic. Tuy nhiên, để sử dụng liên
kết tĩnh, ta cần copy phần chương trình viết sẵn của thư viện vào tập tin chương
trình khi biên dịch. Từ đó trở đi, chúng trở thành một phần của chương trình và bị
khoá chặt với chương trình.

Liên kết động


Là giải pháp linh hoạt hơn liên kết tĩnh. Tập tin thư viện bên ngoài không bị
ràng buộc vớI bên ngoài. Nó chứa ở một nơi sao cho tập tin EXE có thể tìm ra và

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 57


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

gửi thông điệp cho nó. Khi thi hành, các thông điệp này là những cuộc gọi đến các
hàm/thủ tục, yêu cầu phần chương trình nào đó của DLL được thi hành.
7.3.2. Sử dụng API
Tìm kiếm API
Ta có thể tìm các API thông qua tập tin Trợ giúp (Help) của Visual Basic,
qua sách tra cứu.
Trình duyệt API (Text API Viewer)
Được cung cấp sẵn khi cài Visual Basic. Khi ta cần tra cứu cú pháp chính
xác của hàm API, ta dùng Text API Viewer. Tuy nhiên, để có thông tin chi tiết hơn
như hàm API làm gì, truyền tham số gì, trả về giá trị gì, ta cần có quyển sách tra
cứu. Ngoài ra, chương trình này còn cho phép copy nội dung API đến clipboard để
dán vào chương trình.

Các DLL của Windows


Các API được tổ chức trong bốn DLL chính của Windows:

a. KERNEL32:
Là DLL chính, đảm nhiệm quản lý bộ nhớ, thưc hiện chức năng đa nhiệm và
những hàm ảnh hưởng trực tiếp đến hoạt động của Windows.

b. USER32:
Thư viện quản lý Windows. Thư viện này chứa các hàm xử lý menu, định
giờ, truyền tin, tập tin và nhiều phần không được hiển thị khác của Windows.

c. GDI32:
Giao diện thiết bị đồ hoạ (Graphics Device Interface). Thư viện này cung cấp
các hàm vẽ trên màn hình, cũng như kiểm tra phần biểu mẫu nào cần vẽ lại.

d. WINNM:

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 58


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Cung cấp các hàm multimedia để xử lý âm thanh, nhạc, video thờI gian thực,
lấy mẫu, v.v… Nó là DLL 32 bit. (Thư viện 16 bit tên là MMSYSTEM)
Ta có thể tìm các tập tin này trong thư mục \Windows\system. Ngoài ra, còn
có các DLL nhỏ hơn, cũng được dùng phổ biến để cung cấp các dịch vụ đặc biệt
cho ứng dụng.
Trên đây là các tên DLL 32 bit. Phiên bản VB4 là bản cuốI cùng còn hỗ trợ
16 bit.

7.3.3. Gọi API


Gọi API không khác gì với gọi hàm/ thủ tục trong module của đề án. Ví dụ
ta có thủ tục:
Public sub FindText(obiDataControl as Control, _
SFilename as String)
‘ Code to implement function here
End sub

Để gọi thủ tục ta dùng :


FindText datTitles, “Titles”
Chỉ có điều API là một thủ tục không chỉ nằm ngoài module mà còn nằm
ngoài Visual Basic.

8.3.3.1 Khai báo hàm API:


Trước khi dùng hàm API của DLL, ta cần khai báo hàm đó. Visual Basic cần
biết:
- Tên hàm / thủ tục.
- Tập tin DLL chứa nó.
- Tham số truyền.
- Kiểu dữ liệu truyền về nếu là hàm.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 59


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Khai báo API tương tự khai báo hằng/ thủ tục thông thường. Ta vẫn bắt đầu
bằng từ khoá Sub/Function, chỉ khác là trước đó phải có từ khoá Declare.
Ví dụ:
Private Declare Function FlashWindow Lib "User32" _
(ByVal hWnd As Long, _
ByVal bInvert As Long) As Long

Bài 8: Cơ bản về cổng LPT

8.1. Giới thiệu cổng LPT

Cổng LPT là 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).

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 60


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Ba 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;
12 khởi động
PAPER EMPTY (In) Mức máy
cao: hết in; máy in ở trạng thái off-line.
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

8.2. Tài nguyên hệ thống


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 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:

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 61


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Đị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):

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

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

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 62


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

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.

8.3. Cấu hình cổng

Cổng LPT có hai chuẩn đầu cắm là:


- Chuẩn 25 chân: chuẩn này thông dụng và thường được thiết kế phía máy
tính.
- Chuẩn 36 chân: ít thông dụng hơn, chuẩn này thường thiết kế phía thiết bị
ngoại vi có giao tiếp với máy tính qua cổng LPT.
Dưới đây là hình ảnh một số cổng và đầu nối cổng LPT theo chuẩn 25 chân
và chuẩn 16 chân:

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 63


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Ổ cắm 25 chân và 36 chân

8.4. Kiến trúc phần cứng


Đầu nối:
Tương ứng với hai chuẩn cổng 25 chân và 36 chân là các đầu nối 25 chân và
36 chân được minh họa như ở hình sau:

Đầu nối chuẩn 25 chân và chuẩn 36 chân

Đầu nối 25 chân phía máy tính thông thường là female 25-pin D Connector
còn phía sợi cáp là male connector.
Mạch điện:

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 64


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Mạch điện được thiết kế bên trong máy tính, cable chỉ là phương tiện mở
rộng đường truyền cho cổng LPT.
Cable:
Hầu hết các cable đều sử dụng đầu nối 25 chân kiểu male connector. Một số
khác sử dụng đầu nối 36 chân nhưng sợi cable thì chủ yếu vẫn là loại 25 sợi.
Cáp nối giữa máy in và máy tính bao gồm 25 sợi, nhưng không phải tất cả
điều được sử dụng mà trên thực tế chỉ có 18 sợi được nối với các chân cụ thể. Từ
đặc điểm quan trong này giúp chúng ta tận dụng và khắc phục được những cáp nối
mà trong lõi đã bị đứt một vài sợi.
Qua cách mô tả chức năng của từng tín hiệu riêng lẽ ta có thể nhận thấy các
đường dẫn dữ liệu có thể chia thành 3 nhóm:
- Các đường dẫn tín hiệu, xuất ra từ máy tính PC và điều khiển máy tính,
được gọi là các đường dẫn điều khiển.
- Các đường dẫn tín hiệu, đưa các thông tin thông báo ngược lại từ máy in về
máy tính, được gọi là các đường dẫn trạng thái.
- Đường dẫn dữ liệu, truyền các bit rieng lẽ của các ký tự cần in.
Tùy theo công dụng của từng loại cable mà cách ghép nối khác nhau. Sơ đồ
ghép nối cụ thể một số loại cable nhau sau:
Ghép nối máy tính với máy in:
Hai đầu sợi cable nối tương ứng các chân, nghĩa là chân 1 đầu thứ nhất nối
với chân 1 đầu thứ 2, chân 2 đầu thứ nhất nối với chân 2 đầu thứ 2,...
Ghép nối máy tính 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:

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 65


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

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

P P
Chức năng Chức năng
D0 ERROR
D1 SELECT
D2 PAPER
D3 ACK
D4 BUSY
BUSY D4
ACK D3
PAPER D2
SELECT D1
ERROR D0
GND 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 Ngọc Hưng – Bộ môn Kỹ thật Máy tính 66


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

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

P P
Chứ Chứ
D0 D0
D1 D1
D2 D2
D3 D3
D4 D4
D5 D5
D6 D6
D7 D7
SEL SEL
BUS INIT
ACK STR
S SEL
INIT BUS
STR ACK

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.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 67


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Để đọc dữ liệu, có thể dùng một IC ghép kênh 21 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.

Bài 9: Lập trình giao tiếp qua cổng LPT

9.1. Chân tín hiệu


Như đã mô tả ở phần trước. Cổng LPT có 2 chuẩn dầu nối 25 và 36 chân. Sơ
đồ các chân cũng như tên gọi được trình bày ở bảng sau:

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 68


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

- Strobe (1): Với một mức logic thấp ở chân này, máy tính thông báo cho
máy in biết có một byte đang sẵn sàng trên các đường dẫn tín hiệu để được truyền.
- D0 đến D7: Các đường dẫn dữ liệu
- Acknowledge: với một mức logic thấp ở chân này, máy in thông báo cho
máy tính biết là đã nhận được kí tự vừa gửi và có thể tiếp tục nhận.
- Busy (báo bận – 11): máy in gửi đến chân này mức logic cao trong khi
đang đón nhận hoặc in ra dữ liệu để thông báo cho máy tính biết là các bộ đệm
trong máy tính biết là các bộ đệm trong máy tính đã bị đầy hoặc máy in trong trạn
thái Off-line.
- Paper empty (hết giấy – 12): Mức cao ở chân này có nghĩa là giấy đã dùng
hết.
- Select (13): Một mức cao ở chân này, có nghĩa là máy in đang trong trạng
thái kích hoạt (On-line)
- Auto Linefeed (tự nạp dòng): Có khi còn gọi là Auto Feed. Bằng một mức
thấp ở chân này máy tính PC nhắc máy in tự động nạp một dòng mới mỗi khi kết
thúc một dòng.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 69


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

- Error (có lỗi): Bằng một mức thấp ở chân này, máy in thông báo cho máy
tính là đã xuất hiện một lỗi, chẳng hạn kẹt giấy hoặc máy in đang trong trạng thái
Off-Line.
- Reset (đặt lại): Bằng một mức thấp ở chân này, máy in được đặt lại trạng
thái được xác định lúc ban đầu.
- Select Input: bằng một mức thấp ở chân này, máy in được lựa chọn bởi máy
tính.

Biểu đồ thời gian của các chu kỳ I/O:

Chế độ Bi-directional Ports:


Sơ đồ sau cho thấy cấu trúc thanh ghi dữ liệu công LPT. Cổng LPT chuẩn
sử dụng họ 74LS.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 70


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

9.2. Các thanh ghi


Cổng LPT được truy cập, điều khiển thông qua các thanh ghi. Việc lập trình
cho cổng LPT chính là quá trình ghi được dữ liệu qua các thanh ghi. Cổng LPT có 3
thanh ghi đó là thanh ghi dữ liệu, thanh ghi điều khiển và thanh ghi trạng thái.
Thanh ghi dữ liệu (Data register): Có địa chỉ bằng địa chỉ cơ sở, thanh ghi
này có 8 đường dẫn giao diện hai hướng không đảo, nghĩa là có thể xuất dữ liệu từ
máy tính ra bên ngoài và có thể nhận tín hiệu từ bên ngoài vào thông qua thanh ghi
này, thanh ghi này nối các chân từ 29 trên cổng LPT
Thanh ghi trạng thái (status register): Có địa chỉ bằng địa chỉ cơ sở + 1, Đây
là một thanh ghi 8 bit, nhưng trong thực tế chỉ có 5 bit cao được nối với các chân 10
, 11, 12,13,15. Thanh ghi trạng thái chỉ có thể được truy xuất theo một hướng (từ
máy tính ↔ máy in) . Trong các đường dẫn của thanh ghi trạng thái, đường dẫn S7
(chân 11) là đường dẫn đảo.
Thanh ghi điều khiển (Control register): Có địa chỉ bằng địa chỉ cơ sở + 2,
cũng là một thanh ghi giao diện hai hướng, có 4 bit thấp được nối với các chân
1;14;16;17 trong đó đa số là các đường dẫn đảo (trừ C2-chân 16).

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 71


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

9.3. Địa chỉ cổng


Thông thường trên máy tính có thể quản lý đến 4 cổng. Mỗi cổng được cấp
cho một vùng địa chỉ để truy cập. Các địa chỉ này được thể hiện ở bảng sau:

9.4. Lập trình cổng LPT


Để lập trình điều khiển thiết bị qua cổng LPT ta cần có thư viện hỗ trợ truyền
thông trên cổng này. Cổng LPT cũng như hầu hết các cổng và thiết bị khác trên máy

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 72


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

tính đều được hệ điều hành bảo vệ. Các chương trình người dùng không được phép
truy cập trực tiếp trên các cổng này. Muốn truy cập vào các cổng, chương trình cần
phải được viết để chạy trong chế độ Kernel mode.
Sau đây là một ví dụ chương trình điều khiển được viết trên VB giao tiếp với
thiết bị (theo sơ đồ thiết kế đã giới thiệu ở mục trước). Chương trình này sử dụng
thư viện IO.DLL bao gồm các hàm:
- Hàm PortOut: xuất 1 byte ra cổng
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
Giao diện của chương trình:

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 73


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

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

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 74


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Width = 1095
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

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 75


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

TabIndex = 14
Top = 2040
Width = 1575
End
Begin VB.CheckBox chkSW
Height = 375
Index = 3
Left = 1800
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

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 76


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

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
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

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 77


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

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

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 78


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

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
Top = 600

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 79


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

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

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 80


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

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

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 81


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

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
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

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 82


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

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)
Private Declare Function PortIn Lib "IO.DLL" (ByV
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

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 83


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

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
Dim s As String
t=0
For i = 0 To 7
t = t + (2 ^ i) * (1 - shpLED(i).FillStyle)
Next i

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 84


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

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 Ngọc Hưng – Bộ môn Kỹ thật Máy tính 85


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Bài 10: Cơ bản về cổng COM

10.1. Giới thiệu cổng COM


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:

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 86


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

- Đơ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.
Các đặc tính kỹ thuật của chuẩn RS-232 như sau:

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.

10.2. Kiến trúc cổng


Cổng COM có hai dạng: đầu nối DB25 (25 chân) và đầu nối DB9 (9 chân).

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 87


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

10.3. Cable truyền dữ liệu


Tùy mục tiêu kết nối và chất lượng cũng như cách thức truyền mà cable
truyền có cách nối khác nhau.
Khi thực hiện truyền thông đơn giản, cable có thể kết nối theo cách sau:

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:

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 88


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

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.

10.4. Chân tín hiệu

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 89


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Ý nghĩa của các chân mô tả như sau:


D25 D9 Tín hiệu Hướng Mô tả
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 DCR 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 Ngọc Hưng – Bộ môn Kỹ thật Máy tính 90


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

10.5. Điện áp làm việc


Điện áp sử dụng truyền thông trong RS232 bao gồm cả mức điện áp âm và
dương (không tương thích với các mức logic TTL và CMOS).
Số "0" được biểu diện bằng mức điện áp +5V còn số "1" biểu diễn bằng mức
đienẹ áp -5V.
Giải điện áp sử dụng trong RS232 thể hiện trong bảng sau:

Các chíp giao tiếp, hỗ trợ chuyển đổi mức logic TTL sang mức điện áp thích
hợp trên cổng RS232: MAX232, MAX233,...

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 91


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Bài 11: Giao thức truyền thông nối tiếp

11.1. Giao thức


Định dạng một từ: mỗi từ bao gồm bit khởi đầu (start bit), các bit dữ liệu
(data bits), bit kiểm tra chẵn lẻ (parity bit), một hoặc một số bit báo hiệu kết thúc
(stop bits).
Phần cứng hỗ trợ sẵn giao thức truyền thông cấp thấp. Do vậy khi thực hiện
truyền thông qua cổng COM, người lập trình không phải xử lý đến từng bit truyền
mà chỉ cần lựa chọn chế độ thích hợp, phần cứng UART sẽ làm phần còn lại.
Có hai giao thức truyền thông:
- Truyền đồng bộ:
Là phương pháp chuyển giao dữ liệu ở đó thông tin được truyền theo các
khối (khung) bit được tách biệt bởi các khoảng thời gian bằng nhau. Để làm việc,
phương pháp truyền đồng bộ trông cậy vào việc tính thời gian được điều khiển
chính xác dựa trên các đồng hồ của các thiết bị gửi và nhận.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 92


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

- Truyền không đồng bộ (truyền dị bộ):


Một dạng truyền dữ liệu, ở đó thông tin được gửi mỗi lần một ký tự, có các
quãng thời gian biến đổi giữa các ký tự; thường được dùng để liên lạc thông qua
modem. Bởi vì việc truyền dị bộ không dựa trên bộ tính giờ chung cho phép các bên
gửi và nhận tách riêng các ký tự theo các kỳ hạn cụ thể, nên mỗi ký tự được truyền
sẽ gồm có một số lượng bit dữ liệu (tức chính bản thân ký tự đó), đi trước chúng là
một tín hiệu "bắt đầu ký tự" , được mệnh danh là bit khởi đầu, và được kêt thúc
bằng một bit chẵn lẻ tùy chọn theo sau là 1, 1. 5, hoặc 2 tín hiệu "kết thúc ký tự" ,
được gọi là các bit dừng.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 93


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

11.2. Định dạng dữ liệu


Định dạng của khung truyền dữ liệu theo chuẩn RS-232 như sau:

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 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):

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 94


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Dữ liệu truyền có thể là ở dạng nhị phân hay ký tự.


Dữ liệu nhị phân: biểu diễn trong phạm vi từ 00h đến FFh. Cổng COM
không xem xét dữ liệu truyền về mặt ngữ nghĩa do vậy nó chỉ đơn thuần là truyền di
chuỗi các bit của dữ liệu này. Các chương trình cấp cao mới quan tâm xem dữ liệu
đo là nhị phân hay ký tự và ý nghĩa của chúng là gì.
Dữ liệu là ký tự: một số phần mềm quan niệm dữ liệu truyền là các ký tự và
xử lý truyền dưới dạng ký tự. Với các ký tự một byte thì mỗi ký tự tương ứng là một
byte dữ liệu truyền. Nhưng với ký tự 2 byte (mã Unicode) thì mỗi khi truyền một kỹ
tự thực ra là truyền 2 byte dữ liệu biểu diễn mã ký tự.

11.3. Đảm bảo chất lượng truyền thông


Trong giao thức cấp thấp, gói tin truyền trên cổng COM đã có sẵn thông tin
giúp phát hiện sai sót trong khi truyền cho từng byte. Đó chính là bit kiểm tra chẵn
lẻ Parity. Với cơ chế kiểm tra này, nếu dữ liệu bị hỏng với số lẻ bit thì có thể phát
hiện được. Nhưng nếu dữ liệu bị hỏng với số chẵn các bit thì không thể phát hiện
được. Do vậy để đảm bảo dữ liệu truyền chính xác, chương trình cấp cao cần có cơ
chế kiểm tra lỗi bổ sung khi truyền để phát hiện các sai sót tốt hơn.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 95


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Trong khi giao tiếp với các thiết bị, do cấu tạo và khả năng làm việc của mỗi
thiết bị đều rất khác nhau, đặc biệt là tốc độ xử lý. Một vấn đề đặt ra là phải xử lý
sao cho các thiết bị làm việc với tốc độ khác nhau vẫn có thể kịp truyền, nhận và xử
lý thông tin. Chức năng điều khiển luồng trong truyền thông nối tiếp qua RS232
nhằm giải quyết vấn đề này. Mỗi khi truyền hay nhận máy tính sẽ xác định xem
thiết bị được ghép nối có sẵn sàng để truyền hay nhận chưa. Khi nào thiết bị sẵn
sàng mới tiến hành truyền hoặc nhận. Như vậy sẽ đảm bảo kiểm soát được lưu
lượng thông tin trên đường truyền và đảm bảo dữ liệu được gửi hay nhận một cách
chính xác hơn.

Bài 12: Lập trình giao tiếp qua cổng COM

12.1. Tài nguyên hệ thố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:

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:

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 96


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

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:

 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).

 MCR (Modem Control Register):

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 97


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

 MSR (Modem Status Register):

 LSR (Line Status Register):

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).
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 choquá 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).

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 98


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

 LCR (Line Control Register):

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:

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):

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):

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 99


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

12.2. Công cụ và kỹ thuật lập trình


Tùy theo môi trường làm việc, hệ điều hành mà có thể lựa chọn công cụ và
kỹ thuật lập trình thích hợp.
Nếu lập trình trong môi trường MS-DOS. Công cụ lập trình có thể là ngôn
ngữ Assembly, C, Passcal... Kỹ thuật lập trình có thể là xử lý ngắt, truy cập trực tiếp
các cổng, các thanh ghi để điều khiển.
Nếu lập trình trong môi trường Windows hay các hệ điều hành có chế độ bảo
vệ cao thì cần phải lựa chọn công cụ cho phù hợp ví dụ như Visual C++, Visual
Basic trong Windows.
Trong thực tế có nhiều ngôn ngữ và nhiều cách lập trình cổng COM khác
nhau. Cuốn tài liệu này giới thiệu kỹ thuật lập trình truy cập cổng COM sử dụng
ngôn ngữ lập trình Visual Basic.
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:
- Đ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ó

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 100


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

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ỏ.
Cách bổ sung điều khiển Microsoft Comm Control vào hộp công cụ của VB:
ActiveX MsComm được bổ sung vào một Visual Basic Project thông qua
menu Project > Components:

Biểu tượng của MsComm trên hộp công cụ là , và các thuộc tính cơ bản
mô tả như sau:

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 101


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

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à:

P: kiểm tra chẵn lẻ, với các giá trị:

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 102


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

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:

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 103


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

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
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:

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 104


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Đặ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:
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:

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 105


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

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:

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

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.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 106


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

12.3. Mở kết nối


Để mở kết nối ta sử dụng thuộc tính PortOpen, gán giá trị bằng true.
Ví dụ: COMM1.PortOpen=true
Chú ý: chỉ được phép mở cổng khi cổng chưa được mở bởi bất cứ một
chương trình nào và điều khiểm MSCOMM hiện chưa mở cổng.
Để tránh lỗi phát sinh ta nên kiểm tra giá trị của PortOpen trước và kèm theo
kỹ thuật bẫy lỗi để xử lý.

12.4. Gửi dữ liệu


Để gửi dữ liệu qua cổng COM ta gán dữ liệu cần gửi cho Output.
Ví dụ: COMM1.Output=”Hello”
Chú ý: chỉ gửi được dữ liệu khi cổng đã được mở. Do vậy nên kiểm tra trước
giá trị của PortOpen.

12.5. Nhận dữ liệu


Để nhận dữ liệu ta đọc Input.
Ví dụ: s=COMM1.Input
Chú ý: chỉ đọc thành công khi cổng đã được mở. Trước khi đọc dữ liệu cần
kiểm tra thuộc tính PortOpen để đảm bảo cổng đã được mở (nếu = true). Thuộc tính
InBufferCount cho biết số byte đã nhận vào trong bộ đệm.

12.6. Xử lý lỗi
Trong quá trình truyền thông, việc phát sinh lỗi là khó tránh khỏi. Do vậy
cần chú ý bẫy lỗi và xử lý các lỗi để tránh làm ngắt chương trình giữa chừng do lỗi
phát sinh.
Các vị trí bẫy và xử lý lỗi cần chú ý:
- Mở, đóng cổng
- Gửi, nhận dữ kiệu

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 107


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

12.7. Chương trình mẫu lập trình cổng COM


Nhiệm vụ: thực hiện gửi nhận xâu ký tự bất kỳ giữa 2 chương trình. Mỗi
chương trình được ghép nối trên một cổng.
Giao diện:

Chương trình:
File Comm.vbp:
Type=Exe
Form=Form1.frm
Reference=*\G{00020430-0000-0000-C000-
000000000046}#2.0#0#C:\WINDOWS\system32\stdole2.tlb#OLE Automation
Object={648A5603-2C6E-101B-82B6-000000000014}#1.1#0;
MSCOMM32.OCX
IconForm="Form1"
Startup="Form1"
HelpFile=""
ExeName32="Comm.exe"
Command32=""
Name="Comm"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 108


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

AutoIncrementVer=0
ServerSupportFiles=0
VersionCompanyName="DHSPKTHY"
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1

[MS Transaction Server]


AutoRefresh=1

File Form1.frm:

VERSION 5.00
Object = "{648A5603-2C6E-101B-82B6-000000000014}#1.1#0";
"MSCOMM32.OCX"
Begin VB.Form Form1
Caption = "COM Communication"
ClientHeight = 2055

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 109


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

ClientLeft = 60
ClientTop = 450
ClientWidth = 5100
LinkTopic = "Form1"
ScaleHeight = 2055
ScaleWidth = 5100
StartUpPosition = 3 'Windows Default
Begin VB.Timer Timer1
Interval = 100
Left = 3300
Top = 120
End
Begin VB.CommandButton cmdColse
Caption = "Close"
Height = 315
Left = 4020
TabIndex = 8
Top = 1500
Width = 975
End
Begin VB.TextBox txtRead
Height = 315
Left = 1200
TabIndex = 6
Top = 1020
Width = 3795
End
Begin VB.CommandButton cmdSend
Caption = "Send"
Enabled = 0 'False

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 110


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Height = 315
Left = 4020
TabIndex = 5
Top = 600
Width = 975
End
Begin VB.TextBox txtSend
Height = 315
Left = 1200
TabIndex = 4
Top = 600
Width = 2715
End
Begin VB.CommandButton cmdOpenPort
Caption = "Open port"
Height = 315
Left = 1260
TabIndex = 2
Top = 180
Width = 1395
End
Begin VB.TextBox txtPort
Height = 315
Left = 600
TabIndex = 1
Text = "1"
Top = 180
Width = 555
End
Begin MSCommLib.MSComm MSComm1

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 111


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Left = 4440
Top = 60
_ExtentX = 1005
_ExtentY = 1005
_Version = 393216
DTREnable = -1 'True
End
Begin VB.Label Label1
AutoSize = -1 'True
Caption = "Read data:"
Height = 195
Index = 2
Left = 120
TabIndex = 7
Top = 1080
Width = 795
End
Begin VB.Label Label1
AutoSize = -1 'True
Caption = "Data to send:"
Height = 195
Index = 1
Left = 120
TabIndex = 3
Top = 660
Width = 960
End
Begin VB.Label Label1
AutoSize = -1 'True
Caption = "Port:"

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 112


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Height = 195
Index = 0
Left = 120
TabIndex = 0
Top = 240
Width = 330
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
'Quy trinh:
'1. Thiet lap thong so: CONG, toc do, parity,...
'2. Mo cong: chi mo mot lan
'2. Gui/Nhan du lieu
'3. Ket thuc: dong cong

Private Sub cmdColse_Click()


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

Private Sub cmdOpenPort_Click()


On Error GoTo loi
If MSComm1.PortOpen = True Then MSComm1.PortOpen = False 'Dong
cong neu da ma

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 113


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

cmdSend.Enabled = False
MSComm1.CommPort = Val(txtPort.Text) 'Xac dinh cong truyen thong
MSComm1.PortOpen = True 'Mo cong
cmdSend.Enabled = True
Exit Sub
loi:
MsgBox Err.Description
End Sub

Private Sub cmdSend_Click()


If MSComm1.PortOpen = True Then
MSComm1.Output = txtSend.Text
End If
End Sub

Private Sub Timer1_Timer()


If MSComm1.PortOpen Then
If MSComm1.InBufferCount >= 1 Then
txtRead.Text = txtRead.Text & MSComm1.Input
End If
End If
End Sub

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 114


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Bài 13: Cơ bản về cổng USB

13.1. Giới thiệu cổng USB

USB (Universal Serial Bus) là một chuẩn kết nối tuần tự trong máy tính.
USB sử dụng để kết nối các thiết bị ngoại vi với máy tính, chúng thường được thiết
kế dưới dạng các đầu cắm cho các thiết bị tuân theo chuẩn cắm-là-chạy (plug-and-
play) mà với tính năng gắn nóng (hot swapping) thiết bị (cắm và ngắt các thiết bị
không cần phải khởi động lại hệ thống).
Cổng USB đang được sử dụng khá phổ biến cho các thiết bị ghép nối với
máy tính hiện nay.
Các đặc điểm của USB bao gồm:
- Máy tính hoạt động như một Host.
- Có tới 127 thiết bị có thể kết nối vào máy tính bao gồm cả nối trực
tiếp hay qua USB Hub.
- Các cáp USB (USB Cable) của từng thiết bị có thể dài tới 5m hay
30m với Hub.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 115


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

- Chuẩn USB2.x cho phép truyền dữ liệu trên Bus tới tốc độ 480
Mbps.
- Một cáp USB có hai dây cung cấp điện và một đôi dây xoắn
truyền dữ liệu.
- Trên dây cung cấp điện năng, điện áp có thể lên tới 500mA - 5V.
- Các thiết bị sử dụng ít điện năng được cung cấp điện năng trực tiếp
từ Bus. Các Hub có thể cung cấp điện năng cho các thiết bị nối với
nó từ nguồn điện riêng của chúng.
- Các thiết bị USB có khả năng hoán đổi nhanh, có thể cắm vào hay
rút ra khỏi Bus bất kỳ lúc nào.
- Các thiết bị USB có thể đặt ở chế độ “ngủ” (Sleep Mode) khi máy
tính chuyển sang chế độ Power-Saving.
- Các thiết bị nối với cổng USB dùng cáp USB để truyền tải dòng
điện hay dữ liệu. Khi máy tính hoạt động, nó truy vấn tới tất cả các
thiết bị nối vào Bus và gán cho mỗi thiết bị một địa chỉ. Quá trình
này được gọi là liệt kê các thiết bị. Máy tính cũng sẽ tìm ra cách
truyền dữ liệu của từng thiết bị:
- Interrupt: Các thiết bị như bàn phím gửi lượng dữ liệu rất nhỏ và
ngắt đoạn sẽ được chọn kiểu Interrupt Mode.
- Bulk: Các thiết bị như máy in thường nhận những gói dữ liệu lớn,
dùng kiểu Bulk Transfer Mode. Từng đoạn dữ liệu (64 Byte) được
gửi tới máy in và được kiểm tra tính chính xác.
- Isochronous: Các thiết bị truyền dữ liệu theo dạng Stream như loa
sẽ dùng Isochronous Mode. Dữ liệu tức thời được truyền giữa thiết
bị và máy tính và không có cơ chế sửa lỗi.

13.2. Đầu nối USB


Giao diện USB: sử dụng đầu nối 4 tiếp điểm và cable truyền thông bao gồm
4 sợi. Đầu nối hỗ trợ 2 chuẩn là chuẩn A và chuẩn B. Chuẩn A sử dụng đầu nối dẹt,

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 116


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

4 tiếp điểm trải phẳng. Đầu nối chuẩn B sử dụng đầu nối vuông, các tiếp điểm xếp
thành 2 hàng.

Đầu nối chuẩn A

Đầu nối và Hub theo chuẩn A

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 117


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Đầu nối và Hub theo chuẩn B

USB kiểu A bao gồm một hàng chân đánh số 1 2 3 4 còn kiếu B gồm hai
hàng chân song song đánh số 2 1 3 4 (nhìn đối điện, đếm chữ Z ,từ trái qua phải, từ
trên xuống dưới)

13.3. Cable truyền dữ liệu


Hệ thống được thiết kế sao cho không xảy ra hiện tượng đấu nối nhầm. Khác
với chuẩn RS-232, việc kết nối ở USB không chia ra những kiểu đấu khác nhau như
nối thẳng hay bắt chéo.
USB sử dụng cáp 4 lõi (chính ), trong đó D+ và D- là hai sợi cáp xoắn chéo
nhau và truyền dữ liệu dưới dạng vi phân, GND thường là lớp bọc kim bên ngoài,
còn lại là +5VDC và cáp nối luôn được liên kết 1:1.
Việc chuyển đổi qua lại giữa 2 loại A-B được thông qua đầu nối chuyển đổi
A-B. Các cáp nối, chuyển đổi USB được các nhà sản xuất cung cấp đưới dạng hoàn
chỉnh, trên đó : đầu cắm, độ dài cáp, độ xoắn D+/D- , chất lượng lớp bọc kim chống
nhiễu đã được tối ưu và chuẩn hóa nên không thể thay đổi được, vì tốc độ truyền

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 118


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

của USB là rất cao và phương thức truyền cũng khá phức tạp.! vì vậy tuỳ theo mục
đích sử dụng mà ta phải chọn cho đúng loại cáp (từ chiều dài cho đến loại đầu nối).

Hình ảnh sợi cáp USB trong thực tế

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 119


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Ngoài ra để hỗ trợ cho người dùng có thể tự chế tạo các module ghép nối qua
USB, các nhà chế tạo cũng có sẵn các đế cắm USB đơn có chân để hàn lên mạch in.
Một điểm đáng lưu ý là, USB có thể có các tốc truyền dữ liệu khác nhau
(low-speed, full-speed và high-speed) thế nên sẽ ngẫu nhiên xảy ra tình huống là
một thiết bị USB tốc độ cao lại được đấu nối vào một cái khác có tốc độ thấp hơn
(VD: high-speed USB flash disk được cắm vào đầu cắm low-speed USB của PC có
mainboard đời cũ), hay một thiết bị USB tốc độ cao lại được đấu nối vào PC qua
một cáp nối tốc độ thấp. Để khắc phục tình trạng này, tất cả các thiết bị có USB đều
được trang bị hệ thống phần cứng và phần mềm thích nghi và tất cả các cáp nối đều
là loại tốc độ cao . Loại cáp tốc độ thấp được chỉ định cho những trường hợp ứng
dụng cụ thể và được nhà sản xuất ghi rõ. (vd cáp nối dùng cho chuột USB); còn
những ứng dụng video đều sử dụng cáp tốc độ cao.

13.4. Tín hiệu và điện áp làm việc


Sơ đồ chân tín hiệu:

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 120


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Kiến trúc low-full speed:


Low-full speed cho phép truyền với tốc độ 1.5Mbps đến 12Mbps. Mạch điện
được thể hiện ở hình sau:

Hight speed:
Cho phép truyền nhận với tốc độ lên đến 480Mbps. Chế độ truyền
thông hight speed được hỗ trợ ở USB phiên bản 2.0. Các phiên bản trước mới chỉ
hỗ trợ các tốc độ thấp và đầy đủ.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 121


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Tín hiệu điện:


Chế độ Low và Full Speed:
Giá trị "1" được mã hóa: chân D+ có điện áp ít nhất là 2.8V và D- không lớn
hơn 0.3V. Điện áp D+>D-.
Giá trị "0" được mã hóa: chân D- có điện áp tối thiểu 2.8V avf D+ không lớn
hơn 0.3V. Điện áp D->D+.
Chế độ Hight Speed:
Giá trị "1" được mã hóa: D+ tối thiểu 0.36V, D- không lớn hơn 0.01V.
Giá trị "0" được mã hóa: D- tối thiểu 0.36V, D+ không lớn hơn 0.01V.

Bài 14: Giao thức truyền thông cổng USB

14.1. Cấu trúc chung


Dữ liệu truyền trên USB sử dụng các gói theo một giao thức đã được định
nghĩa sẵn.
Gói dữ liệu: bao gồm SYNC, PID, address, endpoint, frame number, data và
CRC. Bảng sau cho thấy các thông tin chi tiết mỗi trường của gói dữ liệu này:

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 122


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

14.2. Thứ tự bit


Các bit được gửi ra ngoài theo thứ tự bắt đầu từ bit có trọng số thấp nhất
(LSb) và bit có trọng số cao nhất (MSb) được truyền sau cùng.

14.3. Trường đồng bộ


Tất cả các gói tin đều được bắt đầu bởi trường đồng bộ (SYNC). Trường này
được sử dụng cho mạch nhận dùng để sắp xếp dữ liệu đến cho khớp với xung đồng
hồ cục bộ trên máy nhận. Một trường đồng bộ bắt đầu quá trình truyền bởi 8 bit
trong chế độ full/low speed và 32 bit cho chế độ hight-speed.

14.4. Định dạng gói


Trường định dạng gói tin dùng để định dạng cho từng token, dữ liệu và các
gói bắt tay.
Trường nhận dạng gói tin (PID) theo ngay sau trường đồng bộ trong mỗi gói
tin. Một PID bao gồm 4 bit định dạng kiểu gói tin và tiếp theo là 4 bit kiểm tra
tương ứng.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 123


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Các kiểu gói tin được thể hiện ở bảng sau:

Trường địa chỉ: đầu cuối được định địa chỉ bởi 2 trường là trường địa chỉ và
trường đầu cuối.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 124


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Trường địa chỉ bao gồm 7 bit, mã hóa được 128 địa chỉ khác nhau. Cấu trúc
trường này được mô tả như hình sau:

Trường đầu cuối bao gồm 4 bit cho phép định địa chỉ một cách linh hoạt các
đầu cuối. Cấu trúc của trường này như sau:

Trường số hiệu khung: bao gồm 11 bit dùng để đánh thứ tự khung truyền.
Giá trị này sẽ tự động được tăng bởi host. Khi tăng đến giá trị tối đa thì quay về 0.
Trường dữ liệu: có độ lớn từ 0 đến 1024 byte và phải là số nguyên các byte.
Định dạng của trường này được thể hiện như ở hình sau:

Gói Token: bao gồm PID, xác định kiểu là IN, OUT hay SETUP và các
trường ADDR, ENDP.

14.5. Truyền dữ liệu


Mô hình giao tiếp giữa thiết bị ghép nối qua USB với máy tính (Host):

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 125


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Luông truyền thông USB được thể hiện chi tiết ở hình sau:

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 126


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Bus Enumeration
Khi thiết bị USB được nối vào máy tính hoặc bị ngắt khỏi máy tính, máy tính
sẽ sử dụng một tiến trình được gọi là Bus Enumeration để nhận biết và quản lý sự
thay đổi trạng thái các thiết bị. Khi một thiết bị USB được ghép nối vào máy tính,
các xử lý sau sẽ được thực hiện:
- Khi thiết bị được ghép nối vào cổng USB, thiết bị ở trạng thái bật
nguồn
- Máy tính xác định các thay đổi bằng việc gửi các truy vấn đến
hub.
- Sau khi xác định được cổng mã thiết bị đã ghép nối vào, máy tính
chờ khoảng 100ms cho phép các kết nối được hoàn tất. Máy tính
gửi lệnh khởi tạo đến cổng.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 127


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

- Hub tiến hành khởi tạo lại cổng, khi kết thúc quá trình khởi tạo,
cổng được chép phép kích hoạt. Thiết bị USB vào trạng thái mặc
định và có thể tiêu thụ một dòng điện không quá 100mA của
Vbus. Tất cả các thanh ghi và trạng thái đều được khởi tạo.
- Máy tính gán cho thiết bị một địa chỉ duy nhất, đưa thiết bị vào
trạng thái định địa chỉ.
- Trước khi thiết bị nhận được địa chỉ duy nhất, ống điều khiển mặc
định vấn duy trì truy cập thông qua địa chỉ mặc định. Máy tính
được các thông tin mô tả thiết bị và xác định kích thước dữ liệu tối
đa mà thiết bị này có thể nhận để ống mặc định sử dụng truyền
thông với thiết bị.
- Máy tính đọc các thông tin cấu hình của thiết bị bằng cách đọc các
cấu hình từ 0 đến n-1 khi có n cấu hình. Tiến trình này có thể phải
mất vài ms để hoàn tất.
- Trên cở sở các thông tin cấu hình máy tính xác định được thiết bị
hoạt động như thế nào. Máy tính sẽ gán một cấu hìnhg cho thiết bị.
Thiết bị bây giờ chuyển vào trạng thái đã được cấu hình.
Khi thiết bị được tháo khỏi cổng USB, Hub sẽ gửi một thông báo đến máy
tính. Máy tính sẽ vô hiệu hóa cổng mà thiết bị vừa tháo khỏi.

Bài 15: Lập trình cổng USB

15.1. Cơ bản về trình điều khiển thiết bị


Lập trình cho USB được chia thành các phần như sau:
- Lập trình cho các chương trình điều khiển trên máy tính tạo giao diện và
điều khiển được thiết bị ghép nối qua cổng USB.
- Lập trình cho các firmwave trên thiết bị ghép nối với máy tính qua USB.
Phần lập trình trên máy tính khá phức tạp, ta không thể trực tiếp truy cập các
cổng USB và truyển thông với thiết bị. Với mỗi thiết bị ghép nối với máy tính cần
phải trải qua các giải đoạn:

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 128


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

- Windows nhận biết thiết bị, bắt tay với thiết bị


- Cài đài driver điều khiển thiết bị
Như vậy để lập trình truyền thông với mỗi thiết bị ta cần phải có phần driver
trên máy tính cho các thiết bị. Nếu là thiết bị mới ta phải viết chương trình driver
cho thiết bị.
Sau khi thiết bị đã được nhận dạng và cài đặt driver thành công, ta có thể lập
trình sử dụng các hàm truyền thông được cung cấp thông qua driver để truyền nhận
dữ liệu, giao tiếp với thiết bị qua cổng USB.

15.2. Mô hình trình điều khiển thiết bị Win32


Trình điều khiển cho thiết bị USB phải tương thích với mô hình trình điều
khiển thiết bị Win32 của windows. Các trình điều khiển này được gọi là các trình
điều khiển WDM và có phần mở rộng là sys.
Giống như các trình điều khiển cấp thấp khác. WDM có khả năng không sẵn
sàng cho các ứng dụng bởi vì các trình điều khiển giao tiếp với hệ điều hành mở
mức thấp, có độ ưu tiên cao. Một trình điều khiển WDM có thể cho phép hoặc cấm
ứng dụng truy cập vào thiết bị.

15.3. Chọn kiểu thiết bị


Làm thế nào để bạn có thể quyết định là có sử dụng được một trình điều
khiển thiết bị hiện có, một trình điều khiển riêng hay kết hợp cả hai? Điều đó phục
thuộc vào nhu cầu về năng lực thực hiện, giá thành và tốc độ phát triển.
Sử dụng trình điều khiển cung cấp cùng với Windows: đây là cách tiếp cận
đơn giản, không phải mất chi phí cho việc phát triển driver. Thuận tiện cho việc
triển khai sản phẩm và sử dụng.
Sử dụng trình điều khiển được cung cấp bởi các nhà sản xuất: theo cách này,
ta sử dụng trình điều khiển được các nhà sản xuất chip cung cấp. Cách này cũng khá
đơn giản, chi phí thấp.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 129


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Sử dụng trình điều khiển riêng: có những lúc các trình điều khiển có sẵn của
windows hay của các hãng sản xuất chip không đáp ứng được yêu cầu sử dụng, khi
đó ta cần phải tạo ra trình điều khiển riêng cho thiết bị.

15.4. Lập trình Driver


Nếu bạn không có kinh nghiệm lập trình trình điều khiển, việc tạo ra một
trình điều khiển WDM không phải là dễ dàng. Nó cần phải có các đầu tư về công
cụ, là chuyên gia trong lập trình bằng ngôn ngữ C và phải có vốn hiểu biết đáng kể
về giao tiếp giữa Windows với các phần mềm ứng dụng cũng như phần cứng.
Mặt khác, việc lập trình driver cho USB dù sao cũng dễ hơn là lập trình cho
các thiết bị được ghép nối trên các khe cắm mở rộng như ISA hay PCI.
Yêu cầu:
Yêu cầu tối thiểu cho viết một driver cho USB là bộ Micrsoft’s Visual C++
và bộ công cụ phát triển driver Windows Device Developer's Kit (DDK).
Sử dụng Driver Toolkit:
Toolkit hỗ trợ tạo ra các driver một cách nhanh chóng và hiệu quả. Hiện có 2
nhóm công cụ là:
- Tạo ra trình điều khiển USB chung giúp xử lý và giao tiếp với
cổng USB, tạo ra file INF, cho phép các chương trình ứng dụng sử
dụng driver. Đây là cách tiếp cận nhanh, không cần phải lập trình
nhiều vẫn tạo được driver.
- Cung cấp các thư viện, qua đó trợ giúp cho quá trình phát triển các
driver.

Bài 16: Cổng GAME và các giao tiếp mở rộng

16.1. Giới thiệu chung


Cổng GAME là một kết nối thông thường được sử dụng cho các thiết bị vào
cho các GAME đồ họa trên các máy tính 86x. Từ khoảng năm 1990, cổng GAME
thường được tích hợp cùng với card âm thanh có thể theo chuẩn ISA hay PCI hoặc

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 130


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

tích hợp sẵn trên motherboards. Microsoft không còn tiếp tục hỗ trợ cho cổng
GAME từ phiến bản hệ điều hành Windows Vista, vì vậy có thể các nhà sản xuất sẽ
không chế tạo ra các board có hỗ trợ cổng này nữa.

16.2. Đầu nối và chân tín hiệu


Cổng GAME sử dụng đầu nối 15 chân theo chuẩn DA-15 male.

Các chân được mô tả như sau:


Pin 1 +5V +5V DC
Pin 2 B1 Button 1
Pin 3 X1 X axis for joystick 1 (0-100 kohm)
Pin 4 GND Ground for B1
Pin 5 GND Ground for B2
Pin 6 Y1 Y axis for joystick 1 (0-100 kohm)
Pin 7 B2 Button 2
Pin 8 +5V +5V DC
Pin 9 +5V +5V DC
Pin 10 B4 Button 4

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 131


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Pin 11 X2 X axis for joystick 2 (0-100 kohm)


Pin 12 GND Ground for buttons 3 and 4 (or MIDI out)
Pin 13 Y2 Y axis for joystick 2 (0-100 kohm)
Pin 14 B3 Button 3
Pin 15 +5V +5V DC (or MIDI in, sometimes unconnected)

16.3. Lập trình cho cổng GAME


Lập trình cho tất cả các joystick đều có thể thực hiện được thông qua cổng
201h.
Việc lập trình cho các joystick thông thường bao gồm:
- Đọc trạng thái các nút của joystick
- Đọc vị trí của joystick
BIOS có ngắt hỗ trợ lập trình cho joystick, đó là ngắt 15h.

16.4. Các giao tiếp mở rộng


Ngoài các cổng giao tiếp thông thường như cổng nối tiếp (COM), cổng song
song (LPT), cổng nối tiếp đa năng (USB), cổng GAME. Máy tính còn hỗ trợ nhiều
giao tiếp mở rộng cho phép người dùng có thể cair tiến, ứng dụng máy tính vào các
mục đích khác nhau.
Các khe cắm mở rộng (ISA, PCI,...) là các lựa chọn hết sức phong phú cho
việc phát triển các ghép nối mở rộng cho máy tính nhằm ứng dụng một cách hiệu
quả máy tính vào thực tiễn cuộc sống (ghép nối, điều khiển các thiết bị,...).

THỰC HÀNH
Bài 17: Cơ bản về VB6

17.1. Kiến thức lý thuyết liên quan


- Cấu trúc, cách tạo, cách chạy một chương trình trong VB
- Kiểu dữ liệu, biến, hằng

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 132


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

- Các lệnh điều khiển


17.2. Bài tập thực hành
- Bài 1: Viết chương trình “Hello world”
Viết chương trình hiển thị trên màn hình dòng chữ “Hello world”

- Bài 2: Viết chương trình nhập vào 2 số nguyên n1, n2 và hiển thị các số
lẻ từ n1 đến n2 và tổng của chúng.
Nhập:

Kết quả:

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 133


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

Bài 18: Lập trình chương trình con

18.1. Kiến thức lý thuyết liên quan


- Chương trình con
- Các loại tham số
- Cách gọi chương trình con
18.2. Bài tập thực hành
- Bài 1: Viết hàm tìm Min, hàm tìm Max của 2 số
Tham số đầu vào là hai số có kiểu bất kỳ. Đầu ra là giá trị lớn nhất hay
nhỏ nhất của 2 số đầu vào.

- Bài 2: Viết thủ tục hoán đổi 2 giá trị cho nhau
Đầu vào là 2 biến có kiểu bất kỳ
Đầu là các biến đã truyền vào nhưng với nội dung đã được hoán đổi.

Bài 19: Sử dụng các điều khiển cơ bản VB6

19.1. Kiến thức lý thuyết liên quan


- Các loại điều khiển thường dùng: textbox, command button, label,
picture box, image.
- Kỹ thuật lập trình đáp ứng các sự kiện liên quan đến chuột, bàn phím
19.2. Bài tập thực hành
- Bài 1: sử dụng nút lệnh, hộp Text
- Bài 2: dùng Listbox, combobox và label
- Bài 3: kết hợp sử dụng các điều khiển

Bài 20: Sử dụng các điều khiển mở rộng VB6

20.1. Kiến thức lý thuyết liên quan


- Các điều khiển mở rộng.
- Kỹ thuật lập trình đáp ứng các sự kiện liên quan đến chuột, bàn phím.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 134


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

20.2. Bài tập thực hành


- Bài 1: lập trình hộp thoại
- Bài 2: lập trình kết hợp sử dụng các điều khiển mở rộng

Bài 21: Lập trình xử lý file

21.1. Kiến thức lý thuyết liên quan


- Các loại file
- Cách truy cập file văn bản
- Cách truy cập file truy cập ngẫu nhiên
21.2. Bài tập thực hành
- Bài 1: Nhập danh sách thông số kỹ thuật ghi vào file văn bản
- Bài 2: Nhập danh sách thông số kỹ thuật ghi vào file truy cập ngẫu nhiên

Bài 22: Thiết kế giao diện

22.1. Quy tắc trình bày giao diện


- Đặt tên
- Kích thước điều khiển
- Font chữ
- Màu sắc
22.2. Bài tập thực hành
- Bài 1: Thiết kế giao diện nhập dữ liệu bằng hộp text
- Bài 2: Thiết kế giao diện nhập liệu bằng Listbox, combobox và thanh
cuốn
- Bài 3: Điều khiển chức năng bằng các nút lệnh

Bài 23: Thiết kế mô phỏng

23.1. Kiến thức lý thuyết liên quan


- Các điều khiển thường dùng: picturebox, image, timer.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 135


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

- Xừ lý ảnh, vẽ hình
- Kỹ thuật tạo chuyển động
23.2. Bài tập thực hành
- Bài 1: Lập trình vật di chuyển theo 1 quỹ đạo thẳng
- Bài 2: Lập trình động cơ quay, có đảo chiều, tốc độ
- Bài 3: Lập trình băng tải phân loại hàng

Bài 24: Tạo ActiveX Control

24.1. Kiến thức lý thuyết liên quan


- Cấu trúc một ActiveX control
- Các bước tạo ActiveX control
- Cách sử dụng ActiveX control
24.2. Bài tập thực hành
- Bài 1: Tạo điều khiển là một động cơ có đảo chiều, thay đổi được tốc độ
và khai báo sử dụng trong project.
- Bài 2: Tạo điều khiển băng tải phân loại hàng và sử dụng điều khiển đã
tạo.

Bài 25: Lập trình truyền thông qua cổng LPT - 1

25.1. Kiến thức lý thuyết liên quan


- Thư viện liên kết động DLL, hàm API
- Cách khai báo và sử dụng hàm API
- Đặc điểm và cách truyền nhận dữ liệu trên cổng LPT
- Thư viện lập trình cổng LPT
25.2. Bài tập thực hành
Lập trình điều khiển 8 Leds nối trên 8 đường dữ liệu ra của LPT nháy đuổi.

Bài 26: Lập trình truyền thông qua cổng LPT - 2

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 136


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

26.1. Kiến thức lý thuyết liên quan


- Thư viện liên kết động DLL, hàm API
- Cách khai báo và sử dụng hàm API
- Đặc điểm và cách truyền nhận dữ liệu trên cổng LPT
- Thư viện lập trình cổng LPT
26.2. Bài tập thực hành
Lập trình truyền nhận xâu ký tự qua cổng LPT.

Bài 27: Lập trình tuyền thông qua cổng COM - 1

27.1. Kiến thức lý thuyết liên quan


- Giao thức truyền thông nối tiếp
- Thư viện lập trình cổng COM
- Cách sử dụng đối tượng truyền thông qua cổng COM
27.2. Bài tập thực hành
Lập trình gửi, nhận dữ liệu giữa hai chương trình qua cổng COM

Bài 28: Lập trình truyền thông qua cổng COM - 2

28.1. Kiến thức lý thuyết liên quan


- Giao thức truyền thông nối tiếp
- Thư viện lập trình cổng COM
- Cách sử dụng đối tượng truyền thông qua cổng COM
28.2. Bài tập thực hành
Lập trình điều khiển thiết bị (đã được mô phỏng) qua cổng COM

Bài 29: Lập trình mô phỏng điều khiển hệ thống qua cổng COM

29.1. Kiến thức lý thuyết liên quan


- Giao thức truyền thông nối tiếp
- Thư viện lập trình cổng COM

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 137


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

- Cách sử dụng đối tượng truyền thông qua cổng COM


- Kỹ thuật tạo mô phỏng

29.2. Bài tập thực hành


Lập trình tạo giao diện, mô phỏng hoạt động ứng dụng điều khiển thiết bị
(được mô phỏng/hoặc thiết bị thực) ghép nối qua cổng COM.

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 138


LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG

TÀI LIỆU THAM KHẢO

[1] Jan Axelson, "Paranell Port Complete", Lakeview Research LLC, 2007

[2] Jan Axelson, "Serial Port Complete", Lakeview Research LLC, 2007

[3] Jan Axelson, "USB Complete", Lakeview Research LLC, 2001

[4] Compaq, Hewlett-Package, Intel, Lucent, Microsoft, NEC, Philips,


"Universal Serial Bus Specification", Revision 2.0, 2000

[5] Nguyễn Hữu Anh , "Lập trình Visual Basic 6.0", Nhà xuất bản Giáo dục,
2000

Phạm Ngọc Hưng – Bộ môn Kỹ thật Máy tính 139

You might also like