4x4薄膜键盘提供意外信号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4x4薄膜键盘提供意外信号相关的知识,希望对你有一定的参考价值。

我正在开发一个项目,我尝试为薄膜键盘编写自己的功能。我希望16个关键状态存储在uint16_t变量中,所以我只有一个变量。代码编译。

问题是它无法正确显示关键状态。当我按下1键时,它会告诉我正在按下更多按键。它还会显示正在按下键而不触及任何东西。

键盘的引脚5-8连接到PORTS,Nano上的引脚4-7。键盘的引脚1-4连接到PORT B,Nano上的引脚0-3。

Keypad [PDF]

这是代码。

uint16_t keys = 0;

void setup() {
  // put your setup code here, to run once:
  DDRD |= 0xF0; //Set bit 4-7 as output on PORTD
  DDRB &= 0xF0; //Set bit 0-3 as input on PORTB
  Serial.begin(9600); 
}

void loop() {
  getKeys(&keys);
  Serial.println("-----------------------");
  delay(100);
}

void getKeys(uint16_t* keys){
  *keys = 0; //Clear keys variable
  for(int rows = 0; rows < 4; rows++){ //Loop through every row

    PORTD &= 0x0F; //Turn pin 4-7 on PORTD off 
    PORTD |= (16 << rows); //Turn on pin.
    Serial.print(String(PORTD) + String(" : ")); //Print current selected bit(row)
    uint16_t temp = (PINB & 0x000F); //Take bit 0-3 from PORTB
    Serial.println(temp, BIN); //Print the PINB values as binary
    *keys |= (temp << (rows*4)); //Shift the PORTB values into keys.
  }
}

这是串行监视器中的输出。

16 : 0
32 : 0
64 : 0
128 : 0
-----------------------
16 : 0
32 : 0
64 : 0
128 : 1
-----------------------
16 : 0
32 : 0
64 : 0
128 : 11
-----------------------
16 : 0
32 : 1000
64 : 10
128 : 1111
-----------------------
16 : 1000
32 : 1110
64 : 1110 
128 : 1111
-----------------------
16 : 1000
32 : 1110
64 : 1110
128 : 1111
-----------------------
16 : 0
32 : 0
64 : 0
128 : 0
-----------------------
16 : 0
32 : 0
64 : 0
128 : 0
-----------------------
答案

当你没有按下所有键时,你的输入都没有连接到任何东西。它们只是“漂浮在空中”并且可以从外部受到任何电气干扰。

键盘应该以其他方式工作。

  1. 在输入引脚(PINB)上,打开上拉电阻DDRB &= 0xF0; PORTB |= 0x0F。那么你现在输入的所有内容都应该读作逻辑1,例如。 1111
  2. 在输出引脚(PORTS)上为所有行提供高电平(逻辑1),除了你要测量的那一行(这应该是低电平 - 逻辑0),例如, qazxsw poi。
  3. 然后,您可以在输入引脚(PINB)上读取按下的键作为LOGICAL 0。之后,如果需要,可以反转读取的数字(按位NOT运算符1110, 1101, 1011, 0111),例如: ~或只是temp = PINB; temp ~= temp; temp &= 0x0F

与输出前使用按位NOT运算符的方法相同,例如qazxsw poi。

这样,当您在PORTD的输出引脚上设置逻辑0时,PINB上的输入将始终连接到某个源 - 通过AVR芯片内部的上拉电阻连接到VCC(+ 5V)或连接到GND。而且你不会收到任何电气噪音。

以上是关于4x4薄膜键盘提供意外信号的主要内容,如果未能解决你的问题,请参考以下文章

51单片机4x4矩阵键盘扫描+数码管显示

Proteus仿真Arduino UNO +74C922键盘解码驱动4X4矩阵键盘

如何使用 4x4 键盘将多位整数输入 Arduino?

Proteus仿真Arduino UNO+数码管显示4x4键盘矩阵按键

51单片机4x4矩阵键盘扫描+数码管显示

使用树莓派 3 从 4x4 键盘读取多个数字