【问题标题】:Rotate bits (8 bits) in C with arduino用arduino在C中旋转位(8位)
【发布时间】:2016-01-30 06:04:21
【问题描述】:

我正在做一个学校项目,我使用串行 8 个 DIP 开关点亮 8 个数字 LED。我在我的 Arduino 上使用一个盾牌来按下一个按钮,让我的屏幕上的位切换。例如,用户点击第一个 DIP 开关和第二个。然后第一个 LED 和第二个 LED 将亮起。之后,我按下盾牌上的一个按钮,位开始移动到它们所在的位置。

我的问题是,当它们到达它们在切换方向上遇到的最后一个位时,我怎样才能使这些位恢复到它们的原始值。就像位的旋转。

旋转示例:用户点亮第一个和第三个 LED,当同一用户按下按钮时它们开始切换。然后,当第二个 LED 到达第 0 位时,它会回到第 7 位,而第一个 LED 仍处于第 1 位等...

byte G;
byte A = 0b00000001;
char data,newData; `

void modeRotationGauche(void) 
{
    G = (data);
    while (digitalRead(KEY_2) == LOW)
    {
        if ( G == 0)
        {
            G = data;
        }
   
        G = G >> 1;
        delay(200);
        Serial.write(G);
        G = G >> 1;
        delay(200);
        Serial.write(G);
        G = G >> 1;
        delay(200);
        Serial.write(G);
        G = G >> 1;
        delay(200);
        Serial.write(G);
    }

用户切换拨码时正在读取数据,然后打印值

G 用于切换位,如果 G = 0 则返回原始数据值。

但我想要的是让它们旋转而不是让它们传送到原始值。我需要使用 if 函数来完成这项挑战。

【问题讨论】:

  • 对不起,我不能很好地理解这个问题。无论如何,如果您只需要一个旋转功能,您可以执行G = ((byte)G >> 1) | ((G&1)?0x80:0); 之类的操作。这样,您将移动旧值,然后如果设置了最低位,则添加最高位。注意:这是一个 8 位变量!如果您需要更大的,则必须编辑 0x80 值

标签: c arduino bit-manipulation


【解决方案1】:

此函数将value 向右旋转amount 位并返回旋转后的值。 (8byte 类型的大小,以位为单位)

byte rotateRight(byte value, int amount) {
    return (value >> amount) | (value << (8 - amount));
}

G = G &gt;&gt; 1; 替换为G = rotateRight(G, 1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多