什麼是「燒錄」
燒錄就是把程式放進板子的晶片裡,讓板子自己跑。
為什麼叫「燒」
早期的晶片(PROM)裡面有很多細小的「保險絲」,寫入程式時要用比較高的電壓把其中一些燒斷:燒斷的代表 0、沒燒斷的代表 1,燒了就改不回來。 現在的晶片改用快閃記憶體(Flash),可以重寫幾萬次,什麼都不用燒,但「燒錄」這個說法就一直沿用下來。
按下「燒到板子」時發生什麼
- 編譯:你寫的程式是給人看的文字,晶片看不懂。編譯器把它翻譯成晶片(ESP32)看得懂的機器碼,一長串 0 和 1。
- 傳送:透過 USB 線,把機器碼一段一段傳到板子上。
- 寫入:板子把收到的機器碼寫進快閃記憶體。
- 重開機:板子從頭開始跑新的程式。
快閃記憶體斷電也不會消失,所以燒好之後拔掉電腦、只接電源,板子一樣會跑這支程式;要換程式,就再燒一次蓋掉。
程式從哪裡開始跑:setup() 與 loop()
每一支 Arduino 程式都有這兩個函式:
void setup() {
// 開機時跑「一次」:初始化螢幕、畫第一個畫面
}
void loop() {
// setup() 跑完之後,「一直重複」跑,直到斷電
}
這一關所有的事都在 setup() 裡做完了,所以 loop() 是空的。
下一關開始,需要「一直更新」的東西(動畫、觸控、時鐘)就會放進 loop()。
變數:有名字的盒子
String MY_NAME = "你的名字";
| 部分 | 意思 |
|---|---|
String | 盒子的種類:裝一段文字(字串) |
MY_NAME | 盒子的名字,之後用這個名字就能拿到裡面的東西 |
= | 把右邊的值放進左邊的盒子(不是數學的「等於」) |
"你的名字" | 要放進去的值 |
; | 這一句結束 |
程式後面寫到 MY_NAME 的地方,都會換成你放進去的名字。
所以只要改這一行,畫面上的名字就跟著改,不用去找畫字的那一行。
為什麼一定要有雙引號 ""
雙引號告訴電腦:「這是一段文字,照抄就好」。
"物理創客":一段文字,內容是「物理創客」。物理創客(沒有引號):電腦會以為這是另一個叫「物理創客」的變數,找不到就編譯失敗。
引號一定要成對,而且要用英文輸入法打的半形 ";中文輸入法的 “ ” 電腦不認得。
為什麼能寫出中文
螢幕只認得「點」
螢幕不知道什麼是「字」,它只會把每一個點(像素)塗上顏色。 所以每一個字,對螢幕來說都是一小塊點的圖案:哪些點要亮、哪些點不亮。這些圖案的集合就叫字型。
英文好辦,中文難
- 英文只有 26 個字母加上數字、標點,大約 100 個圖案。螢幕函式庫本來就內建了,直接就能寫。
- 中文常用字有好幾千個,每個字的圖案都要另外存,函式庫裡沒有,所以用一般的寫字指令,中文會變成一堆亂碼或空白。
點亮板的做法:把字的圖案一起燒進去
點亮板把需要的中文字圖案做成一份字型資料(程式裡的 cyd_font.h),跟程式一起燒進板子。
寫字的時候,cydText() 一個字一個字去字型資料裡找圖案,再一點一點畫到螢幕上。
這份字型的每個字邊緣還有深淺不同的灰點,所以字看起來平滑,不會一格一格的。
為了省空間,大部分關卡只放「這支程式裡用到的字」,只要幾十 KB。 這一關不一樣:名字是你自己打的,事先不知道會用到哪些字,所以放了完整的常用字,大約 2 MB。
寫字的三個函式
cydText(tft, x, y, 文字, 文字顏色, 背景顏色); // 從 (x, y) 開始寫
cydTextCentre(tft, 中心x, y, 文字, 文字顏色, 背景顏色); // 以中心x 置中
int w = cydTextWidth(tft, 文字); // 這段文字有多寬(像素)
這一關把名字放在右下角,用的就是「先量寬度、再往左退」:
int w = cydTextWidth(tft, MY_NAME);
cydText(tft, 314 - w, 214, MY_NAME, TFT_DARKGREY, TFT_BLACK);
名字越長,w 越大,起點就越往左,所以名字的右邊永遠對齊在 x = 314。
名詞小抄
| 名詞 | 資訊大白話 |
|---|---|
| 燒錄 | 把程式編譯後寫進板子的快閃記憶體 |
setup() | 開機跑一次 |
loop() | 之後一直重複跑 |
| 變數 | 有名字、可以放值的盒子 |
字串 String | 一段文字,前後用 " 包起來 |
| 編譯失敗 | 程式寫法電腦看不懂,翻譯不出來,所以燒不進去 |












