【问题标题】:Binary counter using for loop with LEDs in Arduino在 Arduino 中使用带 LED 的 for 循环的二进制计数器
【发布时间】:2015-06-16 03:55:20
【问题描述】:

我是使用 Arduino 的初学者,我正在尝试使用 LED 进行二进制计数。

我的代码是:

int ledPins[] = {2,3,4,5,6,7,8,9};
{
  int delaytime = 500;
  int x;
  int mod;
  int index;
  int remain;
  for (x=0; x<512; x++)
  {
   if(x%2 == 1)
   {
    digitalWrite(2,HIGH);
   }
   else
   {
    digitalWrite(2,LOW);
   }
   for (index=1, mod=4, remain=1; index<8; index++, mod*=2, remain+=4)
    {
      if(x%mod>remain)
      { 
        digitalWrite(ledPins[index],HIGH);

      }
      else {
        digitalWrite(ledPins[index], LOW);
      }
    }
  delay(delaytime);
  }
}

我希望 LED 在 x%mod> 保留时打开。 (例如 7%4>1,因此 LED 3 将亮起)

请有人帮帮我。非常感谢。

【问题讨论】:

  • 我怎样才能让他们做我想让他们做的事?我希望 mod 乘以 2 并保持增加 4
  • @GregHewgill 谢谢。我认为这会起作用,但由于某种原因,现在第一个 LED 保持亮起,然后其他几个 LED 稍后亮起。即使我将代码恢复原状,现在也会发生这种情况。
  • 好吧,您可能需要查看确定哪些 LED 应该点亮的算法。我不太确定您的 x%mod&gt;remain 条件实际上应该检查什么,但它似乎并没有进行位提取。我会使用&amp;&lt;&lt; 等运算符重写该循环(搜索“以二进制形式打印数字”或类似内容以获取更多详细信息)。
  • @GregHewgill 伙计,我一定累了。我把所有的支票都弄乱了。我想修改数字,如果它大于数字,则 LED 亮起(例如 6%4=2、2>1,因此 LED 1 将亮起)。我用 >> 来检查,现在它们都亮了,前 4 个 LED 似乎以某种毫无意义的模式闪烁。

标签: c binary arduino counter led


【解决方案1】:

您可以使用按位运算,而不是使用模运算符“%”。例如,以下将 x 的当前值写入您的 LED:

for(i=0; i<8; i++)
{
    digitalWrite(ledPins[i], (x >> i) & 0x01);
}

这里涉及到两个操作,按位右移(“>>”)和按位与(“&”)。

例如,假设我们想要获取数字 170 的第 3 位。下面显示了如何以二进制方式处理数字:

(original value of x)   10101010
(after bitwise shift 3) 00010101
(after bitwise and 1)   00000001

有关更多信息,请搜索“位运算符”或“位掩码”。

要弄清楚为什么你的方法不起作用,最好的方法是通过为 x 选择一个值并像我上面所做的那样在纸上解决会发生的情况来试运行它。乍一看,你总是在每个循环的余数上加 4,这对我来说是错误的。

当引脚在端口上是连续的时,您可以简单地将 x 的值直接分配给端口;这就是 Bappi 的意思。这是可行的,因为引擎盖下的微控制器将多个引脚值存储在一个寄存器中。

【讨论】:

    【解决方案2】:

    我假设 pint 9 是 LSD,pin 2 是 MSD,试试下面的代码。

    LEDControlLoop(){
    
        int x = 0;
        int delaytime = 500;
        DDRD = B11111111; // sets port d as output
    
        while(1){ // infinte while loop,
            PORTD = x;
            delay(delaytime);
            x++;
            if(x>255){
                x = 0;
                //break; //optional
            }   
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      相关资源
      最近更新 更多