Arduino论坛
直播中

fullmous

13年用户 32经验值
擅长:控制/MCU
私信 关注
[讨论]

关于流水等程序的不同处理方式的对比试验


8_led.JPG       
流水灯是单片机学习过程中最经典的案例。 程序的实际运行效果是8LED以一定时间间隔循环点亮,如同节日彩灯一样。

       实验电路本身很简单,但要用面包板搭建也相当费时费力,我使用了一块八LED模块就简单多了。

       为了对比,我们首先看一个采用Arduino的引脚概念编写的程序。

       右下图为实际电路,八LED模块的引脚0~7接我自己的AVR单片机最小系统板的B端口的0~3,也就是Arduino标识为数字引脚的8~13以及D端口的4~7,也就是Arduino4567引脚。

       LED模块的C引脚接我的板子的低电位即GND引脚。

引脚形式编写的流水灯程序

liushuideng1.jpg


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++)     //先将8LED都置低,熄灭

  {

    digitalWrite(ledPin[x],LOW);

  }


  digitalWrite(ledPin[currentLED],HIGH);  //仅点亮要点亮的LED

  currentLED++;             //要点亮LED计数变量增一

  if (currentLED == 8)      //如果要点亮LED计数变量等于8

    currentLED = 0;         //要点亮LED计数变量归零

}


用端口形式编写流水灯程序

liushuideng2.jpg       
这个例程使用端口的概念实现与前例相同的运行效果,但程序代码要短小简洁的多,连线也顺当得多。

       右图为我的最小系统板与八LED模块的接线图,请读者注意此例与前例的区别。

       此例的引脚直接接B端口的8个引脚,也就是Arduino8910111213引脚,以及被晶振占用的两个引脚。


voidsetup() {      

  DDRB = 0xFF;      //设置端口B为输出

}


voidloop() {

  byte cnt;

  PORTB = 0x01; //从最右侧第一个LED开始

  for (cnt = 0;cnt < 8;cnt++)

  {

    delay(500);                          //延迟500毫秒

    PORTB = PORTB << 1;       //左移一位

  }

}


       感兴趣的朋友可以比较一下,也请给出评价。后续,还将给出8段数码管的例子。

更多回帖

发帖
×
20
完善资料,
赚取积分