流水灯是单片机学习过程中最经典的案例。 程序的实际运行效果是8个LED以一定时间间隔循环点亮,如同节日彩灯一样。
实验电路本身很简单,但要用面包板搭建也相当费时费力,我使用了一块八LED模块就简单多了。
为了对比,我们首先看一个采用Arduino的引脚概念编写的程序。
右下图为实际电路,八LED模块的引脚0~7接我自己的AVR单片机最小系统板的B端口的0~3,也就是Arduino标识为数字引脚的8~13以及D端口的4~7,也就是Arduino的4、5、6、7引脚。
八LED模块的C引脚接我的板子的低电位即GND引脚。
引脚形式编写的流水灯程序
byteledPin[] = {4,5,6,7,8,9,10,11}; //引脚数组
intcurrentLED = 0; //当前要点亮的LED的标记变量
voidsetup() //初始化,只运行一次
{
for (int x = 0;x < 8;x++) //8个引脚都设为输出
{
pinMode(ledPin[x],OUTPUT);
}
}
voidloop() //主循环
{
changeLED(); //调用变换LED函数
delay(500); //延时
}
voidchangeLED() //变换LED函数主体
{
for (int x = 0;x < 8;x++) //先将8个LED都置低,熄灭
{
digitalWrite(ledPin[x],LOW);
}
digitalWrite(ledPin[currentLED],HIGH); //仅点亮要点亮的LED
currentLED++; //要点亮LED计数变量增一
if (currentLED == 8) //如果要点亮LED计数变量等于8
currentLED = 0; //要点亮LED计数变量归零
}
用端口形式编写流水灯程序
这个例程使用端口的概念实现与前例相同的运行效果,但程序代码要短小简洁的多,连线也顺当得多。
右图为我的最小系统板与八LED模块的接线图,请读者注意此例与前例的区别。
此例的引脚直接接B端口的8个引脚,也就是Arduino的8、9、10、11、12、13引脚,以及被晶振占用的两个引脚。
voidsetup() {
DDRB = 0xFF; //设置端口B为输出
}
voidloop() {
byte cnt;
PORTB = 0x01; //从最右侧第一个LED开始
for (cnt = 0;cnt < 8;cnt++)
{
delay(500); //延迟500毫秒
PORTB = PORTB << 1; //左移一位
}
}
感兴趣的朋友可以比较一下,也请给出评价。后续,还将给出8段数码管的例子。