0

uint8_t当我按下 Arduino 盾牌上的按钮时,我正在尝试检查类型的相等性 。我知道类型是无符号整数,但是即使我得到 print 语句,代码也永远不会进入 if 语句"Button pressed: 0"有人能告诉我为什么吗?

#include <MFShield.h>

MFShield mfs ;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  mfs.onKeyPress( [](uint8_t button){
    if (button == 0 || button == 0x00 || button == '0')
    {
      Serial.println("working");
    }
    Serial.println("Button pressed: " + String(button)); 
  });
}

void loop() {
  mfs.loop();
} 
4

1 回答 1

1

正如评论中已经提到的

button == 0并且button == 0x00是一回事。所以可以省略一个。 button == '0'没有'0'意义48。这在你的程序中永远不会是真的。

从我在 MFShield 库源代码的源代码中看到的,描述的行为应该是不可能的。

// Keys polling
    if (onKeyPress_func != NULL && time - t_buttons >= MFS_BUTTONS_POLLING_INTERVAL_MS)
    {
        t_buttons = time;
        uint8_t key_mask = 0;
        for (uint8_t i=0; i < 3; i++)
            key_mask |= (!digitalRead(KEY_PIN[i]) << i);

        if (key_mask != key_mask_pre)
        {
            if (key_mask != 0)
            {
                key_mask_pre = key_mask;
                onKeyPress_func (ffs(key_mask));
            }
            else
                key_mask_pre = 0;
        }
    }

该代码检查所有 3 个按钮,并为每个按下的按钮在 key_mask 中设置一个位。

onKeyPress_func您提供的回调函数仅在key_mask不等于 0 并且自上次检查后键状态发生更改时才会调用。

因此,使用此代码,您永远不会像您声称的那样打印“按下按钮:0”。你button不能成为0。出于同样的原因,您永远不会输入 if 语句。

于 2019-04-05T19:33:17.917 回答