0

你知道 Knight-Rider 汽车的红灯吗?我正在用我的 Arduino 构建类似的东西。我有一个带有 7 个 LED 的 Arduino Uno。

我遇到的问题是位移。当我的程序运行时,我告诉它给引脚供电:

PORTD = 0b00000001;

稍作延迟后,我必须将电源切换到另一个引脚。所以它必须是这样的:

PORTD = 0b00000010;

可以通过位移来存档。我虽然关于这样的事情,但它不工作:

PORTD = PORTD << 1;

我该如何解决我遇到的问题?

这是我现在的代码,我必须添加位移:

#include <avr/io.h>
#include <util/delay.h>

int main()
{
    UCSR0B = 0;             
    DDRD = 0b11111111;  

    for(;;)
    {
        PORTD = 0b10000000; 
        _delay_ms(200); 
    }
}
4

3 回答 3

0

假设您要打开PORTD.

PORTD |= (1<<n);

其中位从右到左编号为 0、1、2 等。

要关闭第 4 位,你会这样做

PORTD &= ~(1<<4);

于 2013-09-13T16:22:05.083 回答
0

结合大家给我的各种答案和老师的一些建议,我已经解决了这个问题。

我制作了两个未签名的字符。一个用于判断我们是上升还是下降的 if 语句,另一个用于判断哪个 led 亮着。然后我在循环中做了一些 if 语句。你可以在下面看到它。

我在我的 for 循环中这样做:

1)如果我们要上去(updown 为 1),请将 light up 设置为高 1。如果灯光大于或 7,则向上设置为 0。

2) Else set light up 1 down。如果灯光为 0,则将 updown 设置为 1。

3)做位移。

4)做一点延迟。

#include <avr/io.h>
#include <util/delay.h>

int main()
{
    UCSR0B = 0;
    DDRD = 0b11111111;

    unsigned char upDown=1; // start going with the ports up
    unsigned char cylon=0;  // says which LED is on

    for(;;)
    {
        if(upDown==1){
            cylon++;
            if(cylon>=7) upDown=0;      // Reached the last LED
        }
        else {
            cylon--;
            if(cylon==0) upDown=1;      // Reached min LED
        }
            PORTD = 1 << cylon;
            _delay_ms(100);             // a little wait
    }
}
于 2013-09-14T16:39:35.300 回答
0

PORTD = PORTD << 1应该管用。

还有一个<<=像这样工作的运算符+=

PORTD <<= 1;

但如果第一个版本似乎不是,我认为你在其他地方犯了一个错误。

于 2013-09-13T16:25:22.113 回答