從上一篇教程中咱們瞭解到,按鍵與開關的輸入本質上就是數字信號的讀取。這一篇教程要講的是,控制LED的原理是數字信號的輸出。數字IO是單片機編程之有別於桌面編程的各項內容中最簡單、最基礎的。編程
在講數字信號輸出以前,咱們先來了解一下它控制的器件。LED,是一種二極管,在理想模型中,加以正向電壓會發光,反向電壓則不會。在稍微實際一點的模型中,當正向電壓超過必定閾值時,二極管會發光,其電流會隨着正向電壓的增大而急劇增大;對反向電壓的耐受力也是有限的。現實中的LED的具體參數因生產廠家而異,通常紅色與黃色LED的導通壓降爲2V多,綠、藍、白色的爲3V左右或多一點;反向耐壓通常爲5V。函數
電流大到必定程度,任何器件都會燒燬,咱們最好要把LED的電壓控制在比導通壓降高一點,但直接得到這樣的電壓比較困難,並且與LED的參數和溫度等都是相關的。一種方案是用電流源來驅動LED,但因爲現代計算機,包括單片機,都以電壓方式來工做,在控制亮暗這種簡單應用中通常不會使用(大功率LED通常有專用的恆流電源來驅動)。常見的方案是將LED與一個電阻串聯。這個電阻能保證LED的電流不太大,所以稱爲限流電阻。至於這種接法下電流是多少,能夠經過「負載線」來求得。本系列教程不會專門講電路,你能夠本身搜索相關知識,遲早會用到的。ui
早期的單片機設計中,通常把LED和電阻接在引腳和正電源之間,這是由於TTL的拉電流能力強而灌電流能力很弱,只能這樣接。CMOS工藝的單片機沒必要在乎這一點,因爲咱們習慣讓1表明有而0表明無,所以通常將LED與電阻接在引腳與地之間。電阻接在LED的正極仍是負極是無所謂的。spa
以上都是對單個LED而言的。對於一些多色LED,好比RGB的,各個單色光源的一極是接在一塊兒的,以節省引腳。當正極接在一塊兒時,稱爲共陽接法:設計
爲了亮度均勻,須要爲每一個LED接一個限流電阻(阻值通常不一樣),這時電阻就必須接在LED負極上了,而後再鏈接單片機引腳,而LED的另外一端則鏈接正電源。引腳輸出低電平會讓對應顏色亮起。code
當負極接在一塊兒時,稱爲共陰接法:blog
LED的兩極稱爲正極負極,接法稱爲共陽和共陰,都是習慣而已,沒必要糾結其中的不一致性。教程
咱們的開發板上有一顆RGBW的LED,4種顏色的LED都有獨立的正負極,但我把它們的負極都接到了地,能夠理解爲共陰接法。LED右邊的4個針腳分別鏈接電阻,而後再鏈接LED的正極。所以,鏈接單片機引腳和LED的針腳後,使引腳輸出高電平能讓LED亮,反之則不亮。開發
將引腳4~7分別鏈接到RGBW上,咱們來實現一個略微複雜(相比以前)的效果:紅,紅+綠,綠,綠+藍,藍,藍+紅;而後重複,只是加上白色;循環。it
1 #include <ee1/pin.h> 2 #include <ee1/delay.h> 3 4 #define RED PIN_4 5 #define GREEN PIN_5 6 #define BLUE PIN_6 7 #define WHITE PIN_7 8 9 void rgb_cycle() 10 { 11 for (uint8_t i = 0; i != 6; ++i) 12 { 13 pin_write(RED , i == 5 || i == 0 || i == 1); 14 pin_write(GREEN, i == 1 || i == 2 || i == 3); 15 pin_write(BLUE , i == 3 || i == 4 || i == 5); 16 delay(500); 17 } 18 } 19 20 int main() 21 { 22 uint8_t pins[] = {RED, GREEN, BLUE, WHITE}; 23 for (uint8_t i = 0; i != sizeof(pins) / sizeof(pins[0]); ++i) 24 pin_mode(pins[i], OUTPUT); 25 while (1) 26 { 27 pin_write(WHITE, false); 28 rgb_cycle(); 29 pin_write(WHITE, true); 30 rgb_cycle(); 31 } 32 }
這段代碼雖然略長,但仍是比較容易理解的:rgb_cycle 即爲6種狀態的枚舉,包含了延時;main 函數中,先初始化,而後進入主循環;每一遍循環中先控制白色燈,而後調用 rgb_cycle ,對於白色燈的兩種狀態調用兩次;總體效果的循環週期爲12次改變。
另外,你也許已經發現,對於數字輸入的引腳,即便沒有調用 pin_mode 來配置模式,也能正常檢測輸入。這是由於輸入是單片機復位後默認的設置。那麼,對於輸出來講,就必須調用 pin_mode 將引腳配置爲輸出模式。若是沒有將引腳配置爲輸出而寫高電平會怎樣?本身試試吧。緣由咱們之後分析。
因爲今天的教程很是簡單,就沒有做業了。複習一下以前的內容,下一篇教程會比較難。