从上一篇教程中咱们了解到,按键与开关的输入本质上就是数字信号的读取。这一篇教程要讲的是,控制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 将引脚配置为输出模式。若是没有将引脚配置为输出而写高电平会怎样?本身试试吧。缘由咱们之后分析。
因为今天的教程很是简单,就没有做业了。复习一下以前的内容,下一篇教程会比较难。