首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >4x4膜键盘发出意想不到的信号

4x4膜键盘发出意想不到的信号
EN

Stack Overflow用户
提问于 2017-12-11 14:10:12
回答 1查看 207关注 0票数 1

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

问题是它不能正确地显示关键状态。当我按下1键时,它会告诉我更多的按键被按下。它还会显示按键被按下,根本不碰东西。

键盘的5-8引脚连接到PORTD,4-7销连接在Nano上.键盘上的引脚1-4连接到PORTB,在Nano上有0-3引脚.

键盘[PDF]

这是密码。

代码语言:javascript
运行
复制
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.
  }
}

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

代码语言:javascript
运行
复制
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
-----------------------
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-12 03:34:57

当所有键都没有按下时,您的输入就不会连接到任何东西。它们只是“漂浮在空中”,可以接受外界的任何电力干扰。

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

  1. 在输入引脚(PINB)上,打开拉起电阻DDRB &= 0xF0; PORTB |= 0x0F.那么,现在所有的输入都应该读为逻辑1,例如。1111
  2. 在输出引脚(PORTD)上,向所有行提供高级别(逻辑1),但要测量的行除外(这应该是低逻辑0),例如1110, 1101, 1011, 0111
  3. 然后,您可以在输入引脚上将按下的键读取为逻辑0 (PINB)。在此之后,如果需要(按位而不是操作符~),您可以反转读取数字,例如temp = PINB; temp ~= temp; temp &= 0x0F或仅temp = (~PINB) & 0x0F

同样的方式,你可以在输出前使用按位而不是运算器,例如PORTD = (~(16 << rows)) & 0x0F

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47754751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档