我目前正在开发一个项目,其中有五个开关,具体取决于我希望它能够执行特定任务。我想知道怎么做,如果,比方说,我开关1开(1),开关2:0,开关3:0:开关4:0,开关5:1,那么它会做一个变量等于10001.
感谢任何回答的人!
答案 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的)。