-1

我是使用 Arduino 和 Teensy 3.2 板并将其编程为 USB 键盘的初学者。我有两个 4 按钮薄膜开关。它们的按钮触点位于引脚 1-8 上,第 9 个引脚将两个薄膜开关的“接地”线焊接在一起,或者任何它的真实名称;完成电路的线路。

基本上,当您按下按钮时,它们应该分别简单地键入“a,b,c ...”。我被告知我需要为此使用矩阵。

我正在寻找一个如何编写有效支持单行/9 列行(反之亦然?)的键盘矩阵的示例,我一直无法在线找到该解决方案。

到目前为止,我所拥有的只是这段代码,当按下第二个引脚上的按钮时,会发送大量的“AAAAAAAAAAAAAAAA”击键。

void setup() {
  // make pin 2 an input and turn on the 
  // pullup resistor so it goes high unless
  // connected to ground:
  pinMode(2, INPUT_PULLUP);
  Keyboard.begin();
}

void loop() {
  //if the button is pressed
  if(digitalRead(2)==LOW){
    //Send an ASCII 'A', 
    Keyboard.write(65);
  }
}

有人能帮忙吗?

4

1 回答 1

3

首先,1 行键盘不是矩阵。或者更好的是,从技术上讲,它可以被认为是一个矩阵,但是......矩阵键盘是这样的:

矩阵键盘示意图

你看?为了扫描这个,你必须

  1. 将第 1 行拉到地面,同时使第 2-4 行悬空
  2. 读取 Col1-4 的值。这些是开关 1-4 的值
  3. 将第 2 行拉到地面,同时使第 1 行和第 3-4 行悬空
  4. 读取 Col1-4 的值。这些是开关 5-8 的值

依此类推,对于所有行

至于另一个问题,当按钮保持在低位时,您正在打印 A。您想要实现的是仅在引脚的下降沿打印 A(理想情况下每次压力一次),所以

char currValue = digitalRead(2);
if((currValue==LOW) && (oldValue==HIGH))
{
    //Send an ASCII 'A', 
    Keyboard.write(65);
}
oldValue = currValue;

当然,您需要oldValue在函数外部声明并在 main 中将其loop初始化。HIGH

使用此代码,您不会收到大量的“A”,但是每次按下按钮时,您都会看到类似 5-10 的“A”。为什么?因为按钮的弹跳。这就是去抖动技术的用途!

我建议您查看该类Bounce2,以便为您的按钮获得一个易于使用的类。如果您更喜欢一些代码,我为另一个问题编写了这个小代码:

#define CHECK_EVERY_MS 20
#define MIN_STABLE_VALS 5

unsigned long previousMillis;
char stableVals;
char buttonPressed;

...

void  loop() {
    if ((millis() - previousMillis) > CHECK_EVERY_MS)
    {
        previousMillis += CHECK_EVERY_MS;
        if (digitalRead(2) != buttonPressed)
        {
            stableVals++;
            if (stableVals >= MIN_STABLE_VALS)
            {
                buttonPressed = !buttonPressed;
                stableVals = 0;

                if (buttonPressed)
                {
                    //Send an ASCII 'A', 
                    Keyboard.write(65);
                }
            }
        }
        else
            stableVals = 0;
    }
}

在这种情况下,不需要检查先前的值,因为该函数仅在状态更改时才到达某个点。

但是,如果您必须将其用于更多按钮,则必须复制整个代码(并且还要使用更多stableVals变量)。这就是为什么我建议你使用这个Bounce2类(它做了类似的事情,但是,因为它都被包裹在一个类中,你不需要担心变量)。

于 2015-10-28T23:21:35.273 回答