Arduino 提供意外信号的4x4薄膜键盘
我正在做一个项目,我试图为一个薄膜键盘编写我自己的功能。我希望16个键状态存储在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
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.
}
}
如果所有键都未按下,则输入不会连接到任何对象。它们只是“漂浮在空中”,可以接受来自外部的任何电干扰 键盘应该以其他方式工作
DDRB&=0xF0;端口B |=0x0F
。那么现在所有的输入都应该读为逻辑1,例如1111
1110、1101、1011、0111
~
),可以反转读取的数字,例如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
-----------------------