Tài liệu Lập trình điều khiển thiết bị: LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
1 
MỤC LỤC 
MỤC LỤC ............................................................................................................. 1 
Bài 1 ...................................................................................................................... 6 
TỔNG QUAN VỀ LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ .......................................... 6 
1.1. Lập trình điều khiển thiết bị từ máy ............................................................. 6 
1.2. Giới thiệu các giao diện truyền thông trên máy tính .................................... 6 
1.3. Các ngôn ngữ lập trình ............................................................................... 7 
1.4. Lập trình điều khiển trong Windows Form ................................................... 8 
1.4.1. Thiết kế giao diện ................................................................................. 8 
1.4.2. Sử dụng các điều khiển .......................................................
                
              
                                            
                                
            
 
            
                 103 trang
103 trang | 
Chia sẻ: putihuynh11 | Lượt xem: 831 | Lượt tải: 0 
              
            Bạn đang xem trước 20 trang mẫu tài liệu Lập trình điều khiển thiết bị, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
1 
MỤC LỤC 
MỤC LỤC ............................................................................................................. 1 
Bài 1 ...................................................................................................................... 6 
TỔNG QUAN VỀ LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ .......................................... 6 
1.1. Lập trình điều khiển thiết bị từ máy ............................................................. 6 
1.2. Giới thiệu các giao diện truyền thông trên máy tính .................................... 6 
1.3. Các ngôn ngữ lập trình ............................................................................... 7 
1.4. Lập trình điều khiển trong Windows Form ................................................... 8 
1.4.1. Thiết kế giao diện ................................................................................. 8 
1.4.2. Sử dụng các điều khiển ........................................................................ 9 
1.4.3. Sử dụng các thư viện ........................................................................... 9 
Bài 2 .................................................................................................................... 10 
NGÔN NGỮ LẬP TRÌNH C# .............................................................................. 10 
2.1. Cấu trúc chương trình ............................................................................... 11 
2.2. Kiểu dữ liệu ............................................................................................... 12 
2.3. Biến, hằng và cách khai báo ..................................................................... 16 
2.3.1. Biến .............................................................................................................................. 16 
2.3.2. Hằng ............................................................................................................................. 18 
2.4. Các phép toán ........................................................................................... 21 
2.4.1. Phép toán số học ......................................................................................................... 21 
2.4.2. Phép toán quan hệ ...................................................................................................... 22 
2.4.3. Phép toán logic ........................................................................................................... 22 
2.4.4. Phép toán tăng giảm ................................................................................................... 23 
2.4.5. Thứ tự ưu tiên các phép toán ..................................................................................... 24 
2.5. Biểu thức ................................................................................................... 25 
2.5.1. Biểu thức số học .......................................................................................................... 25 
2.5.2. Biểu thức logic ............................................................................................................. 26 
2.5.3. Biểu thức điều kiện ...................................................................................................... 26 
2.5.4. Biểu thức gán ............................................................................................................... 27 
2.5.5. Biểu thức ép kiểu ......................................................................................................... 27 
2.6. Cấu trúc rẽ nhánh ..................................................................................... 29 
2.6.1. Cấu trúc rẽ nhánh if ..................................................................................................... 29 
2.6.2. Cấu trúc rẽ nhánh switch ............................................................................................. 34 
2.7. Cấu trúc lặp while, do .. while.................................................................... 37 
2.7.1. Cấu trúc lặp While ................................................................................ 37 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
2 
2.7.2. Cấu trúc lặp do...while ............................................................................... 38 
2.8. Cấu trúc lặp for và một số lệnh điều khiển khác ....................................... 41 
2.8.1. Cấu trúc lặp for ......................................................................................... 41 
2.8.1. Cấu trúc lặp foreach .................................................................................. 46 
2.8.1. Các lệnh điều khiển khác ........................................................................... 47 
Bài 3 .................................................................................................................... 47 
SỬ DỤNG FORM VÀ CÁC ĐIỀU KHIỂN CƠ BẢN ............................................. 47 
3.1. Form .......................................................................................................... 47 
3.1.1. Chức năng .............................................................................................................. 47 
3.1.2. Một số thuộc tính thường dùng ............................................................................. 48 
3.1.3. Một số sự kiện thường dùng .................................................................................. 51 
3.1.4. Ví dụ minh họa ...................................................................................................... 52 
3.2. Labels ....................................................................................................... 54 
3.3. Button ........................................................................................................ 54 
3.4. Texbox ...................................................................................................... 55 
3.5. ComboBox, ListBox ................................................................................... 60 
3.6. Checkbox, RadioButton ............................................................................ 61 
Bài 4 .................................................................................................................... 62 
THỰC HÀNH SỬ DỤNG CÁC ĐIỀU KHIỂN CƠ BẢN ....................................... 62 
4.1. Mục tiêu .................................................................................................... 62 
4.2. Các kiến thức lý thuyết liên quan .............................................................. 62 
4.3. Nội dung luyện tập .................................................................................... 62 
Bài 5 .................................................................................................................... 62 
SỬ DỤNG CÁC ĐIỀU KHIỂN XỬ LÝ HÌNH ẢNH ............................................... 62 
VÀ THỜI GIAN ................................................................................................... 62 
5.1. PictureBox ................................................................................................. 62 
5.2. ImageList .................................................................................................. 63 
5.3. Timer ......................................................................................................... 63 
5.4. DateTimePicker ......................................................................................... 63 
5.5. ListView ..................................................................................................... 63 
5.6. TreeView ................................................................................................... 64 
5.7. ProgressBar .............................................................................................. 64 
Bài 6 .................................................................................................................... 64 
THỰC HÀNH SỬ DỤNG CÁC ĐIỀU KHIỂN XỬ LÝ HÌNH ẢNH VÀ THỜI GIAN
 ............................................................................................................................ 64 
6.1. Mục tiêu .................................................................................................... 64 
6.2. Các kiến thức lý thuyết liên quan .............................................................. 64 
6.3. Nội dung luyện tập .................................................................................... 64 
Bài 7 .................................................................................................................... 65 
KỸ THUẬT THIẾT KẾ GIAO DIỆN ...................................................................... 65 
7.1. Các nguyên tắc chung trong thiết kế giao diện ......................................... 65 
7.2. Thiết kế giao diện trong C# ....................................................................... 65 
7.3. Kỹ thuật thiết kế giao diện điều khiển hệ thống ......................................... 66 
Bài 8 .................................................................................................................... 66 
THẢO LUẬN THIẾT KẾ GIAO DIỆN ................................................................... 66 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
3 
8.1. Mục tiêu .................................................................................................... 66 
8.2. Tổ chức ..................................................................................................... 66 
Bài 9 .................................................................................................................... 67 
TẠO MÔ PHỎNG THIẾT BỊ ĐIỀU KHIỂN VÀ CHUYỂN ĐỘNG TỊNH TIẾN ...... 67 
9.1. Tạo mô phỏng thiết bị điều khiển .............................................................. 67 
9.2. Các kỹ thuật tạo mô phỏng chuyển động tịnh tiến .................................... 67 
9.2.1. Kỹ thuật thay đổi toạ độ ...................................................................... 67 
9.2.2. Kỹ thuật vẽ lại hình ............................................................................. 67 
9.3. Các ví dụ về tạo mô phỏng chuyển động tịnh tiến .................................... 68 
Bài 10 .................................................................................................................. 68 
THỰC HÀNH LẬP TRÌNH MÔ PHỎNG .............................................................. 68 
THIẾT BỊ ĐIỀU KHIỂN ........................................................................................ 68 
10.1. Mục tiêu ................................................................................................. 68 
10.2. Các kiến thức lý thuyết liên quan ........................................................... 68 
10.3. Nội dung luyện tập ................................................................................. 68 
Bài 11 .................................................................................................................. 69 
TẠO MÔ PHỎNG CHUYỂN ĐỘNG QUAY ......................................................... 69 
11.1. Các kỹ thuật tạo mô phỏng chuyển động quay ...................................... 69 
11.1.1. Kỹ thuật vẽ lại hình .......................................................................... 69 
11.1.2. Kỹ thuật thay hình ........................................................................... 69 
11.2. Các ví dụ về tạo mô phỏng chuyển quay ............................................... 70 
Bài 12 .................................................................................................................. 70 
THỰC HÀNH LẬP TRÌNH MÔ PHỎNG .............................................................. 70 
THIẾT BỊ CHUYỂN ĐỘNG TỊNH TIẾN ............................................................... 70 
12.1. Mục tiêu ................................................................................................. 70 
12.2. Các kiến thức lý thuyết liên quan ........................................................... 70 
12.3. Nội dung luyện tập ................................................................................. 70 
Bài 13 .................................................................................................................. 71 
CỔNG SONG SONG .......................................................................................... 71 
13.1. Cơ bản về cổng song song .................................................................. 71 
13.2. Kiến trúc phần cứng .............................................................................. 72 
13.3. Các thanh ghi ......................................................................................... 75 
13.4. Ghép nối qua cổng song song ............................................................... 77 
Bài 14 .................................................................................................................. 80 
THỰC HÀNH LẬP TRÌNH ................................................................................... 80 
MÔ PHỎNG CHUYỂN ĐỘNG QUAY ................................................................. 80 
14.1. Mục tiêu ................................................................................................. 80 
14.2. Các kiến thức lý thuyết liên quan ........................................................... 81 
14.3. Nội dung luyện tập ................................................................................. 81 
Bài 15 .................................................................................................................. 82 
LẬP TRÌNH CỔNG SONG SONG ...................................................................... 82 
15.1. Cơ bản về lập trình cổng song song .................................................... 82 
15.2. Lập trình cổng song song trong một số ngôn ngữ ................................. 82 
15.3. Lập trình cổng song song trong C# ........................................................ 82 
Bài 16 .................................................................................................................. 84 
THẢO LUẬN GHÉP NỐI THIẾT BỊ ..................................................................... 84 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
4 
QUA CỔNG SONG SONG ................................................................................. 84 
16.1. Mục tiêu ................................................................................................. 84 
16.2. Tổ chức .................................................................................................. 84 
Bài 17 .................................................................................................................. 84 
THỰC HÀNH LẬP TRÌNH CỔNG SONG SONG ................................................ 84 
17.1. Mục tiêu ................................................................................................. 84 
17.2. Các kiến thức lý thuyết liên quan ........................................................... 84 
17.3. Nội dung luyện tập ................................................................................. 85 
Bài 18 .................................................................................................................. 85 
CỔNG NỐI TIẾP ................................................................................................. 85 
18.1. Giới thiệu chung về cổng nối tiếp .......................................................... 85 
18.2. Kiến trúc phần cứng RS232 ................................................................... 86 
18.3. Giao thức truyền thông RS232 .............................................................. 90 
18.4. Một số chuẩn giao tiếp nối tiếp khác ...................................................... 91 
18.4.1. RS422 ............................................................................................. 91 
18.4.2. Chuẩn RS423A ............................................................................... 91 
18.4.3. Chuẩn RS485 .................................................................................. 91 
Bài 19 .................................................................................................................. 92 
LẬP TRÌNH CỔNG NỐI TIẾP ............................................................................. 92 
19.1. Cơ bản về lập trình cổng nối tiếp ......................................................... 92 
19.2. Cổng COM ảo ........................................................................................ 92 
19.3. Lập trình cổng COM trong một số ngôn ngữ ......................................... 92 
19.4. Lập trình cổng COM trong C# ................................................................ 92 
Bài 20 .................................................................................................................. 93 
THỰC HÀNH CƠ BẢN LẬP TRÌNH TRUYỀN THÔNG QUA CỔNG NỐI TIẾP . 93 
20.1. Mục tiêu ................................................................................................. 93 
20.2. Các kiến thức lý thuyết liên quan ........................................................... 93 
20.3. Nội dung luyện tập ................................................................................. 93 
Bài 21 .................................................................................................................. 93 
THẢO LUẬN GHÉP NỐI THIẾT BỊ QUA CỔNG NỐI TIẾP ................................ 93 
21.1. Mục tiêu ................................................................................................. 93 
21.2. Tổ chức .................................................................................................. 93 
Bài 22 .................................................................................................................. 94 
THỰC HÀNH LẬP TRÌNH TRUYỀN THÔNG GIỮA HAI THIẾT BỊ QUA CỔNG 
NỐI TIẾP ............................................................................................................ 94 
22.1. Mục tiêu ................................................................................................. 94 
22.2. Các kiến thức lý thuyết liên quan ........................................................... 94 
22.3. Nội dung luyện tập ................................................................................. 94 
Bài 23 .................................................................................................................. 94 
MỘT SỐ GIAO DIỆN GHÉP NỐI KHÁC ............................................................. 94 
23.1. Ghép nối qua cổng USB ........................................................................ 94 
23.1.1. Tổng quan ....................................................................................... 94 
23.1.2. Kiến trúc .......................................................................................... 95 
23.1.3. Đặc tính điện ................................................................................... 98 
23.1.4. Truyền dữ liệu nối tiếp qua cổng USB ............................................. 98 
23.1.5. Lập trình điều khiển ......................................................................... 99 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
5 
23.2. Các khe cắm mở rộng ........................................................................... 99 
23.2.1. Bus mở rộng.................................................................................... 99 
23.2.2. Ghép nối qua khe cắm mở rộng ...................................................... 99 
23.3. Một số giao diện khác ............................................................................ 99 
Bài 24 ................................................................................................................ 100 
THỰC HÀNH LẬP TRÌNH ................................................................................. 100 
ĐIỀU KHIỂN THIẾT BỊ QUA CỔNG NỐI TIẾP ................................................. 100 
24.1. Mục tiêu ............................................................................................... 100 
24.2. Các kiến thức lý thuyết liên quan ......................................................... 100 
24.3. Nội dung luyện tập ............................................................................... 100 
Bài 25 ................................................................................................................ 100 
THỰC HÀNH LẬP TRÌNH ỨNG DỤNG TỔNG HỢP ....................................... 100 
25.1. Mục tiêu ............................................................................................... 100 
25.2. Các kiến thức lý thuyết liên quan ......................................................... 101 
25.3. Nội dung luyện tập ............................................................................... 101 
TÀI LIỆU THAM KHẢO ..................................................................................... 102 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
6 
ĐỀ CƯƠNG BÀI GIẢNG HỌC PHẦN 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
Bài 1 
TỔNG QUAN VỀ LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
1.1. Lập trình điều khiển thiết bị từ máy 
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. Giới thiệu các giao diện truyền thông trên máy tính 
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ị. 
- 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. 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
7 
- 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. Các ngôn ngữ lập trình 
Tùy môi trường làm việc, phần cứng hệ thống sử dụng, người phát triển hệ 
thống có thể lựa chọn các ngôn ngữ lập trình khác nhau. 
Có nhiều ngôn ngữ lập trình cho phép thiết kế giao diện, truy cập các cổng 
để tạo ra chương trình điều khiển hệ thống. 
Trên hệ điều hành MS-DOS: các ngôn ngữ lập trình như C/C++, Pascal, 
Assembly,... điều có khả năng tạo ra chương chương trình điều khiển theo các 
yêu cầu nhất định. Việc truy cập trực tiếp các cổng, thiết bị phần cứng trong hệ 
điều hành DOS là khá đơn giản. Trong Pascal, ta có thể gửi dữ liệu ra cổng P 
nào đó bởi lệnh Port[p]:=; hay trong Assembly là các lệnh IN, OUT 
để đọc hay ghi các cổng. 
Trên hệ điều hành Windows: phổ biến các ngôn ngữ lập trình trực quan, dể 
dùng như Visual Basic 6.0 (VB6), Visual C, bộ công cụ lập trình trên DotNet 
như C#, VB.Net,... Các ngôn ngữ này có những thế mạnh riêng, tùy yêu cầu và 
môi trường làm việc mà lựa chọn cho phù hợp. 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
8 
1.4. Lập trình điều khiển trong Windows Form 
1.4.1. Thiết kế giao diện 
Giao diện người sử dụng là một trong số các thành phần quan trọng nhất 
của một ứng dụng. Đối với người sử dụng, giao diện chính là ứng dụng; họ 
không cần chú ý đến thành phần mã thực thi bên dưới. Ứng dụng của chúng ta 
có thể phổ biến được hay không phụ thuộc nhiều vào giao diện. 
Thông qua giao diện, người dùng điều khiển hoạt động của chương trình. 
Giao diện tốt sẽ giúp người dùng vận hành hệ thống dễ dàng, tốn ít thời gian, 
giảm các nhầm lẫn trong quá trình điều khiển đồng thời có thể tạo cảm giác 
thoại mái trong khi làm việc. 
Cần có khảo sát cẩn thận, nghiên cứu và ứng dụng các nguyên tắc trong 
thiết kế giao diện. Việc thiết kế giao diện phải đặc biệt chú ý đến tính chất 
công việc, lĩnh vực hoạt động của phần mềm, đối tượng người sử dụng. 
Với phần mềm điều khiển thiết bị, ngoài các nguyên tắc cơ bản đối với việc 
thiết kế giao diện phần mềm nói chung, người phát triển hệ thống cần chú ý tới 
tính chất điều khiển thiết bị ghép nối với máy tính. Giao diện thiết kế sao cho 
có sự thống nhất với giao diện điều khiển vốn có trên thiết bị cần điều khiển. 
Như vậy sẽ sẽ tạo sự thuận tiện, tận dụng được kiến thức kỹ năng vận hạnh hệ 
thống có sẵn của người dùng. Thông qua giao diện người dùng không chỉ ra 
các lệnh điều khiển mà còn có thể quan sát được sự biến đổi của hệ thống được 
điều khiển. Do vậy, giao diện cần có phần thể hiện trạng thái hoạt động của 
thiết bị được điều khiển. 
Từ các yêu cầu riêng biệt của hệ thống điều khiển, giao diện cần có khả 
năng mô phỏng các loại chuyển động, tạo ra được các công cụ điều khiển như 
nút bấm, núm xoay, công tắc,... sao cho tương thích với bàn điều khiển của 
thiết bị (nếu có). 
Vấn đề còn lại là điều khiển thiết bị hoạt động thông qua ghép nối với máy 
tính. Để điều khiển, cần thiết phải làm chủ được cổng truyền thông trên máy 
tính được ghép nối thiết bị. Đồng thời phải hiểu rõ và sử dụng được giao thức 
của thiết bị vào điều khiển, tạo dữ liệu gửi đi, phân tích thông tin nhận được từ 
thiết bị và thể hiện những thông tin cần thiết trên giao diện của phần mềm điều 
khiển. 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
9 
1.4.2. Sử dụng các điều khiển 
Các điều khiển có sẵn trên các ngôn ngữ lập trình về cơ bản đáp ứng được 
các yêu cầu điều khiển hoạt động của máy tính. Tuy nhiên với nhiệm vụ điều 
khiển một thiết bị phần cứng bên ngoài, các điều khiển này có thể chưa đáp 
ứng đủ yêu cầu của phần mềm điều khiển. 
Ngoài việc tận dụng các điều khiển có sẵn trong môi trường phát triển phần 
mềm của ngôn ngữ lựa chọn, người phát triển hệ thống điều khiển cần bổ sung 
thêm các điều khiển thích hợp cho phần mềm như các nút gạt, xoay, công tắc,... 
trên cơ sở mô phỏng và tạo các điều khiển riêng. Các điều khiển được mô 
phỏng về hình ảnh, cách thức hoạt động giống với thực tế trên thiết bị sẽ giúp 
quá trình học sử dụng, vận hành được thuận tiện, giảm các sai nhầm. 
1.4.3. Sử dụng các thư viện 
Trong quá trình phát triển phần mềm điều khiển, nhiều thao tác can thiệp 
sâu đến hệ điều hành có thể không thực hiện được trong môi trường phát triển 
phần mềm ứng dụng thông thường. Đôi khi vì lý do thời gian, chi phí mà người 
phát triển hệ thống sử dụng các thư viện có sẵn vào hệ thống của mình. 
Tùy ngôn ngữ, công cụ lập trình lựa chọn mà cách khai báo và sử dụng các 
thư viện này có sự khác biệt nhất định. Ví dụ trong VB6, người lập trình có thể 
khai báo các hàm API được cung cấp trong các file thư viện DLL bởi lệnh 
Declare, trong C# là import,... 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
10 
Bài 2 
NGÔN NGỮ LẬP TRÌNH C# 
Ngôn ngữ C# khá đơn giản, dễ học, dễ dùng, chỉ khoảng 80 từ khóa và hơn 
mười mấy kiểu dữ liệu được xây dựng sẵn. Tuy nhiên, ngôn ngữ C# có ý nghĩa 
cao khi nó thực thi những khái niệm lập trình hiện đại. C# bao gồm tất cả 
những hỗ trợ cho cấu trúc, thành phần component, lập trình hướng đối tượng. 
Những tính chất đó hiện diện trong một ngôn ngữ lập trình hiện đại và được 
phát triển bởi Microsoft, là phần khởi đầu cho kế hoạch .NET của họ. Tên của 
ngôn ngữ bao gồm ký tự thăng theo Microsoft nhưng theo ECMA là C#, chỉ 
bao gồm dấu số thường. Microsoft phát triển C# dựa trên C++ và Java. C# 
được miêu tả là ngôn ngữ có được sự cân bằng giữa C++, Visual Basic, 
Delphi và Java. 
C# theo một hướng nào đó là ngôn ngữ lập trình phản ánh trực tiếp nhất đến 
.NET Framework mà tất cả các chương trình .NET chạy, và nó phụ thuộc mạnh 
mẽ vào Framework này. Các loại dữ liệu cơ sở là những đối tượng, hay được 
gọi là garbage-collected, và nhiều kiểu trừu tượng khác chẳng hạn như class, 
delegate, interface, exception, v.v, phản ánh rõ ràng những đặc trưng của .NET 
runtime. 
So sánh với C và C++, ngôn ngữ này bị giới hạn và được nâng cao ở một 
vài đặc điểm nào đó, nhưng không bao gồm các giới hạn sau đây: 
Các con trỏ chỉ có thể được sử dụng trong chế độ không an toàn. Hầu hết 
các đối tượng được tham chiếu an toàn, và các phép tính đều được kiểm tra 
tràn bộ đệm. Các con trỏ chỉ được sử dụng để gọi các loại kiểu giá trị; còn 
những đối tượng thuộc bộ thu rác (garbage-collector) thì chỉ được gọi bằng 
cách tham chiếu. 
+ Các đối tượng không thể được giải phóng tường minh. 
+ Chỉ có đơn kế thừa, nhưng có thể cài đặt nhiều interface trừu tượng 
(abstract interfaces). Chức năng này làm đơn giản hóa sự thực thi của thời gian 
thực thi. 
+ C# thì an-toàn-kiểu (typesafe) hơn C++. 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
11 
+ Cú pháp khai báo mảng khác nhau("int[] a = new int[5]" thay vì "int 
a[5]"). 
+ Kiểu thứ tự được thay thế bằng tên miền không gian (namespace). 
+ C# không có tiêu bản. 
+ Có thêm Properties, các phương pháp có thể gọi các Properties để truy 
cập dữ liệu. 
+ Có reflection. 
2.1. Cấu trúc chương trình 
Cấu trúc một chương trình C# đơn giản có ít nhất là một lớp. Mỗi lớp được 
bắt đầu bằng từ khoá class kế đó là tên lớp( tên lớp do chúng ta đặt và phải 
tuân thủ theo nguyên tắc đặt tên, bên trong một lớp ta có thể khai báo các 
biến(thành phần dữ liệu) và các hàm(phương thức)). Trong số các hàm bên 
trong lớp có một hàm tên là Main, hàm này có đặc điểm khi một chương trình 
C# được gọi ra thực hiện thì máy sẽ tiến hành thực hiện từ câu lệnh đầu tiên 
của hàm Main và khi màn Main kết thúc thì chương trình C# cũng kết thúc. 
Điều đó chứng tỏ hàm Main là hàm chính của chương trình C#. Một chương 
trình C# muốn thực hiện được thì phải có một hàm Main và chỉ có duy nhất 
một hàm Main trong toàn bộ hệ thống chương trình và hàm này sẽ gọi các hàm 
khác ra để thực hiện yêu cầu bài toán. Hàm Main được khai báo như sau: 
Dạng 1: (Không có tham số) 
static void Main( ) 
 { 
 // Các câu lệnh 
 } 
Dạng 2: (Có tham số) 
static void Main(string[] tên_biến) 
 { 
 // Các câu lệnh 
 } 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
12 
-Chú ý: Nếu trong một chương trình C# mà không có hàm Main đặt trong 
một lớp nào đó thì chương trình C# này không thể thực hiện được. 
Ví dụ: 
Để bắt đầu cho việc tìm hiểu ngôn ngữ C# và tạo tiền đề cho các chương 
sau, chương đầu tiên trình bày một chương trình C# đơn giản nhất. 
Ví dụ : Chương trình C# đầu tiên. 
class ChaoMung 
{ 
static void Main( ) 
{ 
// Xuat ra man hinh 
System.Console.WriteLine(“Hello World”); 
} 
} 
----------------------------------------------------------------------------- 
Kết quả: 
Hello World 
----------------------------------------------------------------------------- 
Sau khi viết xong chúng ta lưu dưới dạng tập tin có phần mở rộng *.cs 
(C sharp). Sau đó biên dịch và chạy chương trình. Kết quả là một chuỗi 
“Hello World” sẽ xuất hiện trong màn hình Console. 
2.2. Kiểu dữ liệu 
C# là ngôn ngữ lập trình mạnh về kiểu dữ liệu, một ngôn ngữ mạnh về kiểu 
dữ liệu là phải khai báo kiểu của mỗi đối tượng khi tạo (kiểu số nguyên, số 
thực, kiểu chuỗi, kiểu điều khiển...) và trình biên dịch sẽ giúp cho người lập 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
13 
trình không bị lỗi khi chỉ cho phép một loại kiểu dữ liệu có thể được gán cho 
các kiểu dữ liệu khác. Kiểu dữ liệu của một đối tượng là một tín hiệu để trình 
biên dịch nhận biết kích thước của một đối tượng (kiểu int có kích thước là 4 
byte) và khả năng của nó (như một đối tượng button có thể vẽ, phản ứng khi 
nhấn,...). 
Tương tự như C++ hay Java, C# chia thành hai tập hợp kiểu dữ liệu chính: 
Kiểu xây dựng sẵn (built-in) mà ngôn ngữ cung cấp cho người lập trình và kiểu 
được người dùng định nghĩa (user-defined) do người lập trình tạo ra. 
C# phân tập hợp kiểu dữ liệu này thành hai loại: Kiểu dữ liệu giá trị (value) 
và kiểu dữ liệu tham chiếu (reference). Việc phân chi này do sự khác nhau khi 
lưu kiểu dữ liệu giá trị và kiểu dữ liệu tham chiếu trong bộ nhớ. Đối với một 
kiểu dữ liệu giá trị thì sẽ được lưu giữ kích thước thật trong bộ nhớ đã cấp phát 
là stack. Trong khi đó thì địa chỉ của kiểu dữ liệu tham chiếu thì được lưu trong 
stack nhưng đối tượng thật sự thì lưu trong bộ nhớ heap. 
Nếu chúng ta có một đối tượng có kích thước rất lớn thì việc lưu giữ chúng 
trên bộ nhớ heap rất có ích, trong chương 4 sẽ trình bày những lợi ích và bất lợi 
khi làm việc với kiểu dữ liệu tham chiếu, còn trong chương này chỉ tập trung 
kiểu dữ kiểu cơ bản hay kiểu xây dựng sẵn. 
Ghi chú: Tất cả các kiểu dữ liệu xây dựng sẵn là kiểu dữ liệu giá trị ngoại 
trừ các đối tượng và chuỗi. Và tất cả các kiểu do người dùng định nghĩa ngoại 
trừ kiểu cấu trúc đều là kiểu dữ liệu tham chiếu 
Ngoài ra C# cũng hỗ trợ một kiểu con trỏ C++, nhưng hiếm khi được sử 
dụng, và chỉ khi nào làm việc với những đoạn mã lệnh không được quản lý 
(unmanaged code). Mã lệnh không được quản lý là các lệnh được viết bên 
ngoài nền .MS.NET, như là các đối tượng COM. 
Kiểu dữ liệu xây dựng sẵn: Ngôn ngữ C# đưa ra các kiểu dữ liệu xây dựng 
sẵn rất hữu dụng, phù hợp với một ngôn ngữ lập trình hiện đại, mỗi kiểu dữ 
liệu được ánh xạ đến một kiểu dữ liệu được hỗ trợ bởi hệ thống xác nhận ngôn 
ngữ chung (Common Language Specification: CLS) trong MS.NET. Việc ánh 
xạ các kiểu dữ liệu nguyên thuỷ của C# đến các kiểu dữ liệu của .NET sẽ đảm 
bảo các đối tượng được tạo ra trong C# có thể được sử dụng đồng thời với các 
đối tượng được tạo bởi bất cứ ngôn ngữ khác được biên dịch bởi .NET, như 
VB.NET. Mỗi kiểu dữ liệu có một sự xác nhận và kích thước không thay đổi, 
không giống như 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
14 
C++, int trong C# luôn có kích thước là 4 byte bởi vì nó được ánh xạ từ 
kiểu Int32 trong .NET. 
Sau đây chúng ta đi tìm hiểu chi tiết một sô kiểu dữ liệu dựng sẵn có trong 
C#: 
2.2.1. Kiểu nguyên 
 Dùng để lưu trữ các giá trị nguyên trong giới hạn cho phép tuỳ thuộc 
vào từng kiểu dữ liệu nguyên cụ thể. Trong ngôn ngữ C# có một số kiểu dữ 
liệu nguyên sau: 
Kiểu C# 
Số 
byte 
Kiểu .NET Mô tả 
byte 1 Byte Số nguyên dương không dấu từ 0-255 
char 2 Char Ký tự Unicode 
sbyte 1 Sbyte Số nguyên có dấu ( từ -128 đến 127) 
short 2 Int16 Số nguyên có dấu giá trị từ -32768 đến 
32767 
ushort 2 Uint16 Số nguyên không dấu 0 – 65.535 
int 4 Int32 Số nguyên có dấu –2.147.483.647 và 
2.147.483.647 
uint 4 Uint32 Số nguyên không dấu 0 – 4.294.967.295 
long 8 Int64 Kiểu số nguyên có dấu có giá trị trong 
khoảng : -9.223.370.036.854.775.808 đến 
9.223.372.036.854.775.807 
ulong 8 Uint64 Số nguyên không dấu từ 0 đến 
18,446,744,073,709,551,615 
Thông thường để chọn một kiểu dữ liệu nguyên để sử dụng như short, int 
hay long thường dựa vào độ lớn của giá trị muốn sử dụng. Ví dụ, một biến 
ushort có thể lưu giữ giá trị từ 0 đến 65.535, trong khi biến ulong có thể lưu 
giữ giá trị từ 0 đến 18,446,744,073,709,551,615, do đó tùy vào miền giá trị của 
phạm vi sử dụng biến mà chọn các kiểu dữ liệu thích hợp nhất. Kiểu dữ liệu int 
thường được sử dụng nhiều nhất trong lập trình vì với kích thước 4 byte của nó 
cũng đủ để lưu các giá trị nguyên cần thiết. 
Kiểu số nguyên có dấu thường được lựa chọn sử dụng nhiều nhất trong kiểu 
số trừ khi có lý do chính đáng để sử dụng kiểu dữ liệu không dấu. 
Cách tốt nhất khi sử dụng biến không dấu là giá trị của biến luôn luôn 
dương, biến này thường thể hiện một thuộc tính nào đó có miền giá trị dương. 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
15 
Ví dụ khi cần khai báo một biến lưu giữ tuổi của một người thì ta dùng kiểu 
byte (số nguyên từ 0-255) vì tuổi của người không thể nào âm được. 
2.2.2. Kiểu thực 
Dùng để lưu trữ các giá trị thực trong giới hạn cho phép tuỳ thuộc vào từng 
kiểu dữ liệu thực cụ thể. Trong ngôn ngữ C# có một số kiểu dữ liệu thực sau: 
Kiểu C# 
Số 
byte 
Kiểu .NET Mô tả 
float 4 Single Kiểu dấu chấm động, giá trị xấp xỉ từ 3,4E-
38 đến 3,4E+38, với 7 chữ số có nghĩa. 
double 8 Double Kiểu dấu chấm động có độ chính xác gấp 
đôi, giá trị xấp xỉ từ 1,7E-308 đến 
1,7E+308, 
với 15,16 chữ số có nghĩa 
decimal 8 Decimal Có độ chính xác đến 28 con số và giá trị 
thập phân, được dùng trong tính toán tài 
chính, kiểu này đòi hỏi phải có hậu tố “m” 
hay “M” theo sau giá trị. 
Kiểu float, double, và decimal đưa ra nhiều mức độ khác nhau về kích 
thước cũng như độ chính xác.Với thao tác trên các phân số nhỏ thì kiểu float là 
thích hợp nhất. Tuy nhiên lưu ý rằng trình biên dịch luôn luôn hiểu bất cứ một 
số thực nào cũng là một số kiểu double trừ khi chúng ta khai báo rõ ràng. Để 
gán một số kiểu float thì số phải có ký tự f theo sau. 
float soFloat = 24f; 
2.2.3. Kiểu ký tự 
Kiểu ký tự được thể hiện bằng kiểu char, biểu diễn cho các ký tự mã 
Unicode gồm các chữ cái, chữ số và các ký tự đặc biệt. Kiểu char có 
65536(216) ký tự trong tập mã Unicode 16 bit. Mã của 128 ký tụ đầu của tập 
Unicode hoàn toàn trùng với mã của 128 ký tự trong tập mã ASCII 7-bit và mã 
của 256 ký tự ban đầu hoàn toàn tương ứng với 256 ký tự của tập mã ISO 
Latin-1 8-bit. 
Một hằng ký tự được bao trong dấu nháy đơn. 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
16 
char k=’c’; 
Kiểu C# Số byte Kiểu .NET Mô tả 
char 2 Char Ký tự Unicode 
2.2.4. Kiểu logic 
Dùng để biểu diễn các giá trị logic và chỉ chứa một trong hai giá trị true và 
false 
Kiểu C# Số byte Kiểu .NET Mô tả 
bool 1 Boolean Giá trị logic true/ false 
2.2.5. Kiểu xâu ký tự 
 Kiểu dữ liệu xâu ký tự (chuỗi) khá thân thiện với người lập trình 
trong bất cứ ngôn ngữ lập trình nào, kiểu dữ liệu chuỗi lưu giữ một dãy các ký 
tự. Để khai báo một chuỗi chúng ta sử dụng từ khoá string tương tự như cách 
tạo một thể hiện của bất cứ đối tượng nào: 
string tenchuoi; 
Một hằng chuỗi được tạo bằng cách đặt các chuỗi trong dấu nháy đôi: 
“Xin chao” 
Đây là cách chung để khởi tạo một chuỗi ký tự với giá trị hằng: 
string chuoi = “Xin chao”; 
2.3. Biến, hằng và cách khai báo 
2.3.1. Biến 
Biến là yếu tố cơ bản của bất kỳ ngôn ngữ máy tính nào. Biến là vùng trống 
trong bộ nhớ máy tính dành cho một kiểu dữ liệu nào đó và có đặt tên. Các biến 
trong bộ nhớ ở các thời điểm khác nhau có thể cất giữ các giá trị khác nhau. Trước 
khi sử dụng một biến nào đó phải khai báo nó. Chính quy khai báo: 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
17 
• Kiểu 1: Khai báo biến không có giá trị khởi đầu 
 Kiểu_dữ_liệu Tên_biến ; 
 Có thể khai báo nhiều biến cùng kiểu trên cùng một dòng, các tên biến 
được phân cách nhau bằng dấu phẩy 
Ví dụ 1: 
 int a,b; /*biến có kiểu nguyên*/ 
 float f; /*biến thực*/ 
 char ch; /*biến ký tự*/ 
• Kiểu 2: Khai báo biến có giá trị khởi đầu 
 Kiểu_dữ_liệu Tên_biến=giá trị ; 
Ví dụ 2: 
 int a =5; 
 float b=6; 
 char ch=’A’; hoặc char ch=’\u0041’ 
• Chú ý: Trong C# trước khi sử dụng một biến thì biến đó phải được khởi gán 
một giá trị cụ thể, nếu không chương trình dịch sẽ báo lỗi 
Ví dụ 3: 
using System; 
class VD_Khoi_gan_bien 
{ 
 static void Main() 
 { 
 int a, b=1; 
 float t; 
 t = a + b; 
 a = 2; 
 Console.WriteLine("Tong {0}+{1}={2}", a, b,t); 
 } 
} 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
18 
--------------------------------------------------------------------------------------------- 
 Kết quả 
Chương trình trên sẽ bị báo lỗi vì biến a chưa được khởi tạo giá trị trước 
khi sử dụng 
Để chương trình trên có thể chạy được ta sửa lại như sau: 
--------------------------------------------------------------------------------------------- 
using System; 
class VD 
{ 
 static void Main() 
 { 
 int a=2, b=1; 
 float t; 
 t = a + b; 
 Console.WriteLine("Tong {0}+{1}={2}", a, b,t); 
 } 
} 
2.3.2. Hằng 
Hằng cũng là một biến nhưng giá trị của hằng không thay đổi. Tuy nhiên 
khi làm việc với một giá trị được định nghĩa là không thay đổi, ta phải đảm bảo giá 
trị của nó không được thay đổi trong suốt chương trình nên khi đó sử dụng biến sẽ 
không thích hợp. Ví dụ, khi lập một chương trình thí nghiệm hóa học liên quan 
đến nhiệt độ sôi, hay nhiệt độ đông của nước, chương trình cần khai báo hai biến 
là DoSoi và DoDong, nhưng không cho phép giá trị của hai biến này bị thay đổi 
hay bị gán. Để ngăn ngừa việc gán giá trị khác, ta phải sử dụng biến kiểu hằng. 
a) Hằng số nguyên 
- Hệ thập phân bình thường 
 VD: 545 
- Hệ cơ số 16 (Hecxa) 
 Bắt đầu bằng 0x, 0X 
 Ví dụ: 0xAB = 171 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
19 
b) Hằng số thực 
Được viết theo hai cách sau: 
 - Dạng thập phân gồm: Phần nguyên, dấu chấm thập phân, phần thập phân 
Ví dụ: 34.2 -344.122 
 - Dạng khoa học(dạng mũ) gồm: Phần định trị và phần mũ. Phần định trị là 
số nguyên hay số thực dạng thập phân, phần mũ bắt đầu bằng E hoặc e theo sau là 
dấu + hoặc – rồi đến số nguyên. 
 Ví dụ: 12.54E-1 = 12.54/10^1 = 1.254 
 12.54E+1 = 12.54*10^1 = 125.4 
c) Hằng ký tự 
 Là một ký hiệu trong bảng mã Unicode được đặt trong hai dấu nháy đơn. 
Giá trị của hằng kí tự chính là mã Unicode của kí hiệu 
 Ví dụ: Hằng ‘A’ có giá trị là 65 
 Chú ý: Hằng ký tự biểu thị mã của ký tự đó trong bảng mã Unicode. Do vậy 
một hằng ký tự cũng có thể tham gia vào các phép toán. 
 Ví dụ: 
 (char) ((int)'A'+ 10) 
 Hằng ký tự còn có thể được viết theo cách: ‘\uc1c2c3c4’ trong đó c1c2c3c4 
là một số hệ 16 mà giá trị của nó chính là mã Unicode của ký tự cần biểu diễn. 
 Ví dụ: ‘A’ hay ‘\u0041’ 
Ký tự ‘A’ có giá trị 65 trong bảng Unicode, đổi giá trị 65 hệ thập phân sang 
hệ thập lục phân ta được giá trị là 41. 
 Một số ký tự đặc biệt: 
Viết Diễn giải 
\’ Dấu nháy đơn 
\” Dấu nháy kép 
\\ Dấu gạch chéo ngược 
\n Xuống dòng mới 
\0 Ký tự Null 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
20 
\t Nhảy cách ngang, ký tự tab 
\b Xoá trái 
\r Về đầu dòng 
\f Sang trang 
d) Hằng xâu ký tự 
 Là một dãy các ký tự đặt trong hay dấu nháy kép “.” 
g) Khai báo hằng 
const kieu_du_kieu ten_hang = gia_tri_hang; 
Một hằng phải được khởi tạo khi khai báo, và chỉ khởi tạo duy nhất một lần 
trong suốt chương trình và không được thay đổi. 
Ví dụ: const int DOSOI = 100; 
Trong khai báo trên, 100 là một hằng số và DOSOI là tên hằng có kiểu nguyên. Ví 
dụ: minh họa việc sử dụng những biểu tượng hằng. 
class HangSo 
{ 
static void Main() 
 { 
const int DOSOI = 100; // Độ C 
const int DODONG = 0; // Độ C 
System.Console.WriteLine( “Do dong cua nuoc {0}”, DODONG ); 
System.Console.WriteLine( “Do soi cua nuoc {0}”, DOSOI ); 
} 
} 
----------------------------------------------------------------------------- 
 Kết quả: 
Do dong cua nuoc 0 
Do soi cua nuoc 100 
----------------------------------------------------------------------------- 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
21 
2.4. Các phép toán 
2.4.1. Phép toán số học 
Phép toán Ý nghĩa Ví dụ 
- Đổi dấu một số thực hoặc nguyên -10, - 
+ Phép cộng 2 số thực hoặc nguyên 1+2, a = 1+2 
- Phép trừ 2-3, a = 2-3 
* Phép nhân a = 2*3 
/ Phép chia a = 2/3 
% Phép lấy phần dư 
a = 6 % 2 (a = 0) 
3.5 % 2.5 = 1 
3 % 2.5 =0.5 
* Chú ý: 
- Nếu phép chia hai toán hạng đều nguyên thì phép chia cho kết quả là 
phần nguyên của thương hai toán hạng đó, ví dụ: 5/2=2 
 - Nếu một trong hai toán hạng là kiểu thực thì lúc này kết quả của 
phép chia cho ta giá trị đúng, ví dụ 5/2.0=2.5 
- Nếu phép chia hai toán hạng đều nguyên với số chia bằng 0 thì phép 
chia sinh lỗi, ví dụ 5/0 sẽ phát sinh lỗi 
- Nếu một trong hai toán hạng là kiểu thực với số chia bằng 0 thì kết 
quả phép chia là infinity(dương vô cùng) hoặc –infinity(âm vô cùng), ví dụ 
5.0/0 = infinity 
 - Phép toán % trả về phần dư của phép chia 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
22 
2.4.2. Phép toán quan hệ 
Những toán tử quan hệ được dùng để so sánh giữa hai giá trị, và sau 
đó trả về kết quả là một giá trị logic kiểu bool (true hay false). Ví dụ toán tử 
so sánh lớn hơn (>) trả về giá trị là true nếu giá trị bên trái của toán tử lớn 
hơn giá trị bên phải của toán tử. Do vậy 5 > 2 trả về một giá trị là true, trong 
khi 2 > 5 trả về giá trị false. 
Các toán tử quan hệ trong ngôn ngữ C# được trình bày ở bảng bên dưới. 
Phép toán ý nghĩa Ví dụ Kết quả 
> So sánh lớn hơn 1>2 false 
>= So sánh lớn hơn hoặc bằng 2>=2 true 
< So sánh nhỏ hơn 3<3 false 
<= So sánh nhỏ hơn hoặc bằng 4<2 false 
== So sánh bằng nhau 4==5 false 
!= So sánh không bằng nhau 2!=7 true 
2.4.3. Phép toán logic 
Phép toán 
logic 
ý nghĩa Ví dụ Kết quả 
! Phép phủ định một ngôi (not) !(3>1) false 
&& 
Liên kết hai biểu thức logic 
Phép và (and). Giá trị bằng 1 
khi cả 2 toán hạng có giá trị 1 
(2>1)&&(5=2) false 
|| 
Liên kết hai biểu thức logic. 
Phép hoặc (or). Giá trị biểu 
thức bằng 1 khi một trong hai 
toán hạng bằng 1 
(4>3)||(1>8) true 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
23 
Bảng giá trị của các phép toán logic 
X Y X && Y X || Y ! X 
true true true true false 
true false false true false 
false true false true true 
false false false false true 
2.4.4. Phép toán tăng giảm 
Trong ngôn ngữ lập trình C# đưa ra hai phép toán một ngôi để tăng và 
giảm các biến kiểu (nguyên và thực). Toán tử tăng ++ sẽ thêm 1 vào toán 
hạng của nó, toán tử giảm – sẽ trừ đi 1. 
Dấu phép toán ++ và -- có thể đứng trước hoặc đứng sau toán hạng. 
Như vậy ta có thể viết: ++n, n++, --n, n-- 
Sự khác nhau của ++n và n++ ở chỗ: Trong phép toán n++ thì n tăng 
sau khi giá trị của nó được sử dụng, còn trong ++n thì giá trị của n tăng 
trước khi giá trị của nó được sử dụng. Tương tự đối với --n và n-- 
 Ví dụ: giả sử trước mỗi phép tính int i=3, j=15; 
Phép toán Tương đương Kết quả 
i=++j; j=j+1; i=j; i = ? 
j = ? 
i=j++; i=j; j=j+1; i = ? 
j = ? 
j++; j=j+1; i = ? 
j = ? 
++j; j=j+1; i = ? 
j = ? 
j = ++i + 5; i=i+1; j=i+5; i = ? 
j = ? 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
24 
j = i++ +5; j=i+5; i=i+1; i = ? 
j = ? 
2.4.5. Thứ tự ưu tiên các phép toán 
Trình biên dịch phải xác định thứ tự thực hiện các toán tử trong 
trường hợp một biểu thức có nhiều phép toán, giả sử, có biểu thức sau: 
var1 = 5+7*3; 
Biểu thức trên có ba phép toán để thực hiện bao gồm (=, +,*). Ta thử xét các 
phép toán theo thứ tự từ trái sang phải, đầu tiên là gán giá trị 5 cho biến 
var1, sau đó cộng 7 vào 5 là 12 cuối cùng là nhân với 3, kết quả trả về là 36, 
điều này thật sự có vấn đề, không đúng với mục đích yêu cầu của chúng ta. 
Do vậy việc xây dựng một trình tự xử lý các toán tử là hết sức cần thiết. 
Các luật về độ ưu tiên xử lý sẽ bảo trình biên dịch biết được toán tử 
nào được thực hiện trước trong biểu thức.Tương tự như trong phép toán đại 
số thì phép nhân có độ ưu tiên thực hiện trước phép toán cộng, do vậy 5+7*3 
cho kết quả là 26 đúng hơn kết quả 36. Và cả hai phép toán cộng và phép 
toán nhân điều có độ ưu tiên cao hơn phép gán. Như vậy trình biên dịch sẽ 
thực hiện các phép toán rồi sau đó thực hiện phép gán ở bước cuối cùng. Kết 
quả đúng của câu lệnh trên là biến var1 sẽ nhận giá trị là 26. 
Trong ngôn ngữ C#, dấu ngoặc được sử dụng để thay đổi thứ tự xử lý, 
điều này cũng giống trong tính toán đại số. Khi đó muốn kết quả 36 cho biến 
var1 có thể viết: 
var1 = (5+7) * 3; 
Biểu thức trong ngoặc sẽ được xử lý trước và sau khi có kết quả là 12 thì 
phép nhân được thực hiện. 
Bảng sau liệt kê thứ tự độ ưu tiên các phép toán trong C#. 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
25 
Các phép toán được liệt kê cùng loại sẽ có thứ tự theo mục thứ thự của 
bảng: thứ tự trái tức là độ ưu tiên của các phép toán từ bên trái sang, thứ tự 
phải thì các phép toán có độ ưu tiên từ bên phải qua trái. Các toán tử khác 
loại thì có độ ưu tiên từ trên xuống dưới, do vậy các toán tử loại cơ bản sẽ có 
độ ưu tiên cao nhất và phép toán gán sẽ có độ ưu tiên thấp nhất trong các 
toán tử. 
2.5. Biểu thức 
2.5.1. Biểu thức số học 
Biểu thức số học đó là sự kết hợp giữa các toán hạng với các toán tử số 
học và cho ta kết quả là một số(số thực hoặc số nguyên) 
Ví dụ: (3+5)*6/4-2.4 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
26 
2.5.2. Biểu thức logic 
Biểu thức logic đó là sự kết hợp giữa các toán hạng với các toán tử(toán 
tử số học, toán tử quan hệ, toán tử logic) v à kết quả cho ta là một giá trị 
logic. Biểu thức logic được dùng làm điều kiện trong các cấu trúc điều 
khiển(if, while,....) và một số trường hợp khác. 
Ví dụ: (1>=2)&&(5==4) 
2.5.3. Biểu thức điều kiện 
 Hầu hết các toán tử đòi hỏi có một toán hạng như toán tử (++, --) hay 
hai toán hạng như (+,-,*,/,...). Tuy nhiên, C# còn cung cấp thêm một toán tử 
có ba toán hạng (?:). Toán tử này có cú pháp sử dụng như sau: 
 ? : 
Toán tử này sẽ xác định giá trị của một biểu thức điều kiện, và biểu thức 
điều kiện này phải trả về một giá trị kiểu bool. Khi điều kiện đúng thì <biểu 
thức thứ 1> sẽ được thực hiện, còn ngược lại điều kiện sai thì <biểu thức thứ 
2> sẽ được thực hiện. Có thể diễn giải theo ngôn ngữ tự nhiên thì toán tử này 
có ý nghĩa : “Nếu điều kiện đúng thì làm công việc thứ nhất, còn ngược lại 
điều kiện sai thì làm công việc thứ hai”. Cách sử dụng toán tử ba ngôi này 
được 
minh họa trong ví dụ sau. 
----------------------------------------------------------------------------- 
using System; 
class Tester 
{ 
public static void Main() 
{ 
 int a,b,c; 
 a= 10; 
 b = 20; 
 c = a > b ? a : b; 
 Console.WriteLine(“Gia tri thu nhat {0}, gia tri thu hai {1}, gia 
tri lon nhat {2}”, a, b, c); 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
27 
} 
} 
----------------------------------------------------------------------------- 
 Kết quả: 
 Gia tri thu nhat 10, gia tri thu hai 20, gia tri lon nhat 20 
----------------------------------------------------------------------------- 
Trong ví dụ minh họa trên toán tử ba ngôi được sử dụng để kiểm tra 
xem giá trị của a có lớn hơn giá trị của b, nếu đúng thì trả về giá trị của a, 
nếu sai thì trả về giá trị b, sau đó gán giá trị cho c. 
2.5.4. Biểu thức gán 
 Trong C# dùng dấu “=” làm dấu phép gán. Biểu thức gán có thể được 
thể hiện dưới các dạng như sau: 
 Biến = Biểu_thức 
 Biến op = Biểu_thức 
 Cá ch viết dưới tương đương Biến = (biến) op (Biểu_thức) trong đó 
op là một toán tử nào đó. Giá trị của Biểu_thức sẽ được gán cho biến sau câu 
lệnh này 
 Ví dụ: x + = y tương đương với x = x+y 
 Nếu ta thêm dấu ; vào sau biểu thức gán sẽ thu được một câu lệnh gán 
 Biểu thức gán có thể được sử dụng trong các phép toán và các câu 
lệnh như các biểu thức thông thường. Chẳng hạn khi viết: a=b=5; thì điều đó 
có nghĩa rằng gán giá trị của biểu thức b=5 cho biến a. Kết quả là b=5 và 
a=5. Tương tự sau câu lệnh: x = (a=5) * (b=10); sẽ gán 5 cho a, 10 cho b và 
sau đó gán tiếp 50 cho x 
2.5.5. Biểu thức ép kiểu 
 Những đối tượng của một kiểu dữ liệu này có thể được chuyển sang 
những đối tượng của một kiểu dữ liệu khác thông qua cơ chế chuyển đổi 
tường minh hay ngầm định. Chuyển đổi nhầm định được thực hiện một cách 
tự động, trình biên dịch sẽ thực hiện công việc này. Còn chuyển đổi tường 
minh diễn ra khi chúng ta gán ép một giá trị cho kiểu dữ liệu khác. 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
28 
Việc chuyển đổi giá trị ngầm định được thực hiện một cách tự động 
và đảm bảo là không mất thông tin và tuân theo chính quy sau: 
Ví dụ: Chúng ta có thể gán một biến kiểu char cho một biến kiểu int, 
trình biên dịch sẽ chuyển đổi kiểu một cách ngầm định từ kiểu char sang 
kiểu int. 
char x = ‘A’; 
int y = x; // chuyển đổi ngầm định (y sẽ có giá trị 65) 
Tuy nhiên, nếu chúng ta thực hiện chuyển đổi ngược lại thì trình biên dịch sẽ 
báo lỗi. Trình biên dịch sẽ không thực hiện việc chuyển đổi ngầm định từ số 
kiểu int sang kiểu char. 
int y =65; 
char x = y// Trình biên dịch không chuyển đổi ngầm định 
Khi biên dịch trình biên dịch trả về thông báo lỗi: 
----------------------------------------------------------------------------- 
 Kết quả: 
Error 1 Cannot implicitly convert type 'long' to 'int'. An explicit 
conversion exists (are you missing a cast?) 
----------------------------------------------------------------------------- 
Để không bị lỗi chúng ta phải dùng lệnh gán tường minh, đoạn mã trên được 
viết lại 
int y =65; 
char x = (char)y ; // Ép kiểu tường minh, trình biên dịch không báo lỗi 
Trong một biểu thức mà có nhiều kiểu dữ liệu khác nhau, trước khi 
tính toán máy sẽ chuyển từ kiểu thấp hơn lên kiểu cao hơn theo sơ đồ như ở 
trên. 
Ví dụ: 
 short x=1,y; 
byte short 
char 
int long float double 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
29 
 y=4-x; /*Khi biên dịch sẽ bị lỗi, vì 4-x sẽ cho kiểu int và không 
thể gán cho biến kiểu short*/ 
Nếu ta viết 
 y=(short)(4-y);/* Khi biên dịch sẽ không bị lỗi, vì 4-x cho ta 
kiểu int và sau đó được chuyển thành kiểu short*/ 
Biểu thức ép kiểu tường minh là: 
+ (kiểu dữ liệu)Biểu thức 
+ sử dụng lớp Convert thi hành các phương thức chuyển đổi 
kiểu tương ứng. 
 short x=1, y; 
 y = (short )(4 - x); 
 y = Convert.ToInt16(4 - x); // kiểu short chính là int16. 
* Chú ý: Khi ép kiểu thì bản thân biểu thức không bị thay đối kiểu mà chỉ 
có giá trị của biểu thức ép kiểu mới thay đổi. 
2.6. Cấu trúc rẽ nhánh 
2.6.1. Cấu trúc rẽ nhánh if 
 a/ Cấu trúc rẽ nhánh if dạng khuyết 
• Cú pháp câu lệnh 
 if (btđk) 
 công_việc; 
  Trong đó: 
 * if là từ khoá 
* btđk là một biểu thức cho giá trị logic 
* Công_việc có thể là một lệnh đơn, một khối lệnh hay một 
cấu trúc điều khiển nào đó 
 Ví dụ: 
if ( a>0) 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
30 
 Console.Write(a + “La so duong“) ; 
• Sơ đồ cú pháp 
• Nguyên tắc hoạt động: Đầu tiên máy tính toán giá trị của btđk. Nếu btđk có 
giá trị True thì máy tiến hành thực hiện Công_việc sau đó tiến hành thực hiện 
các câu lệnh tiếp theo sau câu lệnh if. Nếu btđk có giá trị là False thì máy bỏ 
qua việc thực hiện Công_việc trong câu lệnh if mà tiến hành thực hiện ngay 
các câu lệnh sau câu lệnh if. 
b/ Cấu trúc rẽ nhánh dạng đầy đủ 
• Cú pháp câu lệnh 
 if (btđk) 
 công_việc1; 
 else 
 công_việc2; 
Trong đó: 
 * if, else là từ khoá 
* btđk là một biểu thức cho giá trị logic 
btđk 
True 
Công việc 
False 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
31 
* Công_việc1,Công_việc2 có thể là một lệnh đơn, một cấu 
trúc điều khiển nào đó hay một khối lệnh 
Ví dụ: 
if ( a>0) 
 Console.Write(a + “La so duong“) ; 
else 
 Console.Write(a + “La so khong duong“) ; 
• Sơ đồ thực hiện 
• Nguyên tắc hoạt động: Đầu tiên máy tính toán giá trị của btđk. Nếu btđk có 
giá trị True thì máy tiến hành thực hiện Công_việc1 sau đó tiến hành thực hiện 
các câu lệnh tiếp theo sau câu lệnh if. Nếu btđk có giá trị là False thì máy tiến 
hành thực hiện công_việc2 sau đó tiến hành thực hiện các câu lệnh tiếp theo 
sau câu lệnh if. 
Ví dụ1: Lập chương trình giải phương trình bậc nhất dạng ax+b=0 
btđk 
True 
Công việc 1; 
False 
Công việc 2; 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
32 
using System; 
using hue = System.Console; // Gan ten tu dat cho mot lop 
 class Program 
 { 
 static void Main(string[] args) 
 { 
 Double a, b, x; 
 hue.Write("Nhap vao gia tri a"); 
 a = double.Parse(hue.ReadLine()); 
 hue.Write("Nhap vao gia tri a"); 
 b = double.Parse(hue.ReadLine()); 
 if (a == 0) 
 { 
 if (b == 0) 
 { 
 hue.WriteLine("Phuong trinh co vo so nghiem"); 
 } 
 else 
 { 
 hue.WriteLine("Phuong trinh vo nghiem"); 
 } 
 } 
 else 
 { 
 x = -b / a; 
 hue.WriteLine("Phuong trinh co mot nghiem x=" + x); 
 } 
 hue.ReadLine(); 
 } 
 } 
Ví dụ 2: Lập chương trình giải phương trình bậc hai ax2+bx+c=0 
using System; 
class PTB2 
{ 
 static void Main() 
 { 
 float a, b, c, delta; 
 Console.WriteLine("Ban hay nhap vao ba so"); 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
33 
 Console.Write("a="); a = float.Parse(Console.ReadLine()); 
 Console.Write("b="); b = float.Parse(Console.ReadLine()); 
 Console.Write("c="); c = float.Parse(Console.ReadLine()); 
 if (a == 0) 
 { 
 Console.Write("Day la phuong trinh bac nhat Ax+C=0\n"); 
 if (b != 0) 
 Console.WriteLine("Phuong trinh co nghien duy nhat x={0}", -b / c); 
 else 
 if (c == 0) 
 Console.WriteLine("Phuong trinh vo so nghiem"); 
 else 
 Console.WriteLine("phuong trinh vo nghiem"); 
 } 
 else 
 { 
 Console.WriteLine("Day la phuong trinh bac hai Ax^2+Bx+C=0"); 
 delta = b * b - 4 * a * c; 
 if (delta < 0) 
 Console.Write(" Phuong trinh vo nghiem trong truong so thuc"); 
 if (delta == 0) 
 Console.Write("Phuong trinh co nghiem kep x1=x2={0,8:N2", -b / (2 * 
a)); 
 if (delta > 0) 
 { 
 Console.WriteLine("Phuong trinh co hai nghiem phan biet:"); 
 Console.WriteLine("x1={0,8:N2}\nx2={1,8:N2}", (-b - 
Math.Sqrt(delta)) / (2 * a), (-b + Math.Sqrt(delta)) / (2 * a)); 
 } 
 } 
 Console.ReadKey(); 
 } 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
34 
} 
2.6.2. Cấu trúc rẽ nhánh switch 
* Cú pháp câu lệnh 
 switch ( bieu_thuc) 
 { case e1:Khối_lệnh_1;[break;] 
 case e2: Khối_lệnh_2;[break;] 
 ....................... 
 case en: Khối_lệnh_n;[break;] 
 [default: Khối_lệnh_n+1; break;] 
 } 
Trong đó: + switch, case, default là các từ khoá 
 + bieu_thuc: là một biểu thức cho giá trị nguyên hoặc là xâu 
 + ei:là giá trị nguyên mà biểu thức có thể nhận được. 
 + Những phần đặt trong hai dấu [ và ] có thể có hoặc không 
* Sự hoạt động của cấu trúc điều khiển switch phụ thuộc vào giá trị của 
bieu_thuc 
 Khi giá trị này bằng ei máy sẽ nhảy tới khối lệnh có nhãn case ei và thực 
hiện Khối_lệnh_i. Nếu Khối_lệnh_i là rỗng thì ta có thể đặt break sau Khối_lệnh_i 
hoặc không, với trường hợp không có break thì máy sẽ tiến hành nhảy xuống thực 
hiện Khối_lệnh_(i+1). Nếu Khối_lệnh_i khác rỗng(tức là có công việc phải thực 
hiện) thì sau Khối_lệnh_i ta phải đặt câu lệnh break. Khi máy gặp câu lệnh break 
thì máy sẽ thoát khỏi cấu trúc switch và thực hiện các câu lệnh tiếp theo sau cấu 
trúc lệnh này. 
 Khi giá trị của bieu_thuc khác tất cả các giá trị ei thì cách làm việc của máy 
lại phụ thuộc vào sự có mặt hay không có mặt của default. Khi có default máy 
nhảy tới câu lệnh có nhãn default. Khi không có default máy tiến hành thực hiện 
các câu lệnh sau cấu trúc này. 
Ví dụ 1: Viết chương trình nhập vào một số từ 1 đến 7 in ra thứ tương ứng. 
using System; 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
35 
namespace ThuMay 
{ 
 class Program 
 { 
 static void Main(string[] args) 
 { 
 Console.WriteLine("Nhap vao thu la con so:"); 
 int t = int.Parse(Console.ReadLine()); 
 switch (t) 
 { 
 case 1: 
 Console.WriteLine("Chu Nhat"); 
 case 2: 
 Console.WriteLine("Thu hai"); 
 break; 
 case 3: 
 Console.WriteLine("Thu ba"); 
 break; 
 case 4: 
 Console.WriteLine("Thu tu"); 
 break; 
 case 5: 
 Console.WriteLine("Thu nam"); 
 break; 
 case 6: 
 Console.WriteLine("Thu sau"); 
 break; 
 case 7: 
 Console.WriteLine("Thu bay"); 
 break; 
 default : 
 Console.WriteLine("Thu khong hop le"); 
 } 
 Console.ReadKey(); 
 } 
 } 
} 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
36 
Ví dụ 2: Nhập vào một tháng của một năm bất kỳ sau đó cho biết tháng đó có bao 
nhiêu ngày: 
using System; 
class Songay 
{ 
 static void Main() 
 { 
 int month, year,sumday; 
 Console.Write("Nhap thang="); month = int.Parse(Console.ReadLine()); 
 Console.Write("Nhap year="); year = int.Parse(Console.ReadLine()); 
 switch (month) 
 { 
 case 1: 
 case 3: 
 case 5: 
 case 7: 
 case 8: 
 case 10: 
 case 12: sumday=31;break; 
 case 4: 
 case 6: 
 case 9: 
 case 11: sumday = 30; break; 
 case 2: if (year % 400==0 || (year % 4 == 0 && year % 100 != 0)) 
 sumday = 29; 
 else 
 sumday = 28; 
 break; 
 default: sumday = 0; break; 
 } 
 if (sumday > 0) 
 Console.Write("So ngay cua {0}/{1} la {2} ngay", month, year, sumday); 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
37 
 Console.ReadKey(); 
 } 
} 
2.7. Cấu trúc lặp while, do .. while 
2.7.1. Cấu trúc lặp While 
• Cú pháp câu lệnh 
 while(btđk) Công_việc; 
 Trong đó: 
 * while là từ khoá 
* btđk là một biểu thức cho giá trị logic 
* Công_việc có thể là một lệnh đơn, một cấu trúc điều 
khiển nào đó hay một khối lệnh. 
* Sơ đồ cú pháp 
• Sự hoạt động: Câu lệnh while được tiến hành lần lượt được tiến hành 
theo các bước sau: 
Bước 1: Tiến hành tính toán giá trị của btđk. 
Bước 2: Nếu biểu thức điều kiện có giá trị là False máy sẽ thoát khỏi 
chu trình và tiến hành thực hiện các câu lệnh sau câu lệnh while. Nếu biểu 
thức điều kiện có giá trị là True máy sẽ tiến hành thực hiện Công_việc và 
quay về bước 1. 
btđk 
True 
Công việc 
False 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
38 
Ví dụ 1: Nhập vào hai số nguyên bất kỳ và cho biết ước số chung lớn nhất 
của hai số nguyên đó. 
using System; 
class VD 
{ 
 static void Main() 
 { 
 int a, b; 
 Console.Write("Nhap a="); a = int.Parse(Console.ReadLine()); 
 Console.Write("Nhap b="); b = int.Parse(Console.ReadLine()); 
 a=Math.Abs(a);b=Math.Abs(b); 
 while (a != b) 
 { 
 if (a > b) a -= b; 
 if (b > a) b -= a; 
 } 
 Console.Write("Uscln la:{0}", a);// hoac Console.Write("Uscln la:{0}", 
b); 
 Console.ReadKey(); 
 } 
} 
2.7.2. Cấu trúc lặp do...while 
* Cú pháp câu lệnh 
 do 
{ 
 Công việc cần thực hiện; 
}while(btđk); 
Trong đó: 
 - while ,do là từ khoá 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
39 
- btđk là một biểu thức cho giá trị logic 
• Sơ đồ cú pháp 
• Sự hoạt động: Câu lệnh do...while được tiến hành lần lượt theo các bước 
sau: 
Bước 1: Thực hiện Công_việc 
Bước 2: Sau khi thực hiện xong Công_việc máy tiến hành tính toán 
giá trị của btđk. 
 + Nếu btđk có giá trị True máy sẽ trở lại bước 1 để tiếp tục thực 
hiện vòng lặp mới của chu trình. 
+ Nếu btđk có giá trị bằng False máy sẽ ra khỏi chu trình và 
chuyển tới câu lệnh đứng sau cấu trúc do...while. 
• Ví dụ áp dụng 
 Ví dụ 1: Bài toán gửi tiền tiết kiệm, giả sử ta có số tiền là a gửi vào ngân 
hàng. Hỏi sau bao nhiêu tháng ta thu được số tiền là b(b>a) biết rằng lãi xuất 
hàng tháng là 5% 
using System; 
class VD1 
{ 
 static void Main() 
 { 
 double a, b; 
 int t=0; 
 do 
 { 
btđk 
Tru
e 
Công việc; 
False 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
40 
 Console.Write("Nhap so tien ban co:"); 
 a = double.Parse(Console.ReadLine()); 
 if (a < 0) 
 Console.Write("Ban nhap sai, hay nhap la"); 
 } while (a < 0); 
 do 
 { 
 Console.Write("Nhap so tien ban du dinh muon co:"); 
 b = double.Parse(Console.ReadLine()); 
 if (b < a) 
 Console.Write("Ban nhap sai, hay nhap lai"); 
 } while (b < a); 
 // Di tim thoi gian can thiet 
 do 
 { 
 a = a + a * 0.05; 
 t = t + 1; 
 } while (a < b); 
 Console.Write("Ban phai mat {0} nam {1} thang", t / 12, t % 12); 
 Console.ReadKey(); 
 } 
} 
Ví dụ 2: Nhập vào một số nguyên dương sau đó phân tích số nguyên đó ra 
thừa số nguyên tố 
using System; 
class VD2 
{ 
 static void Main() 
 { 
 int n, i; 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
41 
 i = 2;// la so nguyen to dau tien 
 Console.Write("Nhap n="); n = int.Parse(Console.ReadLine()); 
 Console.Write("n="); 
 do 
 { 
 while (n % i == 0) 
 { 
 Console.Write("{0}*", i); 
 n = n / i; 
 } 
 if (i == 2) i = 3; else i = i + 2; 
 } while (n != 1); 
 Console.Write("\b "); 
 Console.ReadKey(); 
 } 
} 
2.8. Cấu trúc lặp for và một số lệnh điều khiển khác 
2.8.1. Cấu trúc lặp for 
• Cú pháp câu lệnh 
 for (bt1;btđk;bt2) 
 Công_việc; 
Trong đó: 
 * for là từ khoá 
* bt1,bt2 là các biểu gán, btđk là một biểu thức cho giá trị 
logic 
* Công_việc có thể là một lệnh đơn , một cấu trúc điều 
khiển nào đó hay một khối lệnh 
• Sơ đồ cú pháp 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
42 
• Sự hoạt động của câu lệnh for được tiến hành theo các bước sau: 
 Bước 1: Xác định giá trị của bt1 
 Bước 2: Xác định giá trị của btđk 
 Bước 3: Tuỳ thuộc vào tính đúng, sai của biểu thúc btđk máy sẽ 
tiến hành lựa chọn một trong hai nhánh sau: 
 Nếu btđk có giá trị False, máy sẽ ra khỏi vòng lặp for và chuyển 
tới câu lệnh sau cấu trúc for 
 Nếu btđk có giá trị True, máy sẽ tiến hành thực hiện các câu 
lệnh trong thân for . Khi thực hiện xong Công_việc hay gặp câu lệnh 
continue trong thân for máy sẽ chuyển sang buớc 4(khởi đầu lại). 
 Bước 4: Tính bt2 sau đó quay lại bước 2 để bắt đầu lại vòng lặp 
mới của chu trình. 
Chú ý: 
 +) Các bt1,bt2,btđk có thể vắng mặt nhưng phải để lại dấu chấm 
phẩy. 
 +) Nếu btđk vắng mặt thì máy coi luôn đúng. Khi đó muốn thoát khỏi 
vòng lặp thì phải dùng câu lệnh return, break hay goto. 
 +) Các bt1,bt2 có thể gồm nhiều biểu thức cách nhau bởi dấu phẩy 
btđk 
True 
bt2 
False 
Công_việc; 
bt1 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
43 
 +) Thông thường bt1 dùng để khởi gán giá trị cho các biến trong vòng 
lặp, bt2 dùng để thay đổi giá trị của các biến điều khiển trong vòng lặp sao 
cho lúc đầu btđk cho giá trị True nhưng sau một số hữu hạn bước thực hiện 
thì btđk cho giá trị False. 
 Ví dụ 1: Nhập vào một số nguyên dương n sau đó tính n! 
using System; 
class VD6 
{ 
 static void Main() 
 { 
 int n, i,s; 
 Console.Write("Nhap vao so nguyen n="); 
 n = int.Parse(Console.ReadLine()); 
 for (s = 1, i = 1; i <= n;++i) 
 s = s * i; 
 Console.Write("{0}!={1}", n, s); 
 Console.ReadKey(); 
 } 
} 
Ví dụ 2: Tính S=Sin(Sin(......Sin(x))...) 
using System; 
class VD6 
{ 
 static void Main() 
 { 
 double x, s; 
 int i, n; 
 Console.Write("Nhap vao so nguyen n="); 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
44 
 n = int.Parse(Console.ReadLine()); 
 Console.Write("Nhap x theo don vi do="); 
 x = double.Parse(Console.ReadLine()); 
 x = Math.PI * x / 180; 
 for (s=x,i=n; i>=1;--i) 
 s = Math.Sin(s); 
 Console.Write("S={0:N3}",s); 
 Console.ReadKey(); 
 } 
} 
Ví dụ 3: Lập chương trình tìm số có ba chữ số sao cho số đó bằng tổng lập 
phương các chữ số của nó 
using System; 
class VD8 
{ 
 static void Main() 
 { 
 int n, a, b, c; 
 Console.WriteLine("Cac so thoa man yeu cau bai toan la:"); 
 for (a = 1; a <= 9; ++a) 
 for (b = 0; b <= 9; ++b) 
 for (c = 0; c <= 9; ++c) 
 if (a * 100 + b * 10 + c == a * a * a + b * b * b + c * c * c) 
 Console.Write("{0}\t", a * 100 + b * 10 + c); 
 Console.ReadKey(); 
 } 
} 
Ví dụ 4: Lập chương trình nhập vào một số nguyên dương n sau đó tính n!! . 
n!! được tính như sau: nếu n là số chẵn thì n!!=2.4.6.N, nếu n là số lẻ thì 
n!!=1.3.5.7n. 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
45 
using Viet = System.Console; 
namespace GiaThuaKep 
{ 
 class Program 
 { 
 static void Main(string[] args) 
 { 
 Viet.WriteLine("Nhap vao so can tinh n!!"); 
 int n = int.Parse(Viet.ReadLine()); 
 long gt=1; 
 if (n % 2 == 0) 
 { 
 for(int i=2; i<=n;i+=2) 
 { 
 gt=gt*i; 
 } 
 } 
 else 
 { 
 for (int i = 1; i <= n; i+=2) 
 { 
 gt = gt * i; 
 } 
 } 
 Viet.WriteLine("{0}!!={1}", n, gt); 
 Viet.ReadLine(); 
 } 
 } 
} 
Ví dụ 5: Lập chương trình giải bài toán trăm trâu, trăm cỏ: Trâu đứng ăn 
năm trâu nằm ăn ba lụ khụ trâu già ba con một bó. 
using Viet = System.Console; 
namespace Trau_Co 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
46 
{ 
 class Program 
 { 
 static void Main() 
 { 
 int td,tn,tg; 
 // td co kha nang nhan cac gia tri tu 1->100%5(20) 
 // tn co kha nang nhan cac gia tri tu 1 ->100%3 (33) 
 // Thu lan luot cac gia tri co kha nang nhan duoc cua trau dung 
 int phuong_an = 0; 
 for (td = 1; td <= 20; td++) 
 { 
 // Voi moi gia tri trau dung thu cac gia tri nhan duoc trau nam 
 for (tn = 1; tn <= 33; tn++) 
 { 
 // trau nam = 100-td-tn. 
 tg = 100 - td - tn; 
 // neu thoa man bieu thuc thi day la mot phuong an 
 // Tại sao lại là 3.0 mà không phải là 3? 
 if ((td * 5 + tn * 3 + tg / 3.0) == 100) 
 { 
 ++phuong_an; 
 Viet.WriteLine("Phuong an thu " + phuong_an ); 
 Viet.WriteLine("trau dung = " + td); 
 Viet.WriteLine("trau nam = " + tn); 
 Viet.WriteLine("trau gia = " + tg); 
 Viet.WriteLine("-------------------------------------------"); 
 } 
 } 
 } 
 Viet.ReadKey (); 
 } } 
} 
2.8.1. Cấu trúc lặp foreach 
• Cú pháp câu lệnh 
 foreach (kdl bien in taphop) 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
47 
 Công_việc; 
Trong đó: 
 * foreach, in: là từ khoá 
* bien: có kiểu được xác định qua kdl 
* taphop: là một tập hợp, mảng 
* Công_việc có thể là một lệnh đơn , một cấu trúc điều 
khiển nào đó hay một khối lệnh 
• Hoạt động 
 Biến lần lượt nhận giá trị (tương ứng với từng phần tử của tập 
hợp), với mỗi trường hợp sẽ thực hiện câu lệnh một lần. Như vậy số lần lặp 
là số lượng phần tử của tập hợp. 
2.8.1. Các lệnh điều khiển khác 
• Lệnh break 
Kết thúc một trường hợp trong câu lệnh switch, kết thúc sớm vòng lặp 
• Lệnh continue 
Bỏ qua các lệnh còn lại trong vòng lặp (sau lệnh này) để thực hiện tiếp 
lần lặp sau. 
Bài 3 
SỬ DỤNG FORM VÀ CÁC ĐIỀU KHIỂN CƠ BẢN 
3.1. Form 
3.1.1. Chức năng 
Form (hay còn gọi điều khiển Form) dùng để chứa các điều khiển khác 
(Buttons, Label) 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
48 
3.1.2. Một số thuộc tính thường dùng 
Tên Ỹ nghĩa 
Name Tên của Form. Trong một Project tên của các Form 
phải khác nhau. 
AcceptButton Giá trị mà thuộc tính này nhận là tên của một 
Button trên Form (Nếu Form có chứa button). Khi 
đó nếu bạn nhấn phím Enter thì sự kiện Click của 
Button mà bạn chọn được thực thi mà không cần 
nhấn chuột vào Button đó. 
Autosize Nhận một trong hai giá trị True hay False 
- True: Không cho phép thay đổi kích thước Form 
mà che đi các điều khiển khác chứa trên Form 
- False: Ngược lại 
AutoSizeMode Cho phép thay đổi kích thước của Form hay không? 
(Khi di chuyển chuột vào các mép của Form mà 
hiện nên biểu tượng ↔ là cho phép). Và nhận một 
trong hai giá trị 
- GrowOnly: Cho phép 
- và GrowAndShrink: Không cho phép 
BackColor Chọn màu nền cho Form 
BackGroundImage Chọn ảnh làm nền cho Form 
CancelButton Giá trị mà thuộc tính này nhận là tên của một 
Button trên Form (Nếu Form có chứa button). Khi 
đó nếu bạn nhấn phím ESC thì sự kiện Click của 
Button mà bạn chọn được thực thi mà không cần 
nhấn chuột vào Button đó (tương tự như thuộc tính 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
49 
AcceptButton ). 
ControlBox Nhận một trong hai giá trị True hay False 
- True: Cho phép các các nút: MaximizeBox, 
MinimizeBox, Close trên Titlebar xuất hiện 
- False: Không Cho phép các các nút: 
MaximizeBox, MinimizeBox, Close trên 
Titlebar xuất hiện (Khi đó các thuộc tính 
MaximizeBox, MinimizeBox của Form cũng 
mất đi) 
Font Chọn kiểu Font chữ cho Form (Khi đó tất cả các 
điều khiển được thêm vào Form sẽ có thuộc tính 
Font giống như thuộc tính Font của Form) 
ForeColor Tương tự như thuộc tính Font nhưng áp dụng đối 
với màu chữ 
FormBorderStyle Chọn Style cho Form (Có 7 lựa chọn khác nhau). 
HelpButton Nhận một trong hai giá trị True hay False. 
- True: Cho phép xuất hiện Buton có dấu ? trên 
Titlebar (Với điều kiện: hai thuộc tính 
MaximizeBox, MaximizeBox phải đặt giá trị là 
False) 
- False: Ngược lại 
→ Thuộc tính này sẽ hay đi kèm với điều khiển 
HelpProvider về sau 
Icon Chọn một Icon (có đuôi mở rộng là .ico) trên máy 
tính của bạn thay cho Icon mặc định của Form mà 
VS tạo ra 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
50 
KeyPreview Nhận một trong hai giá trị True hay False 
- True: Cho phép các sự kiện về bàn phím của 
Form (KeyUp, KeyDown, KeyPress của 
Form) có hiệu lực. 
- False: Ngược lại 
MaximizeBox Nhận một trong hai giá trị True hay False 
- True: Cho phép nút MaximizeBox trên Titlebar 
có hiệu lực 
- False: Ngược lại 
MaximizeBox Tương tự như thuộc tính MaximizeBox 
Opacity Độ trong suốt của Form 
ShowIcon Nhận một trong hai giá trị True hay False 
- True: Cho phép xuất hiện Icon của Form 
- False: Không cho phép xuất hiện Icon của Form 
ShowInTaskbar Nhận một trong hai giá trị True hay False 
- True: Cho phép hiện Form dưới khay Taskbar 
- False: Ngược lại 
StartPosition Vị trí hiển thị của Form so với màn hình hệ thống 
hay Form cha (5 lựa chọn khác nhau) 
Text Giá trị Text của Form 
WindowState Trạng thái hiển thị của Form khi chạy (Khi bạn 
nhấn vào nút Run của VS) (Có 3 lựa chọn khác 
nhau: Ẩn dưới khay Taskbar, mở rộng hết màn 
hình). 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
51 
3.1.3. Một số sự kiện thường dùng 
Tên Ỹ nghĩa 
AutoSizeChanged Xảy ra khi thuộc tính Autosize của Form chuyển từ 
True → False hay ngược lại là False → True. 
BackColorChanged Xảy ra khi thuộc tính BackColor của Form thay 
đổi 
Click Xảy ra khi người dùng Click chuột vào vùng làm 
việc thuộc Form 
ControlAdded Xảy ra khi một điều khiển được Add vào Form 
ControlRemoved Xảy ra khi một điều khiển bị xóa khỏi Form 
CursorChanged Xảy ra khi thuộc tính Cursor của Form thay đổi 
DoubleClick Xảy ra khi người dùng DoubleClick vào vùng làm 
việc của Form 
FontChanged Xảy ra khi thuộc tính Font của Form có sự thay đổi 
ForeColorChanged Xảy ra khi thuộc tính ForeColor của Form có sự 
thay đổi 
FormClosed Xảy ra khi Form đã đóng (Nhấn vào nút X màu đỏ 
trên Titlebar) 
FormClosing Xảy ra khi Form đang đóng (2 sự kiện 
FormClosed và FormClosing thường dùng trong 
lập trình CSDL: khi xảy ra sự kiện này thì đóng kết 
nối CSDL) 
KeyDown Xảy ra khi người dùng nhấn một phím hay một tố 
hợp phím (tùy thuộc vào xử lý của chúng ta) 
KeyPress Xảy ra khi người dùng nhấn một phím 
KeyUp Xảy ra khi người dùng nhả một phím. 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
52 
MouseClick Xảy ra khi người dùng nhấn chuột (một trong 3 lựa 
chọn: Trái, giữa, phải) 
MouseDoubleClick Xảy ra khi người dùng DoubleClick chuột vào một 
vùng làm việc của Form(một trong 3 lựa chọn: 
Trái, giữa, phải) 
MouseDown Xảy ra khi người dùng nhấn chuột 
MouseHover Xảy ra khi người dùng di chuyển vào các vùng làm 
việc Form 
MouseLeave Xảy ra khi di chuyển chuột ra khỏi vùng làm việc 
của Form 
MouseMove Xảy ra khi di chuyển chuột trên một vùng làm việc 
thuộc Form (nếu Form có chứa một điều khiển nào 
đó, khi di chuyển chuột trên điều khiển này thì 
không xảy ra sự kiện MouseMove của Form). 
MouseUp Xảy ra khi người dùng nhả nhấn chuột (có thể là 
chuột trái, chuột phải, chuột giữa - chuột cuộn) 
Move Xảy ra khi di chuyển Form (có sự thay đổi vị trí 
của Form) 
StyleChanged Xảy ra khi thuộc tính FormBorderStyle của Form 
thay đổi 
TextChanged Xảy ra khi thuộc tính Text của Form thay đổi. 
3.1.4. Ví dụ minh họa 
3.1.4.1. Sự kiện FormClosed 
 //Sự kiện FormClosed - Sự kiện này được gọi khi Form đã đóng 
 private void frmForm_FormClosed(object sender, FormClosedEventArgs e) 
 { 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
53 
 MessageBox.Show("Sự kiện FormClosed được gọi", 
"FormClosed",MessageBoxButtons.OK,MessageBoxIcon.Information); 
 } 
3.1.4.2. Sự kiện FormClosing 
//Sự kiện FormClosing xảy ra khi Form đang đóng 
 private void frmForm_FormClosing(object sender, FormClosingEventArgs e) 
 { 
 if (MessageBox.Show("Bạn có muốn đóng Form lại hay không?", 
"FormClosing", 
 MessageBoxButtons.YesNo, MessageBoxIcon.Information) == 
DialogResult.Yes) 
 e.Cancel = false;// Đóng Form lại 
 else 
 e.Cancel = true;//Không đóng Form nữa 
 } 
3.1.4.3. Sự kiện KeyPress 
//Sự kiện KeyPress 
 private void frmForm_KeyPress(object sender, KeyPressEventArgs e) 
 { 
 //Nếu không chỉ rõ phím nào được nhấn thì khi nhấn bất cứ phím nào sự 
kiện KeyPress của Form đều xảy ra 
 //Chỉ rõ phím nào được nhấn thì phát sinh sự kiện KeyPress làm như sau 
 if (e.KeyChar = 'a') 
 MessageBox.Show("Sự kiện KeyPress xảy ra khi bạn nhấn phím a"); 
 } 
//Sự kiện KeyUp tương tự như sự kiện KeyPress 
//Sự kiện KeyDown xảy ra khi nhấn một phím hay tổ hợp phím 
3.1.4.4. Sự kiện KeyDown 
 private void frmForm_KeyDown(object sender, KeyEventArgs e) 
 { 
 //khi nhấn một phím bất kì trên bàn phím thì sự kiện KeyPress 
được gọi 
 //Đồng thời sự kiện KeyDown cũng được gọi → KeyPress là 
trường hợp riêng của KeyDown 
 //Áp dụng: Nhấn một tổ hợp phím thì sự kiện KeyDown mới được 
gọi 
 //Như Windows Media: Nhấn Ctrl+F để di chuyển bài tiếp theo 
 if (e.KeyCode == Keys.F && e.Modifiers == Keys.Control) 
 MessageBox.Show("Sự kiện KeyDown được gọi khi bạn nhấn 
Ctrl + F"); 
 } 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
54 
3.1.4.5. Sự kiện MouseClick 
//Sự kiện MouseClick 
private void frmForm_MouseClick(object sender, MouseEventArgs e) 
 { 
 //Nếu bạn không muốn biết người dùng nhấn chuột TRÁI hay PHẢI hay 
GIỮA thì khi nhấn bất kì 
 //Chuột nào cũng xảy ra sự kiện MouseClick của Form 
 //Còn nếu bạn muốn bắt được sự kiện người dùng nhấn chuột TRÁI, 
PHẢI, hay GIỮA làm thế này 
 if (e.Button == MouseButtons.Left) 
 MessageBox.Show("Sự kiện MouseClick xảy ra khi bạn Click chuột 
TRÁI"); 
 else if (e.Button==MouseButtons.Middle) 
 MessageBox.Show("Sự kiện MouseClick xảy ra khi bạn Click chuột 
GIỮA"); 
 else if (e.Button==MouseButtons.Right) 
 MessageBox.Show("Sự kiện MouseClick xảy ra khi bạn Click chuột 
PHẢI"); 
 } 
 //Các sự kiện MouseDoubleClick, MouseDown, MouseUp... Xử lý tương 
tự 
3.2. Labels 
3.2.1. Chức năng 
Điều khiển Label sử dụng để hiển thị văn bản. Ứng dụng chủ yếu vào 
các nhãn, lời nhắc, tiêu đề cho các khung nhập liệu. 
3.2.2. Một số thuộc tính thường dùng 
Text: hiển thị nội dung văn bản 
TextAlign: căn lề văn bản 
Font: xác định font chữ hiển thị 
ForeColor: xác định màu chữ hiển thị 
3.3. Button 
3.3.1. Chức năng 
Điều khiển Button cho phép người sử dụng có thể nhập dữ liệu (thể 
hiện lựa chọn, quyết định của mình) bằng cách nhấn chuột lên nút lệnh hoặc 
nhấn bàn phím. 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
55 
3.3.2. Một số thuộc tính, sự kiện thường dùng 
Thuộc tính: 
Text: hiển thị nội dung văn bản trên nút lệnh 
TextAlign: căn lề văn bản 
Font: xác định font chữ hiển thị 
ForeColor: xác định màu chữ hiển thị 
Image: hình ảnh hiển thị trên nút lệnh 
Sự kiện: 
Click: xảy ra khi nút lệnh bị kích hoạt bằng chuột hoặc bàn phím 
Các sự kiện liên quan đến bàn phím (Key...) 
Các sự kiện liên quan đến chuột (Mouse...) 
3.4. Texbox 
3.4.1. Chức năng 
Điều khiển Textbox cho phép bạn nhập và hiển thị dữ liệu. 
3.4.2. Một số thuộc tính thường dùng 
Tên Ý nghĩa 
AcceptsTab Nhận một trong hai giá trị True hay False 
- True: Khi nhấn phím Tab thì con trỏ 
(Focus) chỉ di chuyển bên trong Textbox 
(Với điều kiện thuộc tính 
Multiline=True). 
- False: Khi nhấn Tab thì Focus di chuyển 
qua lại giữa các điều khiển trên Form 
→ Thuộc tính này hay đặt bằng True trong 
các ứng dụng soạn thảo văn bản 
Anchor Vị trí neo đậu của Textbox trên Form 
AutoCompleteCustomSource Ba thuộc tính này ý nghĩa tương tự như của 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
56 
AutoCompleteMode thuộc tính của điều khiển Combobox 
AutoComplete Source 
BackColor Đặt mầu nền cho Textbox 
BorderStyle Chọn kiểu đường viền cho Textbox 
ContextMenuStrip Chọn Menu ngữ cảnh khi nhấn chuột phải 
vào Textbox 
Dock Vị trí bám dính và điền đầy của Textbox với 
Form 
Font Chọn kiểu Font chữ cho Textbox 
HideSelection Nhận một trong hai giá trị True hay False 
- True: Không cho phép các thuộc tính: 
SelectionStartcó hiệu lực. 
- False: Ngược lại 
MaxLenght Số lượng kí tự lớn nhất cho phép nhập vào 
Textbox 
Multiline Nhận một trong hai giá trị True hay False 
- True: Cho phép nhập và hiển thị giá trị 
của Textbox trên nhiều dòng (người dùng 
có thể nhìn thấy toàn bộ giá trị Text của 
nó) 
- False: Cho phép nhập/hiển thị giá trị của 
Textbox trên một dòng 
PasswordChar Hiển thị giá trị của Textbox dưới dạng các kí 
tự mà bạn thay thế (kí tự do người dùng nhập 
vào: *, #...) 
ReadOnly 
ScrollBars Cho phép hiển thị thanh trượt hay không? 
(Với điều kiện thuộc tính Multiline=True 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
57 
mới nhìn thấy thanh cuộn) 
TabIndex 
Visible Cho phép Textbox hiển thị hay không? 
CanUndo Trả lại hai giá trị True/False. 
- True: có thể Undo lại được (như Word) 
- False: Ngược lại 
Các thuộc tính SelectionText o SelectedText 
o SelectionStart 
o SelectionLength 
o . 
Chú ý: Các điều khiển có rất nhiều thuộc tính giống nhau: Anchor, Dock, 
Font, ForeColor, Enabled, Visible, TabIndexVề ý nghĩa các thuộc tính 
này là giống nhau với tất cả các điều khiển 
3.4.3. Một số phương thức thường dùng 
Tên Ý nghĩa 
AppendText Nối một chuỗi (string) vào giá trị Text hiện có 
của Textbox 
Copy 
Xử lý phần nội dung bôi đen (như Word) Cut 
Paste 
Focus Chuyển Focus (con trỏ) vào TextBox 
Clear Xóa toàn bộ Textbox 
Select Lấy ra một chuỗi trong Textbox (xem Code) 
SelectAll Lấy tất cả giá trị của Textbox 
Undo Xử lý Undo như Word 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
58 
3.4.4. Một số sự kiện thường dùng 
Tên Ý nghĩa 
KeyPress Xảy ra khi người dùng nhấn phím trên bàn phím 
(tất nhiên Textbox phải đang Focus – Áp dụng 
sự kiện này để xử lý không cho phép nhập chữ 
vào Textbox) 
MouseClick Xảy ra khi người dùng Click chuột trên điều 
khiển Textbox 
TextChanged Xảy ra khi giá trị Text của Texbox (hay gọi giá 
trị Textbox) thay đổi 
3.4.5. Minh họa 
3.4.5.1.1. Minh họa thuộc tính Text của Textbox 
private void btTextbox_Click(object sender, EventArgs e) 
 { 
 //Trước khi gán thuộc tính text 
 MessageBox.Show("Giá trị textbox trước khi gán: "+ textBox1.Text); 
 //Gán giá trị Text 
 textBox1.Text = "Chào các bạn"; 
 //Sau khi gán 
 MessageBox.Show("Giá trị textbox sau khi gán: " + textBox1.Text); 
 } 
3.4.5.1.2. Minh họa thuộc tính SelectedText 
private void btTextbox_Click(object sender, EventArgs e) 
 { 
 //Thuộc tính SelectedText lấy ra một chuỗi mà bạn bôi đen (Chọn) 
 //Bạn hãy bôi đen một vài từ trong Textbox sau đó Click vào Button 
này sẽ hiển thị 
 //Message thông báo từ bạn chọn 
 string str = textBox1.SelectedText; 
 MessageBox.Show("Từ bạn vừa chọn (bôi đen) là: "+str); 
 } 
3.4.5.1.3. Minh họa thuộc tính SelectionStart và SelectionLength 
 private void btTextbox_Click(object sender, EventArgs e) 
 { 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
59 
 //Thuộc tính này dùng trong tìm kiếm rất nhiều 
 //Thuộc tính SelectionStart: Ví trí bắt đầu Select 
 //Thuộc tính SelectionLength: Chiều dài của vùng lựa chọn 
 //Chú ý: Đặt thuộc tính HideSelection=False 
 //Ví dụ: Tìm kiếm xem giá trị của Textbox có từ nào là chào hay 
không. Nếu có thì nó tự Bôi đen từ đó 
 string str = "chào"; 
 int i; 
 i = textBox1.Text.LastIndexOf(str); 
 if (i >= 0) 
 { 
 textBox1.SelectionStart = i; 
 textBox1.SelectionLength = str.Length; 
 } 
 } 
3.4.5.1.4. Minh họa thuộc tính CanUndo và phương thức Undo 
 private void btTextbox_Click(object sender, EventArgs e) 
 { 
 //Nếu có thể Undo (có nghĩa: Bạn phải gõ văn bản vào Textbox rồi sửa, 
xóa...) 
 //Mới có thể Undo lại được 
 if (textBox1.CanUndo) 
 textBox1.Undo(); 
 } 
3.4.5.1.5. Minh họa phương thức Select 
private void btTextbox_Click(object sender, EventArgs e) 
 { 
 //Cú pháp chung: txtNoiDung.Select(Start, Length); 
 //Mục đích để lấy về một chuỗi từ từ vị trí nào và chiều dài của chuỗi dược 
chọn (tất nhiên: bôi đen vùng này). 
 //-> Phương thức này tương đương với sử dụng 2 thuộc tính SelectionStart 
và SelectionLength 
 //Ví dụ: 
 txtNoiDung.Select(10, 5); 
 // 2 câu lệnh này 
 //textBox1.SelectionStart = 10; 
 //textBox1.SelectionStart = 5; 
 } 
3.4.5.1.6. Minh họa phương thức AppendText 
 private void btTextbox_Click(object sender, EventArgs e) 
 { 
 //Giá trị Textbox trước khi gọi phương thức 
 MessageBox.Show("Trước: "+textBox1.Text); 
 //Gọi phương thức 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
60 
 textBox1.AppendText("Khoa CNTT - UTEHY"); 
 //Giá trị Textbox trước khi gọi phương thức 
 MessageBox.Show("Sau: " + textBox1.Text); 
 } 
3.4.5.1.7. Xử lý chỉ cho phép Textbox nhập số (sự kiện KeyPress của Textbox) – 
Cách 1 
private void txtNoiDung_KeyPress(object sender, KeyPressEventArgs e) 
 { 
 if (e.KeyChar >= '0' && e.KeyChar <= '9') 
 e.Handled = false;//Handled: Được xử lý 
 else 
 e.Handled = true; 
 } 
3.4.5.1.8. Xử lý chỉ cho phép Textbox nhập số (sự kiện KeyPress của Textbox) – 
Cách 2 
private void txtNoiDung_KeyPress(object sender, KeyPressEventArgs e) 
 { 
 if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar)) 
 e.Handled = true; 
 //Char.IsDigit(e.KeyChar) --> 
 //kiểm tra xem phím vừa nhập vào textbox có phải là ký tự số hay không, 
hàm này trả về kiểu bool 
 //Char.IsContro(e.KeyChar) --> 
 //kiểm tra xem phím vừa nhập vào textbox có phải là các ký tự điều khiển 
 //(các phím mũi tên,Delete,Insert,backspace,space bar) hay không, mục 
đích dùng hàm này là để cho phép người dùng xóa số trong trường hợp nhập sai. 
 } 
→ Sử dụng Textbox viết chương trình soạn thảo văn bản đơn giản (tham khảo 
Notepad) 
3.5. ComboBox, ListBox 
3.5.1. Công dụng 
Hiển thị dữ liệu dưới dạng danh sách, cho phép người dùng lựa chọn dữ 
liệu trên danh sách có sẵn hoặc nhập mục/nội dung mong muốn (với combo) 
Hai điều khiển này cơ bản có những đặc điểm ứng dụng và cách sử dụng 
chính như nhau. 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
61 
3.5.2. Một số thuộc tính, sự kiện thông dụng 
Thuộc tính: 
- Items: chứa danh sách các mục chọn 
- SelectedItem: mục được chọn 
- SelectedValue: giá trị được chọn 
Sự kiện: 
- SelectedIndexChange: xảy ra khi số thứ tự mục chọn bị thay đổi (khi có 
mục chọn mới). 
- SelectedValueChange: xảy ra khi giá trị được chọn bị thay đổi (khi có 
mục chọn mới). 
3.6. Checkbox, RadioButton 
3.6.1. Công dụng 
Các điều khiển này cho phép người dùng nhập dữ liệu bằng cách đánh dấu 
chọn hoặc không chọn trên hộp đánh dâu. 
Checkbox: cho phép thiết kế nhiều mục chọn mà ở đó người dùng có thể 
chọn nhiều mục cùng lúc hoặc không chọn mục nào (dạng đa lựa chọn). 
RadioButton: chỉ cho phép người dùng chọn một trong số các mục chọn 
trong cùng một nhóm. 
3.6.2. Một số thuộc tính, sự kiện thông dụng 
Thuộc tính: 
- Checked: thể hiện mục đang được chọn hay không 
- CheckState: thể hiện mục được chọn như thế nào (checkbox) 
- Text: văn bản được hiển thị cạnh nút chọn 
- SelectedValue: giá trị được chọn 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
62 
Bài 4 
THỰC HÀNH SỬ DỤNG CÁC ĐIỀU KHIỂN CƠ BẢN 
4.1. Mục tiêu 
- Nêu đặc các đặc điểm chính của các điều khiển cơ bản và ứng dụng của 
chúng. 
- Sử dụng được các điều khiển cơ bản trong thiết kế giao diện và điều 
khiển. 
4.2. Các kiến thức lý thuyết liên quan 
- Kiến thức sử dụng ngôn ngữ lập trình C# 
- Kiến thức sử dụng bộ công cụ Visual Studio 
4.3. Nội dung luyện tập 
- Tạo bảng led từ hai ảnh led xanh và led đỏ 
- Load tự động số lượng Led 1-10 vào trong ComboBox số lượng Led 
Bài 5 
SỬ DỤNG CÁC ĐIỀU KHIỂN XỬ LÝ HÌNH ẢNH 
VÀ THỜI GIAN 
5.1. PictureBox 
5.1.1. Công dụng 
Hiển thị hình ảnh, cho phép điều chỉnh kích thước, cách thức hình ảnh được 
hiển thị. 
5.1.2. Một số thuộc tính, sự kiện thông dụng 
Thuộc tính: 
- Image: chứa hình ảnh được hiển thị 
- SizeMode: xác định chế độ hiển thị ảnh 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
63 
- BorderStyle: xác định kiểu đường viền 
Sự kiện: 
- Các sự kiện liên quan đến chuột: Mouse... 
- Các sự kiện liên quan đến việc nạp ảnh (load...), vẽ ảnh (paint...) 
5.2. ImageList 
5.2.1. Công dụng 
Dùng để lưu trữ hình ảnh, không trực tiếp hiển thị. 
5.2.2. Một số thuộc tính thông dụng 
- Images: chứa danh sách các hình ảnh 
- ImageSize: xác định kích thước hình ảnh 
5.3. Timer 
5.3.1. Công dụng 
Dùng để điều khiển theo thời gian đặt trước. 
5.3.2. Một số thuộc tính, sự kiện thông dụng 
Thuộc tính: 
- Enable: cho phép hoặc cấm Timer hoạt động 
- Interval: xác định khoảng thời gian chờ lặp lại công việc (xảy ra sự kiện 
tick), đơn vị tính mili giây. 
Sự kiện: 
- Tick: xảy ra sau mỗi Interval mili giây khi Enalbe=true. 
5.4. DateTimePicker 
Sinh viên tự đọc tài liệu. 
5.5. ListView 
Sinh viên tự đọc tài liệu. 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
64 
5.6. TreeView 
Sinh viên tự đọc tài liệu. 
5.7. ProgressBar 
Sinh viên tự đọc tài liệu. 
Bài 6 
THỰC HÀNH SỬ DỤNG CÁC ĐIỀU KHIỂN XỬ LÝ HÌNH 
ẢNH VÀ THỜI GIAN 
6.1. Mục tiêu 
- Nêu đặc các đặc điểm chính của điều khiển xử lý hình ảnh (Picturebox), 
thời giam (timer) và ứng dụng của chúng. 
- Sử dụng được các điều khiển xử lý hình ảnh và thời gian trong thiết kế 
giao diện và điều khiển. 
6.2. Các kiến thức lý thuyết liên quan 
- Kiến thức sử dụng ngôn ngữ lập trình C# 
- Kiến thức sử dụng bộ công cụ Visual Studio 
- Kiến thức sử dụng các điều khiển cơ bản như Textbox, ComboBox, 
ListBox và các điều khiển nâng cao như TreeView, ListView, ImageList 
- Kiến thức sử dụng điều khiển Picture Box, Timer 
6.3. Nội dung luyện tập 
- Thiết kế giao diện theo mẫu. 
- Thiết kế giao diện chương trình theo các bài tập thực hành trong hệ thống 
bài tập thực hành đi kèm 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
65 
Bài 7 
KỸ THUẬT THIẾT KẾ GIAO DIỆN 
7.1. Các nguyên tắc chung trong thiết kế giao diện 
Có nhiều yếu tố để tạo lên một giao diện "tốt". Trong số đó, tính tiện lợi có 
ảnh hưởng, tác động lớn đến người dùng. Để đạt được tính tiện lợi, giao diện 
cần thỏa mãn 4 nguyên tắc: 
* Tính có thể học được 
– các hệ thống tương tác phải dễ học 
* Tính dễ sử dụng 
– Các hệ thống tương tác phải hiệu quả trong việc giúp người sử dụng đạt 
được mục đích 
* Tính linh động 
– Các hệ thống tương tác phải thích ứng được những hoàn cảnh khác nhau 
* Tính cảm xúc 
– Các hệ thống tương tác phải làm cho người dùng cảm thấy thoải mái 
Thảo khảo thêm tài liệu HCI được giới thiệu và cung cấp cùng học phần. 
7.2. Thiết kế giao diện trong C# 
- Cách sắp xếp các điều khiển (bố cục chung của giao diện): phải hài hòa, 
thuận tiện cho thao tác, các điều khiển có thứ tự sử dụng liên tiếp cần phải 
được đặt gần nhau. 
- Kich thước điều khiển: nên theo một nguyên tắc chung, cùng kich thước, 
hay cùng chiều cao, bề rộng (tùy thuộc mỗi điều khiển). Nói chung nên có sự 
thống nhất về kich thước. Mặt khác cũng cần có điểm nhấn (khác biệt về kích 
thước). Các điều khiển thường dùng nên đặt kích thước lớn hơn. Các điều 
khiển có tầm quan trọng, ảnh hưởng lớn đến kết quả công việc (quyết định), 
khó khắc phục thì nên có kích thước nhỏ hơn để hạn chế bấm nhầm. 
- Mầu sắc: lựa chọn hài hòa, phụ hợp với tính chất công việc, đối tượng 
người dùng. Không nên sử dụng quá nhiều màu sắc (khi không thực sự cần 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
66 
thiết). Tùy yêu cầu cần sự hòa trộn hay rõ nét mà lựa chọn gam mầu cho thích 
hợp. 
- Lưu ý về tính năng cửa sổ, các nút điều khiển cho cửa sổ lựa chọn sao cho 
hợp lý, tránh nguy cơ làm thay đổi giao diện, bố cục ngoài ý muốn. 
7.3. Kỹ thuật thiết kế giao diện điều khiển hệ thống 
- Mầu sắc: lựa chọn mầu phù hợp với thiết bị được điều khiển. Nên có gam 
mầu đặc trưng theo mầu của thiết bị. 
- Các công cụ điều khiển: trong chừng mực cho phép nên tạo các điều khiển 
tương tự như các điều khiển có trên thiết bị thật và bố trị tương tự như bảng 
điều khiển trên thiết bị. 
- Thiết kế các mô phỏng để thể hiện các diễn biến hoạt động của thiết bị 
cũng như biểu diễn các thông tin phản hồi từ thiết bị. 
Bài 8 
THẢO LUẬN THIẾT KẾ GIAO DIỆN 
8.1. Mục tiêu 
- Sinh viên nhận thức rõ vai trò của giao diện đối với một phần mềm ứng 
dụng nói chung và phần mềm điều khiển nói riêng. 
- Nêu được các đặc trưng riêng của giao diện phần mềm điều khiển 
- Để xuất thiết kế cho tình huống ví dụ cụ thể 
8.2. Tổ chức 
- Sinh viên được chia thành nhóm nhỏ từ 5 đến 7 sinh viên. 
- Thảo luận theo các chủ đề được giao 
- Các nhóm báo cáo kết quả 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
67 
Bài 9 
TẠO MÔ PHỎNG THIẾT BỊ ĐIỀU KHIỂN VÀ CHUYỂN 
ĐỘNG TỊNH TIẾN 
9.1. Tạo mô phỏng thiết bị điều khiển 
- Mục tiêu của tạo mô phỏng là để thể hiện các diễn biến hoạt động của 
thiết bị cũng như biểu diễn các thông tin phản hồi từ thiết bị. Bên cạnh đó, mô 
phỏng cũng nhằm tạo ra các điều mới có hình thức và hoạt động giống với thiết 
bị điều khiển thực. 
- Các mô phỏng hoạt động thông thường quy về 2 dạng chuyển động là 
chuyển động tịnh tiến, chuyển động quay. Ngoài ra còn có thể biểu diễn ở sự 
biến dạng hình ảnh. 
9.2. Các kỹ thuật tạo mô phỏng chuyển động tịnh tiến 
9.2.1. Kỹ thuật thay đổi toạ độ 
- Đây là kỹ thuật tạo mô phỏng đơn giản, các chuyền động được thể hiện 
bằng sự thay đổi vị trí. 
- Trường hợp này thường dùng hình ảnh có sẵn (sử dụng Picturebox) để thể 
hiện đối tượng và thay đổi tạo độ của đối tượng tương ứng sự chuyển động cần 
mô phỏng (thuộc tính Top, Left của điều khiển). 
9.2.2. Kỹ thuật vẽ lại hình 
- Kỹ thuật tạo mô phỏng này đòi hỏi người lập trình phải xử lý để vẽ hình 
ảnh của đối tượng chuyển động ở các vị trí chuyển động khác nhau. 
- Kỹ thuật này phức tạp về xử lý vẽ nhưng lại có ưu điểm là không tốn 
nhiều bộ nhớ cho việc lưu trữ hình ảnh có sẵn như khi thuật thay đổi tọa độ. 
- Thực hiện: 
 + Vẽ hình ảnh của đối tượng tại vị trí ban đầu, trễ để quan sát 
+ Xóa hình ảnh cũ 
+ Vẽ lại hình ảnh của đổi tượng ở vị trí mới 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
68 
9.3. Các ví dụ về tạo mô phỏng chuyển động tịnh tiến 
Tạo hình ảnh quả bóng chuyển động, chạm thành cửa sổ thì đổi hướng. 
Bài 10 
THỰC HÀNH LẬP TRÌNH MÔ PHỎNG 
THIẾT BỊ ĐIỀU KHIỂN 
10.1. Mục tiêu 
- Trình bày được các yêu cầu đối với thiết kế mô phỏng. 
- Ứng dụng thiết kế mô phỏng vào thiết kế giao diện cho chương trình điều 
khiển thiết bị. 
10.2. Các kiến thức lý thuyết liên quan 
- Kiến thức sử dụng ngôn ngữ lập trình C# 
- Thao tác tạo các điều khiển mô phỏng cho thiết bị. 
- Thao tác xử lý các trạng thái của điều khiển. 
10.3. Nội dung luyện tập 
- Tạo và thiết kế điều khiển được mô phỏng. 
- Thao tác tạo lập trình mô phỏng. 
- Bài tập: theo tài liệu Bài tập thực hành lập trình điều khiển thiết bị. 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
69 
Bài 11 
TẠO MÔ PHỎNG CHUYỂN ĐỘNG QUAY 
11.1. Các kỹ thuật tạo mô phỏng chuyển động quay 
11.1.1. Kỹ thuật vẽ lại hình 
Cách thực hiện: vẽ hình ảnh ở các trạng thái quay của vật cần mô phỏng 
theo thời gian. 
Kỹ thuật này phức tạp trong việc xử lý vẽ hình, xoay hình nhưng ít tiêu tốn 
về bộ nhớ. 
Thực hiện: 
- Vẽ hình ở vị trí đầu tiên, trễ để quan sát 
- Xóa hình cũ 
- Vẽ lại hình ở vị trí mới, sử dụng thuật toán xoay, kết hợp các chi tiết bổ 
sung ở vị trí mới (tùy từng đối tượng). 
11.1.2. Kỹ thuật thay hình 
- Đây là kỹ thuật tạo mô phỏng chuyển động quay đơn giản. Chuyển động 
quay được tạo ra bằng cách hiển thị lần lượt hình ảnh của vật quay ở các trạng 
thái khác nhau. 
- Kỹ thuật: vẽ hoặc chụp sẵn hình ảnh ở các vị trí quay khác nhau, lưu vào 
danh sách ảnh sau đó cho lần lượt hiển thị ra màn hình. 
Thực hiện: 
- Chuẩn bị thư viện hình ảnh của vật cần mô phỏng ở các góc quay khác 
nhau (kế tiếp), thường lưu trong danh sách ảnh. 
- Sử dụng chỉ số kiểm soát để lần lượt hiển thị từng ảnh. Sau mỗi lần hiển 
thị, trễ để quan sát. 
- Timer thường được sử dụng để điều khiển việc thay ảnh tự động theo thời 
gian định trước. 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
70 
11.2. Các ví dụ về tạo mô phỏng chuyển quay 
Ví dụ tạo chuyển động quay của cánh quạt bằng kỹ thuật thay hình. 
Bài 12 
THỰC HÀNH LẬP TRÌNH MÔ PHỎNG 
THIẾT BỊ CHUYỂN ĐỘNG TỊNH TIẾN 
12.1. Mục tiêu 
- Trình bày được các yêu cầu đối với thiết kế mô phỏng chuyển động tịnh 
tiến. 
- Ứng dụng thiết kế mô phỏng chuyển động tịnh tiến vào thiết kế giao diện 
cho chương trình điều khiển thiết bị. 
12.2. Các kiến thức lý thuyết liên quan 
- Kiến thức sử dụng ngôn ngữ lập trình C# 
- Thiết kế giao diện của hệ thống cần mô phỏng. 
- Thao tác xử lý trên timer tạo các chuyển động cho các điều khiển. 
12.3. Nội dung luyện tập 
- Thiết kế giao diện cho bài tập được giao trong cuốn hệ thống bài tập. 
- Lập trình và chạy chạy thử các mô phỏng chuyển động. 
- Bài tập: theo tài liệu Bài tập thực hành lập trình điều khiển thiết bị 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
71 
Bài 13 
CỔNG SONG SONG 
13.1. Cơ bản về cổng song song 
Cổng song song gồm có 4 đường điều khiển, 5 đường trạng thái và 8 
đường dữ liệu bao gồm 5 chế độ hoạt động: 
- Chế độ tương thích (compatibility). 
- Chế độ nibble. 
- Chế độ byte. 
- Chế độ EPP (Enhanced Parallel Port). 
- Chế độ ECP (Extended Capabilities Port). 
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; 
khởi động máy in; máy in ở trạng thái off-line. 12 PAPER EMPTY (In) Mức cao: hết giấy 
13 SELECT (In) Mức cao: máy in ở trạng thái online 
14 AUTOFEED (Out) Tự động xuống dòng; mức thấp: máy in 
xuống dòng tự động 
15 ERROR (In) Mức thấp: hết giấy; máy in ở offline; lỗi máy in 
16 INIT (Out) Mức thấp: khởi động máy in 
17 SELECTIN (Out) Mức thấp: chọn máy in 
18-25 GROUND 0V 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
72 
13.2. Kiến trúc phần cứng 
Các đầu nối trên dây cable: 
Đầu nối trên thân máy: 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
73 
Giao diện LPT bao gồm 25 chân trong đó có 8 chân tương ứng với 8bit 
dữ liệu. Các chân điều khiển, chân trạng thái, số còn lại là chân tiếp đất. Chi 
tiết được thể hiện ở bảng sau: 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
74 
Biểu đồ thời gian của các chu kỳ I/O: 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
75 
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. 
Địa chỉ các cổng được trình bày trong bảng sau: 
13.3. Các thanh ghi 
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ữ 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
76 
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: 
Địa chỉ Chức năng 
0000h:0408h Địa chỉ cơ sở của LPT1 
0000h:040Ah Địa chỉ cơ sở của LPT2 
0000h:040Ch Địa chỉ cơ sở của LPT3 
Định dạng các thanh ghi như sau: 
Thanh ghi dữ liệu (hai chiều): 
7 6 5 4 3 2 1 0 
Tín hiệu máy 
in 
D7 D6 D5 D4 D3 D2 D1 D0 
Chân số 9 8 7 6 5 4 3 2 
Thanh ghi trạng thái máy in (chỉ đọc): 
Thanh ghi điều khiển máy in: 
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ 
77 
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ác file đính kèm theo tài liệu này:
 01200049_2422_1983578.pdf 01200049_2422_1983578.pdf