# LED（燈光）顯示功能

不同於其它的開發板，micro:bit本身就具備有25顆LED可以用於顯示的資訊，而且它的每一顆LED均可以使用(x, y)座標單獨控制，除了可以指定某一特定點的LED加以顯示之外，還可以得知該點的目前狀態，以及使用切換的方式來控制該點的明滅，善加運用這些功能，就可以做多許多非常有趣的功能。

micro:bit在燈光的部份可以使用的積木分別如下：

![](/files/-LNjmRP-GXQCsl8BHMTO)

其中，第一個積木顧名思義，就是直接指定(x, y)座標所在位置的LED要點亮它，第二個積木當然就是要讓該座標所在位置的LED熄滅。第三個積木比較有趣，它會依照(x, y)座標所在的LED做切換的操作，也就是如果原來是亮的就把它熄滅，如果原來是暗的就把它點亮。

倒數第二個積木是用來查詢(x, y)位置上的LED之明暗資訊，因為是傳回值而不是一個操作，所以它的積木形狀和其它的不一樣。

最後一個積木比較特別，它把整個LED當作是一個長條圖來看，你給它一個最大值，以及一個你要它顯示的值，它就會依照比例來顯示出LED所佔的比重。例如，我們把最大值設定為100，然後顯示值給它20，如下所示：

![](/files/-LNjoYb9xNPVphF__5uH)

顯示出來的結果如下所示：

![](/files/-LNjoen-YQO73yIiyzAQ)

如果把顯示值改為50，則模擬器呈現如下所示的畫面：

![](/files/-LNjor8XbCPgpkNb8gmQ)

接著分別是80和100的樣子：

![](/files/-LNjozsIMvbkaQmE6ZyC)

![](/files/-LNjp6UPBVjJV66-OFu3)

## 長條圖計數器實作

利用這個特性，我們就可以編寫一個以長條圖為顯示的計數器或是倒數計時器，以下的程式積木就是以長條圖的方式來計時，由於是每0.1秒增加1，所以會看到LED會在10秒之後填滿。

![](/files/-LNjqJxvw-1PiAX05wzi)

上述程式搭配如果積木，可以做倒數計時，在時間到的時候隨即產生出時間到的效果。以下的程式積木讓我們的計時器在按下A按鈕時開始計時，如果按一下B按鈕就會暫停，再按一下B按鈕則會繼續，在10秒時間到的時候就讓畫面一直閃爍愛心的圖案。

![](/files/-LNjsis_CvxdA-e3BD6D)

上面的程式中使用了兩個變數，其中counter用來計數，這個之前有說明過了，而counting則用來決定是否要進行計數。0的時候不計數，1的時候計數，其實計不計數就是有沒有要加1啦。因此，在次迴圈中我們利用一個如果判斷檢查counting的內容，如果是1才加1，如果不是的話就不加。

{% hint style="info" %}
其實使用counting的內容決定是否要把counter加1還有另外的寫法，不知道同學們有想到了嗎？（不用如果判斷式）
{% endhint %}

由於這個計數器的主迴圈中有兩個功能，最初是計時，而在時間到了之後改為以愛心閃爍來提示，因此，在主迴圈中要以一個如果判斷式，依照目前counter中的值來決定要執行哪一段程式積木，如果大於100，則執行閃爍功能，否則就執行計數的功能。

## 自製25秒計數器

由於LED共有25個，所以是否我們可以在每一秒過去了之後就點亮1個LED（或是相反，一開始的時候全亮，然後逐秒熄滅一個LED），一直到25秒之後全亮呢？當然可以，只是，要點亮或熄滅個別的LED指定位置時是以(x, y)座標來設定，但是在計數的時候卻是以0數到25來決定，因此，我們必須要把1到25的數字轉換成對應的(x, y)座標才行。假設我們的計數變數還是counter，則算式如下：

$$
x = counter % 5
\y= counter  / 5
$$

其中，第一個式子是取其餘數，而第二個式子是整除。使用和上一個程式類似的架構，但是在顯示時，我們是直接操作LED的(x, y)座標。此外，由於是以一點一點顯示為主，所以一開始除了設定變數的初始值之外，還要把所有的LED通通都清除，當啟動時的程式積木以及A按鈕和B按鈕事件的程式積木如下所示：

![](/files/-LNjx5Vqi7zAE1Nf_qwM)

主迴圈的內容改為如下：

![](/files/-LNjxTj2G3DQpLdNL6gZ)

依照這個方式，我們可以輕易在一個螢幕上顯示0-24或是1-25的數量，而不用等待數字捲動的方式去檢視2個位數的數值了。

## 使用LED來顯示溫度

例如，我們想要知道目前的溫度，最直覺的方法就是使用把溫度使用數字的方式顯示出來，溫度的數值是在「輸入」積木群中：

![](/files/-LNlv4uYMbpxtaFYxxuT)

一般來說，我們只要使用顯示數字積木把這個數值顯示出來即可：

![](/files/-LNlvLnbDglGvkQfKRxx)

然而這樣會看到的是捲動的數字，為了要看一個溫度還要等一小段時間才行（等兩個數字元都顯示完畢）。

在一個畫面中顯示溫度的方法有很多，其中一個方式是之前使用的長條圖，假設最高溫為50度，則可以利用以下的方式在一個畫面中顯示溫度：

![](/files/-LNlw8E7cbz2g8RLv9xd)

如此，當溫度為25度的時候，如下所示：

![](/files/-LNlwHEKhGm-Osj93u2h)

如果是38度的時候則為如下所示的畫面：

![](/files/-LNlwSYsSczXrNcdR58G)

## 控制個別的LED

學會如何控制(x, y)座標的LED之後，我們就可以透過A和B按鈕來移動LED的點了。先假設y固定為4，x一開始是2，當按下A按鈕時把x-1，直到0為止，當按下B按鈕時把y-1，直到4為止，一開始的初始化程式積木設計如下：

![](/files/-LNk-AJYh_LuCBF3mhm4)

我們希望當使用者按下A+B按鈕時也可以復原此狀態，因此在A+B按鈕之事件中做一個一模一樣的積木如下：

![](/files/-LNk-UfLcZwJHqdIsQc-)

如果使用者按下了A按鈕，我們就要讓這個亮點往左移動，往左移動的程式積木如下所示：

![](/files/-LNk-iL-h0ZD3tdhhsWG)

按下B按鈕時要往右移動，如下所示：

![](/files/-LNk-ql6eEeJLK78qVZV)

同學們可以比較一下兩者差異的地方在哪裡喔。

{% hint style="info" %}
這是一個製作動畫的基本技巧，同學們可要仔細研究一下喔。
{% endhint %}

## 使用隨機數來點亮LED

有一個有趣的隨機數積木，它在數學類積木中，可以指定要產生的數字從0到某指定值中任選一個傳回。利用這個特性，我們就可以讓隨機數來產生任意的(x, y)值，並據此切換該位置的LED亮或滅，達到小星星的效果，程式積木如下：

![](/files/-LNlybZ8Gi-0WAJhoBa7)

以下的程式積木搭配了亮度的設定

![](/files/-LNlyyiIDUuwvRnJy3Ym)

使用另外一種效果：

![](/files/-LNm-7ASatC3qalm1DNC)

各位同學可以發揮自己的創意，善用隨機數以創造出更有趣的效果。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://nkust.gitbook.io/micro-bit/led-guang-shi-gong-neng.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
