将Arduino系列交换机转换为二进制序列

时间:2015-03-11 21:06:52

标签: arduino

我目前正在开发一个项目,其中有五个开关,具体取决于我希望它能够执行特定任务。我想知道怎么做,如果,比方说,我开关1开(1),开关2:0,开关3:0:开关4:0,开关5:1,那么它会做一个变量等于10001.

感谢任何回答的人!

2 个答案:

答案 0 :(得分:1)

这样的事情会做(免责声明:我没有尝试编译它,但你明白了):

    #define SW_COUNT 5

    uint8_t pins[SW_COUNT] = {2, 3, 4, 5, 6};

    void setup(void) {
      for (uint8_t i = 0; i < SW_COUNT; i++)
        pinMode(pins[i], INPUT);
    }

    void loop(void) {
      uint8_t combined = 0;

      for (uint8_t i = 0; i < SW_COUNT; i++) {
        combined = combined << 1;
        combined |= digitalRead(pins[i]);
      }

      // Now "combined" contains the bitmask you want
    }

答案 1 :(得分:0)

如果你有一些或多或少与Arduino Uno兼容的东西,你可以将你的开关连接到引脚8,9等......然后你可以这样做:

uint8_t combined = PINB & 0x1f;

简单快速,但不便携。

兼容性:Arduino参考中记录了此技术 在页面上 Port Registers。 它不仅适用于Arduino Uno和兼容板,还适用于 所有基于AVR ATmega328和ATmega168芯片的主板,包括 Uno,Mini,Nano,Fio,Pro,以及较旧的Duemilanove和 Diecimila。基于ATmega32U4的板卡(例如Leonardo,Yun,Micro) ATmega2560(Mega 2560和Mega ADK)具有不同的引脚映射: 这项技术仍然可以应用,但您需要选择正确的 引脚和匹配的PINx寄存器。基于ARM的Due有一个完整的 不同的架构因此超出了这种技术的范围。 Teensy 3虽然也是基于ARM的,但它通过AVR支持这一点 仿真。

优点和缺点:这比其他选择快约200倍 循环遍历digitalRead(),因此非常适合时间要求严格 工作。它也是阅读各种输入的唯一方法 同时,是在AVR中读取输入的规范方式 世界。然而,循环digitalRead()是规范的解决方案 在Arduino世界中,因为它适用于整个Arduino家族,并且 基于标准的Arduino功能。循环解决方案应该 然后首选可能被共享的非时间关键代码 与其他Arduino用户可能有不兼容的板(不同 引脚映射或基于ARM的)。