for

Giới thiệu

Hàm for có chức năng làm một vòng lặp. Vậy vòng lặp là gì? Hãy hiểu một cách đơn giản, nó làm đi làm lại một công việc có một tính chất chung nào đó. Chẳng hạn, bạn bật tắt một con LED thì dùng digitalWrite xuất HIGH delay rồi lại LOW rồi lại delay. Nhưng nếu bạn muốn làm nhiều hơn 1 con LED thì mọi đoạn code của bạn sẽ dài ra (không đẹp và khi chỉnh sửa thì chẳng lẻ ngồi sửa lại từng dòng?

Với 1 con led, bạn lập trình như thế này

digitalWrite(led1,HIGH);
delay(1000);
digitalWrite(led1,LOW);
delay(1000);

Với 10 con led, nếu bạn không dùng for, đoạn code nó sẽ dài như thế này

digitalWrite(led1,HIGH);
delay(1000);
digitalWrite(led1,LOW);
delay(1000);
digitalWrite(led2,HIGH);
delay(1000);
digitalWrite(led2,LOW);
delay(1000);
...
digitalWrite(led10,HIGH);
delay(1000);
digitalWrite(led10,LOW);
delay(1000);

Nếu như vậy thì bạn có còn muốn lập trình và suy nghĩ về một led ma trận có còn nữa không ? Chắc chắn là không rồi, vì vậy hàm for ra đời để giúp bạn nhìn cuộc sống một cách tươi đẹp hơn ! smiley

Bây giờ hãy lấy một ví dụ đơn giản như sau:

Tôi muốn xuất 10 chữ số (từ 1 - 10) ra Serial. Hãy giúp tôi lập trình trên Arduino để làm được việc ấy!

Nếu bạn chưa đọc bài này và cũng chưa biết kiến thức về for, bạn sẽ lập trình như sau:

void setup() {
    Serial.begin(9600);
    Serial.println(1);
    Serial.println(2);
    Serial.println(3);
    Serial.println(4);
    Serial.println(5);
    Serial.println(6);
    Serial.println(7);
    Serial.println(8);
    Serial.println(9);
    Serial.println(10);
}
void loop() {
    // không làm gì cả;
}

Đoạn code khá dài và lặp đi lặp lại câu lệnh Serial.println

Nhưng sau khi biết về hàm for bạn chỉ cần một đoạn code cực kì ngắn như sau:

void setup(){
    Serial.begin(9600);
    int i;
    for (i = 1;i<=10;i=i+1) {
        Serial.println(i);
    }
}
void loop(){
}

Cấu trúc

Theo quan điểm của tôi, nếu bạn chưa biết về vòng lặp hoặc hàm for, để hiểu được hàm for, bạn cần nắm được 4 phần:

  1. Hàm for là một vòng lặp có giới hạn - nghĩa là chắc chắn nó sẽ kết thúc (không sớm thi muộn).
  2. Nó sẽ bắt đầu từ một vị trí xác định và đi đến một vị trí kết thúc.
  3. Cứ mỗi bước xong, nó lại thực hiện một đoạn lệnh
  4. Sau đó, nó lại bước đi tiếp, nó có thể bước 1 bước hoặc nhiều bước, nhưng không được thay đổi theo thời gian.

Theo ví dụ trên, ta có đoạn code sử dụng hàm for như sau:

for (i = 1;i<=10;i = i + 1) {
    Serial.println(i);
}

Hàm for trong ví dụ này sẽ :

  1. Chắc chắn nó sẽ xử lý đoạn code Serial.println(i); 10 lần
  2. Chạy từ vị trí xuất phát là 1, đến vị trí kết thúc là 10 // i = 1 ; i <= 10
  3. Cứ mỗi lần bước xong (tính luôn cả vị trí xuất phát tại thời điểm i = 1) thì nó lại chạy lệnh Serial.println(i);. Trong đó biến i, dân khoa học gọi là biến con chạy, còn tôi gọi là vị trí của thằng i smiley
  4. Mỗi lần chạy xong, thằng i lại bước thêm 1 bước nữa. Chừng nào mà thằng i  còn <= 10 thì nó còn quay về bước 3

Bạn có thấy nó dễ hiểu không? Bây giờ tôi sẽ nói nó theo một cách khoa học qua cú pháp của hàm for (tôi sẽ chia làm 2 loại để các bạn dễ dàng ứng dụng vào code của mình).

  • For tiến (xuất phát từ một vị trí nhỏ chạy đến vị trí lớn hơn) <vị trí kết thúc> bé hơn <vị trí kết thúc>
for (<kiểu dữ liệu nguyên> <tên thằng chạy> = <vị trí xuất phát>; <tên thằng chạy> <= <vị trí kết thúc>; <tên thằng chạy> += <mỗi lần bước mấy bước>) {
    <đoạn câu lệnh>;
}
  • For lùi (xuất phát từ một vị trí lớn chạy về vị trí nhỏ hơn) <vị trí xuất phát> lớn hơn <vị trí kết thúc>
for (<kiểu dữ liệu nguyên> <tên thằng chạy> = <vị trí xuất phát>; <tên thằng chạy> <= <vị trí kết thúc>; <tên thằng chạy> -= <mỗi lần lùi mấy bước>) {
    <đoạn câu lệnh>;
}

Và khi đã hiểu được một cách sâu sắc thì đây là cú pháp chính của hàm For:

for (<biến chạy> = <start>;<điều kiện>;<bước>) {
//lệnh
}

Xem thêm bài array để xem cách dùng for và array nhé!

lên
12 thành viên đã đánh giá bài viết này hữu ích.
Các bài viết cùng tác giả

Lập trình ATtiny13 với Codebender

Trong bài viết Code Arduino trên MÂY, bạn có muốn thử hay không?, chúng ta đã biết cách lập trình Arduino trên mây rồi, phải không nào? Nhưng qua quá trình tìm hiểu thì mình thấy Codebender chưa hỗ trợ dòng ATtiny13, trong khi đó nó lại hỗ trợ những dòng ATtiny45, 85 và 2313. Vậy, câu hỏi đặt ra là: có cách nào để lập trình ATtiny13 qua Codebender hay không? Và câu trả lời là: Có, chúng ta có thể.

lên
3 thành viên đã đánh giá bài viết này hữu ích.

Bài 8: Dùng button (nút bấm) để điều khiển một đèn LED

Chúng ta đã tìm được cách để đọc được trạng thái của một button qua bài viết Bài 3: Xác định trạng thái của một nút nhấn (button) rồi, đúng không nào? Bây giờ, chúng ta sẽ dựa vào trạng thái của các button ấy để điều khiển các đèn LED. Thực chất, đây là một bài viết vô cùng đơn giản, bạn có thể bỏ qua nếu đã biết và xem bài tiếp theo!

 

lên
6 thành viên đã đánh giá bài viết này hữu ích.
Từ khóa: