Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino 提供意外信号的4x4薄膜键盘_Arduino_Keypad_Multiplexing - Fatal编程技术网

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

Arduino 提供意外信号的4x4薄膜键盘,arduino,keypad,multiplexing,Arduino,Keypad,Multiplexing,我正在做一个项目,我试图为一个薄膜键盘编写我自己的功能。我希望16个键状态存储在uint16\t变量中,因此我只有一个变量。代码可以编译 问题是它无法正确显示关键状态。当我按下1键时,它会告诉我更多的键被按下。它还将显示按键被按下时根本没有触摸物体 小键盘的针脚5-8连接至端口D,Nano上的针脚4-7。 键盘的针脚1-4连接至端口B,Nano上的针脚0-3 这是代码 uint16_t keys = 0; void setup() { // put your setup code her

我正在做一个项目,我试图为一个薄膜键盘编写我自己的功能。我希望16个键状态存储在
uint16\t
变量中,因此我只有一个变量。代码可以编译

问题是它无法正确显示关键状态。当我按下1键时,它会告诉我更多的键被按下。它还将显示按键被按下时根本没有触摸物体

小键盘的针脚5-8连接至端口D,Nano上的针脚4-7。 键盘的针脚1-4连接至端口B,Nano上的针脚0-3

这是代码

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.
  }
}

如果所有键都未按下,则输入不会连接到任何对象。它们只是“漂浮在空中”,可以接受来自外部的任何电干扰

键盘应该以其他方式工作

  • 在输入引脚(PINB)上,打开上拉电阻器
    DDRB&=0xF0;端口B |=0x0F
    。那么现在所有的输入都应该读为逻辑1,例如
    1111

  • 在输出引脚(端口D)上,为所有行提供高电平(逻辑1),但要测量的行除外(这应该是低电平-逻辑0),例如
    1110、1101、1011、0111

  • 然后,您可以将按下的键读取为输入引脚(PINB)上的逻辑0。之后,如果需要(按位NOT运算符
    ~
    ),可以反转读取的数字,例如
    temp=PINB;temp~=temp;temp&=0x0F
    或只是
    temp=(~PINB)&0x0F


  • 同样,你可以在输出前使用bitwise NOT Operator,例如,
    PORTD=(~(16)谢谢,这很有效。我有什么办法可以让以后查看的人更清楚地看到帖子吗?@oedze我不知道你的意思。我的帖子还是你的帖子?我的解释不清楚吗?我不想发布“准备使用”的帖子代码,因为我更喜欢解释因果关系,这可以帮助人们做出自己的结论并获得知识。你的帖子对我来说没问题。抱歉我的英语不好。我是指我自己的帖子。你清楚地解释了为什么引脚会浮动,我只是完全忘记了效果,我不知道你在Ardui中构建了上拉电阻器不,谢谢!
    
    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
    -----------------------