###### tags: `CPP` `Arduino`
# 01 C++ 的基石:敘述 (statement) 與函式 (function)
在 Arduino IDE 中撰寫的程式是採用 **C++ 程式語言**, 以下我們以閃爍 LED 實驗的程式來說明 C++ 的基本語法:
```cpp=
void setup() {
// put your setup code here, to run once:
pinMode(5, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(5, LOW);
delay(1000);
digitalWrite(5, HIGH);
delay(1000);
}
```
我們先來看看其中由 Arduino 提供功能的幾行程式:
1. 第 3 行是設定 **5** 號腳位的作用為**輸出 (OUTPUT)** 高低電位訊號。
:::info
不同板子內建的 LED 腳位不同, 請依照〈[00 前言](/1ay9LKa0T5GC2zzqBVxbAw)〉一文修改腳位。
:::
3. 第 8 行是讓 **5** 號腳位輸出**低電位 (LOW)**, 由於 LOLIN D32 板子上的內部電路接法, 這會讓內建的 LED 亮起來。
:::info
不同板子的電路不一定一樣, 像是 Arduino Uno 的內建 LED 就是 13 號腳位輸出高電位時會亮, 請自行依照〈[00 前言](/1ay9LKa0T5GC2zzqBVxbAw)〉一文調整輸出的電位高低。
:::
4. 第 9 行是讓程式暫停 1000 毫秒, 也就是 1 秒鐘。這會讓原本已經亮起的內建 LED 維持亮燈 1 秒鐘。
1. 第 10 行是讓 **5** 號腳位輸出**高電位**, 這會讓內建的 LED 熄掉。
2. 第 11 行和第 9 行一模一樣, 不過因為前一行已經熄掉 LED, 所以暫停的 1 秒鐘內 LED 就保持不亮。
這裡要特別說明幾個基本語法:
1. 除了有左右大括號 ('{' 與 '}') 的 1、4、6、12 行以外, 每一行都以**英文的分號 ';' 結尾**。這樣以分號結束的段落就稱為**敘述 (statement)**。
3. 以 "//" 開始的部分是**註解 (comment)**, 執行時會略過當成沒看到, 即使把註解刪除, 也不會影響執行結果。註解是**寫給人看**的, 方便說明程式的內容, 避免他人或是自己看不懂程式為什麼這樣寫。
5. [`pinMode`](https://www.arduino.cc/reference/en/language/functions/digital-io/pinmode/)、[`digitalWrite`](https://www.arduino.cc/reference/en/language/functions/digital-io/digitalwrite/) 以及 [`delay`](https://www.arduino.cc/reference/en/language/functions/time/delay/) 是 Arduino 提供的功能, 稱為**函式 (functions)**, 不同名稱的函式具備不同的功能。
6. 使用函式的敘述稱為**呼叫 (call)**, 寫法是先寫出函式名稱, 再加上一對小括號, 小括號中依照函式的需要填入相關的資訊, 稱為**參數 (parameters)**, 像是 `pinMode` 就需要腳位的編號以及運作模式兩個參數, 在本例中就是 `5` 和 `OUTPUT`, 參數之間要用**英文逗號 (',')** 隔開。
7. `delay` 函式需要指定暫停的時間, 單位是毫秒, 也就是 1/1000 秒, 如果把時間改短如下, 閃爍的速度就會變得比較急促:
```cpp=
void setup() {
// put your setup code here, to run once:
pinMode(5, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(5, LOW);
delay(200);
digitalWrite(5, HIGH);
delay(200);
}
```
:::info
修改程式後請記得重新上傳, 程式才會生效, 控制板才會執行新的程式。
:::
1. 敘述的開頭以及敘述內的括號、逗號前後可以自由地加入空格甚至斷行寫成多行, 讓程式的結構更清楚, 越容易分辨個別參數, 但並不影響程式執行結果。像是第 3 行也可以寫成這樣:
```cpp
pinMode(
5,
OUTPUT
);
```
C++ 會在看到英文分號才當成敘述的結尾。不過通常除非必要, 單一敘述都會寫成一行。
1. [OUTPUT](https://www.arduino.cc/reference/en/language/variables/constants/constants/)、[HIGH](https://www.arduino.cc/reference/en/language/variables/constants/constants/)、[LOW](https://www.arduino.cc/reference/en/language/variables/constants/constants/) 是 Arduino 預先定義好的名稱, 如同前面的說明, 這些不同的名稱各自代表特殊的意義。
:::info
你可以看到不同名稱的函式功用不同, 執行時所需的參數數量與參數的意義也不相同, 如果想要知道有那些函式可用、執行時又需要提供那些參數, 就必須查閱 [Arduino 的文件](https://www.arduino.cc/reference/en/)。
:::
接下來, 我們會進一步瞭解 [C++ 的其他語法以及 Arduino 程式的結構](/JBjOJFf_TIqJUHsXNUoSaw)。