我是使用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);
}
}
我想要在x%mod&gt;保留时打开LED。 (例如,7%4> 1,因此LED 3将打开)
请有人帮帮我。非常感谢你。
答案 0 :(得分:2)
您可以使用逐位运算,而不是使用模运算符'%'。例如,以下内容将x的当前值写入LED:
for(i=0; i<8; i++)
{
digitalWrite(ledPins[i], (x >> i) & 0x01);
}
这里涉及两个操作,向右逐位移位(“&gt;&gt;”)和逐位AND(“&amp;”)。
例如,让我们想象一下我们想要获得数字170的第3位。以下显示如何以二进制操作数字:
(original value of x) 10101010
(after bitwise shift 3) 00010101
(after bitwise and 1) 00000001
有关详细信息,请搜索“按位运算符”或“位掩码”。
要弄清楚为什么你的方法不起作用,最好的方法是通过选择x的值来干燥运行它并像在上面那样处理纸上会发生的事情。乍一看,我觉得你总是在每个循环的剩余部分加4。
当引脚在端口上连续时,您只需将x的值直接分配给端口即可;这就是Bappi所得到的。这是有效的,因为引擎盖下的微控制器将多个引脚值存储在一个寄存器中。
答案 1 :(得分:0)
我假设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
}
}
}