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

  显示原文与译文双语对照的内容
0 0

我目前正在研究一个项目,它的中有五个开关,并且根据需要进行特定的任务。 我想知道如果,如果,我有 switch 1在( 1 ),switch 2: 0,switch 3: 0: switch 4: 0,switch 5: 1,然后它将变量等于 10001.

感谢任何回答 !

时间:原作者:2个回答

0 0

这样做将执行以下操作( 免责声明: 我没有尝试编译它,但你得到了以下想法:

 #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
 }
原作者:
0 0

如果你有更多或者更少兼容 Arduino Uno,你将交换机连接到引脚 8,9,等等 。 "。"。然后你就可以以做到:

uint8_t combined = PINB & 0x1f;

简单而快速,但不可移植。

这项技术在页面端口寄存器的Arduino参考中记录了 产品不仅适用于Arduino和兼容板,而且适用于所有基于 AVR ATmega328和ATmega168芯片的板,包括 Uno 。Mini 。Nano 。Fio 。Pro和旧的Duemilanove和 Diecimila 。 基于ATmega32U4的板( 比如 。 Leonardo,Yun,Micro ) 和 ATmega2560 ( 超大型 2560和超大型 rtc ) 具有不同的引脚映射: 技术仍然可以应用,但你需要选择正确的pin和匹配的PINx register 。 基于arm的Due具有完全不同的体系结构,因此超出了该技术的范围。 虽然 Teensy 3也是 arm,但通过AVR仿真支持它。

:::: 这比 digitalRead()的替代循环快 200倍,因这里适合于时间关键工作。 同时,它也是读取各种输入信息的唯一途径,也是在AVR世界中阅读输入的标准方式。 但是,在 digitalRead() 环境中,循环是一个规范的解决方案,因为它是基于标准的rtc函数。 然后,循环解决方案应该是non-time-critical代码的首选,它可以能与可以能具有不兼容的板( 不同的引脚映射或者基于arm的) 共享。

原作者:
...