如何解决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 举报,一经查实,本站将立刻删除。