微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Arduino HID 项目键盘阵列

如何解决Arduino HID 项目键盘阵列

我目前正在尝试为我正在构建的键盘编写代码,但我在一个特定问题上遇到了很多麻烦。我需要为他们的键盘编写一个数组,但它不能像我期望的那样工作。当我在 Keyboard.press 函数中使用修饰键时,修饰键起作用,但由于某种原因从 Keyboard.press 函数中的数组调用它们时不起作用。例如,如果我执行 Keyboard.press(KEY_SPACE) 它工作正常,但 Keyboard.press(keys[0][0]) 输出,出于某种原因,即使 keys[0][0] = KEY_SPACE.问题是 J 和 K 工作正常,特别是格式化为 KEY_ 的那些工作不正常

我使用的是 Nicohood 的 HID 项目库。当我使用标准的 arduino 键盘库时,它工作正常,只是我需要使用 HID 项目库。

#include <HID-Project.h>
#include <HID-Settings.h>



#include <Adafruit_MCP23017.h>

Adafruit_MCP23017 mcp;
byte inputs[] = {4,5,6,7,8,9};
const int inCount = sizeof(inputs)/sizeof(inputs[0]);
byte outputs[] = {0,1,2,3,4,9,10,11,12,13,14};
const int outCount = sizeof(outputs)/sizeof(outputs[0]);

char keys[2][2] = {
  {KEY_SPACE,'j'},{'k',KEY_LEFT_SHIFT}
  };

bool keysDown[2][2] = {
  {false,false},{false,false}
};

void setup() {
  // put your setup code here,to run once:
  
  mcp.begin();
  for(int i=0; i<outCount; i++){    //declaring all the outputs and setting them high
    mcp.pinMode(outputs[i],OUTPUT);
    mcp.digitalWrite(outputs[i],LOW);
  }
  for(int i=0; i<inCount; i++){     //declaring all the inputs and activating the internal pullup resistor
    pinMode(inputs[i],INPUT_PULLUP);
  }
  Serial.begin(9600);
  Keyboard.begin();
}


  
void loop() {
  // put your main code here,to run repeatedly:
  keyCheck();
  

}

void keyCheck()
{
  for (int i=0; i<2; i++){
    mcp.digitalWrite(outputs[i],LOW);
    for (int j=0; j<2; j++)
    {
      if(digitalRead(inputs[j]) == LOW && keysDown[i][j] == false)
      {      
        Serial.print("Row: ");
        Serial.print(i);
        Serial.println();
        Serial.print("Col: ");
        Serial.print(j);
        Serial.println();
        Serial.print(keys[i][j]);
        Serial.println();
        Keyboard.press(keys[i][j]);
        Serial.println();
        keysDown[i][j] = true;
        Serial.print("KeysDown set to true");
        Serial.println();
      }else if(digitalRead(inputs[j]) == HIGH && keysDown[i][j] == true)
      {
        Serial.print("keysdown set to false");
        Serial.println();
        Keyboard.release(keys[i][j]);
        keysDown[i][j] = false;
      }
      delay(1);
    }
    mcp.digitalWrite(outputs[i],HIGH);
  }
}

非常感谢任何帮助。一个多月以来,我一直在努力解决这个问题,当其他一切都完成时,这真的很令人沮丧,只是这个特定问题阻碍了整个项目。感谢您抽出宝贵时间。

解决方法

我怀疑你可能被你的调试输出格式欺骗了。

KEY_SPACE 常量的值为十进制 44(十六进制 2C),它是逗号的 ASCII 代码点。您正在通过 Serial 类将此值写入终端,因此您会看到一个逗号。然后您通过 Keyboard 类再次发送它,该类尽职尽责地显示(不可见)空间。

我用来避免这种混淆的约定是始终使用开始/结束标记将调试输出中的变量内容括起来 - 例如,printf("row <%d> col <%d> char <%s>",i,j,key[i,j]) ... 或类似的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。