Thứ Ba, 4 tháng 12, 2018

Cấu trúc điều khiển trong CCS

Vòng lặp for  (For Loop)
Chương trình biên dịch CCS cho vi điều khiển PIC

Lệnh for : vòng lặp xác định thực hiện lặp lại một số lần xác định của một (chuỗi hành động)
Cú pháp lệnh
for (biểu thức 1; biểu thức 2; biểu thức 3)
{
khối lệnh;
}
Kiểm tra điều kiện nếu đúng thì thực hiện khối lệnh; lặp lại kiểm tra điều kiện nếu sai thoát khỏi vòng lặp
+ Biểu thức 1: Thực thi chỉ một lần tại điểm nhập của vòng lặp, biểu thức 1 điển hình là một lệnh gán sử dụng để khởi tạo điều kiện cho biểu thức 2.
+ Biểu thức 2: là quan hệ logic thể hiện điều kiện tiếp tục vòng lặp.
+ Biểu thức 3: phép gán dùng thay đổi giá trị biến điều khiển.
+ Nếu biểu thức 2 không có, vòng for được xem là luôn luôn đúng. Muốn thoát khỏi vòng lặp for phải dùng một trong 3 lệnh break, goto hoặc return.
+ Với mỗi biểu thức có thể viết thành một dãy biểu thức con phân cách nhau bởi dấu phẩy. Khi đó các biểu thức con được xác định từ trái sang phải. Tính đúng sai của dãy biểu thức con trong biểu thức thứ 2 được xác định bởi biểu thức con cuối cùng.
+ Trong thân for (khối lệnh) có thể chứa một hoặc nhiều cấu trúc điều khiển khác.
+ Khi gặp lệnh break, cấu trúc lặp sâu nhất sẽ thoát ra.
+ Trong thân for có thể dùng lệnh goto để thoát khỏi vòng lặp đến vị trí mong muốn.
+ Trong thân for có thể sử dụng return để trở về một hàm nào đó.
+ Trong thân for có thể sử dụng lệnh continue để chuyển đến đầu vòng lặp (bỏ qua các câu lệnh còn lại trong thân).
 Chương trình ví dụ:

#include " 16F877A.h "
#use delay (clock = 1000000)
void main()
{
int x;
while(input(PIN_C0)) { } ; // chờ cho đến Pin C0=0;
for (x = 0; x < 5; x ++) // Điều kiện vòng lặp For
{
output_high(PIN_D0); // 
delay_ms(500);
output_low(PIN_D0);
delay_ms(500);
}
while(1); // Vòng lặp vô tận
}
 Vòng lặp for ví dụ trên hoạt động như sau. Tại điểm nhập  x được gán =0, Lúc này kiểm tra điều kiện x>5 đúng nên chương trình thực hiện khối cấu lệnh bên trong vòng lặp, khi thực hiện xong khối câu lệnh, x được tăng lên một đơn vị (x++), lúc này x=1, nó tiếp tục so sánh với 5, điều kiện vẫn đúng nên chương trình tiếp tục thực hiện khối câu lệnh bên trong vòng lặp.......quá trình này diễn ra đến khi = 5. Lúc này điều kiện x< 5 không đúng nữa nên chương trình thoát khỏi vòng lặp . Ta thấy khối lệnh trên thực hiện 5 lần.


Vòng lặp while  (For while)
Chương trình biên dịch CCS cho vi điều khiển PIC
Cấu trúc vòng lặp while
while(biểu thức)
{
Khối lệnh;
}

Hoạt động của lệnh while như sau:
Bước 1: Tính giá trị của (biểu thức)
Bước 2: Nếu giá trị tính được của (biểu thức) là ‘sai’ (==0) thì kết thúc  vòng lặp while.
Bước 3: Nếu giá trị của (biểu thức) là ‘đúng’ (!=0) thì thực hiện khối lệnh sau while.
Bước 4: Quay lại bước 1
Khối lệnh trong while có thể thực hiện một lần, nhiều lần và cũng có thể không được thực hiện lần nào nếu ngay từ đầu biểu thức sau while đã sai. 
Chương trình ví dụ:
#include " 16F877A.h "
#use delay (clock = 1000000) // MCU clock = 1 MHz
void main()
{

while(input(PIN_C0)) // kiểm tra Pin C0
{
output_high(PIN_D0);
delay_ms(300); // chờ 300 ms
output_low(PIN_D0);
delay_ms(500); // chờ 500 ms
}
output_low(PIN_D0); // chân D0 = 0
for(;;); //vòng lặp vô tận

}
 Đoạn chương trình trên hoạt động như sau: Ban đầu kiểm tra chân RC0 của Port C bằng lệnh input(PIN_C0), nếu hàm trả về 1 tức là chân RC0 đang ở mức cao lúc đó chương trình thực hiện khối lệnh trong vòng lặp while, nếu chân RC0 ở mức thấp thì bỏ qua khối lệnh bên trong vòng lặp while và thực hiện lệnh Output_low(PIC_C0).

Vòng lặp do..while  Chương trình biên dịch CCS cho vi điều khiển PIC
Cấu trúc lặp do...while
 
Cú pháp:
 
do
{
Khối lệnh;
}
while (biểu thức);

Giải thích cú pháp:
Bước 1: thực hiện khối lệnh sau do.
Bước 2: kiểm tra giá trị biểu thức <biểu thức> sau while, nếu có giá trị ‘đúng’ ( khác 0) thì lặp lại bước 1, nếu ‘sai’ (=0) thì kết thúc vòng lặp.
Đoạn chương trình ví dụ:
 
#include <18F4550.h>
#device ADC=8
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL2,CPUDIV1,VREGEN
#use delay(clock=48000000)

void main()
{
int x=0;
do
{
x++;
}
while(x<5);
output_d(0xff);
for(;;) //vòng lặp vô tận
}
Cấu trúc do... while của chương trình ví dụ trên hoạt động như sau:
Lúc đầu câu lệnh theo sau do được thực hiện, x được tăng 1 đơn vị lúc này x =1, Khi đó lệnh while(x<5) kiểm tra x < 5 không, nếu đúng sẽ quay lại thực hiện câu lệnh sau do, quá trình này tiếp diễn đến khi x=6, sau khi kiểm tra điều kiện, chương trình thấy điều kiện không còn đúng nữa nên thoát khỏi vòng lặp và thực hiện lệnh tiếp theo là output_d(0xff). Ta thấy câu lệnh theo sau do thực hiện tổng cộng 6 lần. Khi sử dụng vòng lặp do...while câu lệnh hoặc khối câu lệnh sau do thực hiện ít nhất một lần. 
Câu lệnh if/ELSE (if statement)
Chương trình biên dịch CCS cho vi điều khiển PIC
Hoạt động của lệnh IF như sau: Nếu điều kiện đúng (true) thì câu lệnh hoặc khối câu lệnh bên trong cặp dấu ngoặc nhọn {} ngay sau if được thực thi
     if(condition)
             // Câu lệnh 1;
 Hoặc

if(condition)
{
// Câu lệnh 1;
// Câu lệnh 2;
....
}
Hoạt động của lệnh IF/ELSE như sau: Nếu điều kiện đúng (true) thì chương trình sẽ thực hiện câu lệnh hoặc khối câu lệnh sau if nếu sai thì nó sẽ thực hiện câu lệnh hoặc khối câu lệnh nằm trong cặp dấu ngoặc {} nhọn ngay sau else
if(condition)
// Câu lệnh 1;
else
             // Câu lệnh 1;
Hoặc
if(condition)
{
// Câu lệnh 1;
// Câu lệnh 2;
....
}
else
{
// Câu lệnh 1;
// Câu lệnh 2;
....
}
Các câu lệnh if có thể lồng nhau (nested if): rất hay gặp. Một điều cần chú ý là else sẽ tương ứng với if gần nó nhất. Chương trình sau mô tả lệnh if lồng nhau.
 if(condition1)
//câu lệnh 1;
else if (condition2)
 //câu lệnh 2;
else if (condition3)
//câu lệnh 3;
else
           //câu lệnh 4;
Biểu thức điều kiện:
Một phiên bảng khác của if/else là biểu thức điều kiện, thiết kế để tiết kiệm các bước và thời gian lập trình thông qua cú pháp đơn giản.
Khi đó cú pháp:
if(condition1)
     //câu lệnh 1;
else
          //câu lệnh 2;
 Có thể thay thế bằng:
          condition1 ? câu_lệnh_1 : câu_lệnh_2;

Có nghỉa là nếu điều kiện là đúng thì thực câu lệnh 1, nếu không đúng thì thực thi câu lệnh 2
Ví dụ:
(x<5)? y=1:y=0;
Nếu x bé hơn 5 thì y = 1, nếu ngược lại thì y=0

 Đoạn chương trình ví dụ:

#include <16F877A.h> 
void main() 

int x;    // khai báo biến
output_D(0);    // các chân của port D xuống mức thấp
while(1)    // Vòng lặp vô tận

x   =   input(PIN_C0);  // nhận trạng thái Pin C0
if(x  == 1)output_high(PIN_D0);     // Nếu chân C 0 lên mức 1 thì set chân D0 lên mức cao

}

Câu lệnh SWITCH/CASE  (SWITCH/CASE  statement)
Chương trình biên dịch CCS cho vi điều khiển PIC
Cú pháp của lệnh switch...case như sau:
switch(biểu thức)
{
case giá trị 1   : Lệnh 1;
break;
case giá trị 2   : lệnh 2;
break;
....
case giá trị n  : lệnh n;
                       break;
}
Biểu thức: phải có kết quả là giá trị hằng nguyên (char, int, long,...)
Lệnh 1,2... n có thể gồm nhiều lệnh, nhưng không cần đặt trong cặp dấu {}
 Hoạt động của lệnh switch/ case như sau: Khi giá trị của biểu thức bằng giá trị i thì lệnh i sẽ được thực hiện. Nếu sau lệnh i không có lệnh break thì sẽ tiếp tục thực hiện lệnh i + 1…Ngược lại thoát khỏi cấu trúc switch.
switch(biểu thức)
{
case giá trị 1   : Lệnh 1;
break;
case giá trị 2   : lệnh 2;
break;
....
case giá trị n  : lệnh n;
                       break;
default          : lệnh;
                     [break;]
}
 
Khi giá trị của biểu thức bằng giá trị i thì lệnh i sẽ được thực hiện. Nếu sau lệnh i không có lệnh break thì sẽ tiếp tục thực hiện lệnh i + 1…Ngược lại thoát khỏi cấu trúc switch. Nếu giá trị biểu thức không trùng với bất kỳ giá trị i nào thì lệnh tương ứng với từ khóa default sẽ được thực hiện.

Không có nhận xét nào:

Đăng nhận xét

Bài đăng mới nhất

Valdes Fernando - Microcontrollers Applications With Pic

Bài đăng phổ biến