This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TCA8418:TCA8418

Guru**** 2386610 points
Other Parts Discussed in Thread: TCA8418
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1256646/tca8418-tca8418

器件型号:TCA8418

您好,

我希望您能做得好。我开发了新的电路板、发现了上一版本的问题。 不是硬件/软件问题、而是键盘本身。 我们制造了新的键盘,这一问题得到了解决。
现在我需要您提供有关一个键的帮助。 我想模拟按键的过程与键盘一样。 例如、如果我按向上键、则继续向上翻页。
如何使用 TCA8418做到这一点? 得到一个按压输出没有问题、但我希望在按键长按时得到持续的输出。

谢谢


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    TCA8418没有按键重复功能。

    您必须监控密钥释放事件并在软件中实施重复计时器。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的答复。
    任何其他可以支持 Continue 函数的 IC。 TCA8418所做的一切都很完美、除了4个按键之外、我还需要继续执行按键功能。 我试图在编程中做到这一点、但无法做到。 也许有人可以帮助我修复编程,否则,建议我一些其他 IC 可以支持完整的键盘功能。
    目前、通过使用 TCA8418、我不需要所有键盘功能、除非箭头键功能以某种方式实现。
    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    我有一个想法,如果你能确认我。

    1. 按键
    2. 即使发生
    3. 继续按键时执行功能
    4. 键释放
    5. 清除标志和中断

    当按下和松开两个按键时、是否可能产生均匀的脉冲?

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ali、

    正如 Clemens 提到的,这款设备没有重复按键功能或长按键功能,不能模仿按键盘上"UP"键的情况。 这需要在软件中完成。  

    至于我们产品系列中的其他 IC、我们不提供具有该特定功能的 I2C 键盘扫描仪。  

    我有一个想法,如果你能确认我。

    1. 按键
    2. 即使发生
    3. 继续按键时执行功能
    4. 键释放
    5. 清除标志和中断

    当按下和松开两个按键时、是否可能产生均匀的脉冲?

    [/报价]

    我知道此器件可以生成一个用于按键和释放按键的按键事件、但不知道第3点的功能。  

    从软件的角度来看、我可能会从循环的角度来处理此问题、即:  

    1.按键

    2.事件发生

    3.触发一个环路来检查此按键事件的电压。 如果电压仍然低、则继续循环功能(即、如果"UP"键将输入保持在低电压(按键)、则保持向上滚动)

    4.钥匙释放

    5.事件发生-停止 for 循环  

    6.清除标志和中断。  

    这可能是一种处理编码问题的可能方法。 如果您可以从键盘上的某个引脚读取代码的电压、这可能有助于您通过连续按键解决问题。

    此致、

    泰勒

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    是的、这就是我第3点的意思。
    您能否告诉我在进行位设置的情况下、哪个寄存器负责生成按压和释放事件?
    我是否应该读取中断引脚的电压、因为除了 I2C 之外、该引脚是与 MCU 连接的唯一引脚?

    谢谢
    这是在按下任何键时打印事件表位置的代码、但仅在按下时打印、而不是释放。


    // Arduino I2C Library
    #include <Wire.h>
    
    // Keyboard Constants
    #define KEYBOARD_ADDRESS 0x34
    #define KEYBOARD_INT_PIN 1
    #define KEYBOARD_EVENT_REGISTER 0x04
    #define KEYBOARD_FLAG_REGISTER 0x02
    #define KEYBOARD_KEY_DOWN 0x80
    #define KEYBOARD_KEY_MASK 0x7F
    
    // Debounce Constants
    #define DEBOUNCE_DELAY 50 // Adjust this delay as needed
    
    // Configuration commands (configures the 3x9 matrix as inputs with pull-ups, interrupts, etc.)
    // For more information, refer to the code in the repository linked above
    const uint8_t KEYBOARD_CONFIG_COMMANDS[] = {
      0x1D, 0x07,
      0x1E, 0xFF,
      0x1F, 0x03,
      0x01, 0xB9,
      0x02, 0x1F
    };
    
    // Define our functions before use
    void keyboard_configure();
    void keyboard_clearFlag();
    uint8_t keyboard_getState();
    
    // Debounce variables
    uint8_t lastKeyCode = 0;
    unsigned long lastKeyPressTime = 0;
    
    // keyInt allows our event to ultimately be handled in the loop
    volatile bool keyInt = false;
    
    void setup() {
      Serial.begin(9600);
      Wire.begin();
      keyboard_configure();
      pinMode(KEYBOARD_INT_PIN, INPUT); // There is an external pull-up on the pin
    
      // Set up a falling edge pin interrupt on pin 1  
      attachInterrupt(digitalPinToInterrupt(KEYBOARD_INT_PIN), keyboard_ISR, FALLING); 
    }
    
    void loop() {
      if (keyInt) {
        uint8_t key_code = keyboard_getState(); // Get first keycode from FIFO
        if(key_code & KEYBOARD_KEY_DOWN) 
        {
    
          Serial.print(key_code & KEYBOARD_KEY_MASK);
          Serial.println(",");
        }
    
        keyboard_clearFlag();
        keyInt = false;
      }
    
      delay(10);
    }
    
    // WRITING I2C SLAVE
    void keyboard_configure() {
      for (uint8_t i = 0; i < 7; i += 2) {
        Wire.beginTransmission(KEYBOARD_ADDRESS);
        Wire.write(KEYBOARD_CONFIG_COMMANDS[i]);
        Wire.write(KEYBOARD_CONFIG_COMMANDS[i + 1]);
        Wire.endTransmission();
      }
    }
    
    // READING I2C SLAVE
    uint8_t keyboard_getState() {
      uint8_t key;
      Wire.beginTransmission(KEYBOARD_ADDRESS);
      Wire.write(KEYBOARD_EVENT_REGISTER);
      Wire.endTransmission();
      Wire.requestFrom(KEYBOARD_ADDRESS, 1); // request 1 byte from slave device 0x34
      while (Wire.available()) {
        // Slave may send less than requested
        key = Wire.read(); // Receive a byte as character
      }
      return key;
    }
    
    void keyboard_clearFlag() {
      Wire.beginTransmission(KEYBOARD_ADDRESS);
      Wire.write(KEYBOARD_FLAG_REGISTER); // Interrupt Status Register
      Wire.write(0x1F);
      Wire.endTransmission();
    }
    
    void keyboard_ISR() {
      keyInt = true;
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ali、

    数据表的第16页有一个部分介绍了如何处理 FIFO 中的关键事件。  

    在说明的第2点和第3点中、您可以看到 FIFO 中当前的事件数存储在 KEY_LCK_EC 寄存器0x03中。  

    为了解析每个事件、读取 KEY_EVENT_A (0x04)寄存器。 第7位表示钥匙是否被释放(0)或按下(1)。 位6 - 0说明了根据按键事件表按下哪个按键。  

    由于只有当 FIFO 中有事件时才设置中断、所以读取中断电压会有问题。 当 FIFO 完全被读取后、中断引脚变为无效。  

    在我们尝试完成的应用程序中、按住 TCA8418上的某个 KEY 只会注册一个事件。 这就是我建议直接读取引脚电压的原因、因为这将在 TCA8418外部给出一个指示器、指示您正在按下一个键。  

    您或许可以通过如下方法来判断接近软件是否持有了密钥:

    1.读取 KEY_EVENT_A (0x04)

    2.读取数据的第7位-检查按键是否释放(0)或按键(1)

    3. 等待(时间)

    4.如果按键= 1、则重新读取 KEY_EVENT_A、查看是否有其他按键事件(即释放按键)进入 FIFO

    5.如果没有按键事件显示释放,那么我们就知道按钮被按住了。 提供连续的功能、直到读取 KEY_EVENT_A 寄存器显示被保持的密钥读取了释放事件。  

    此致、

    泰勒

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好, 

    是的、我做了同样的事情、而且工作正常。
    感谢您的全力帮助。
    现在、它是一个连续的关键函数。