关于流水等的不同处理方法
本帖最后由 fullmous 于 2016-4-7 09:04 编辑流水灯是单片机学习过程中最经典的案例。 程序的实际运行效果是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引脚。
引脚形式编写的流水灯程序
byte ledPin[] = {4,5,6,7,8,9,10,11}; //引脚数组
int currentLED = 0; //当前要点亮的LED的标记变量
void setup() //初始化,只运行一次
{
for (int x = 0;x < 8;x++) //8个引脚都设为输出
{
pinMode(ledPin,OUTPUT);
}
}
void loop() //主循环
{
changeLED(); //调用变换LED函数
delay(500); //延时
}
void changeLED() //变换LED函数主体
{
for (int x = 0;x < 8;x++) //先将8个LED都置低,熄灭
{
digitalWrite(ledPin,LOW);
}
digitalWrite(ledPin,HIGH); //仅点亮要点亮的LED
currentLED++; //要点亮LED计数变量增一
if (currentLED == 8) //如果要点亮LED计数变量等于8
currentLED = 0; //要点亮LED计数变量归零
}
用端口形式编写流水灯程序
这个例程使用端口的概念实现与前例相同的运行效果,但程序代码要短小简洁的多,连线也顺当得多。
右图为我的最小系统板与八LED模块的接线图,请读者注意此例与前例的区别。
此例的引脚直接接B端口的8个引脚,也就是Arduino的8、9、10、11、12、13引脚,以及被晶振占用的两个引脚。
void setup() {
DDRB = 0xFF; //设置端口B为输出
}
void loop() {
byte cnt;
PORTB = 0x01;//从最右侧第一个LED开始
for (cnt = 0;cnt < 8;cnt++)
{
delay(500); //延迟500毫秒
PORTB = PORTB << 1; //左移一位
}
}
感兴趣的朋友可以比较一下,也请给出评价。后续,还将给出8段数码管的例子。
楼主的意思我明白了,就是把arduino的外衣脱掉,就看到底层的了,很好。学习学习。 是的,现在有一种倾向或是潮流,就是太依赖Arduino。现在,发表的很多作品、文章都要冠以基于Arduino云云,其实就是AVR单片机,如果总是躺在Arduino上,是会影响你的成长的。 个人觉得 适合就好! 一个编程语言好坏不在于有多简单和高效。
页:
[1]