fullmous 发表于 2016-4-7 09:04:56

关于流水等的不同处理方法

本帖最后由 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段数码管的例子。

li23108 发表于 2016-4-7 12:08:39

楼主的意思我明白了,就是把arduino的外衣脱掉,就看到底层的了,很好。学习学习。

fullmous 发表于 2016-4-7 14:57:10

是的,现在有一种倾向或是潮流,就是太依赖Arduino。现在,发表的很多作品、文章都要冠以基于Arduino云云,其实就是AVR单片机,如果总是躺在Arduino上,是会影响你的成长的。

janeasy 发表于 2016-4-8 12:13:25

个人觉得 适合就好! 一个编程语言好坏不在于有多简单和高效。
页: [1]
查看完整版本: 关于流水等的不同处理方法