最近在玩一些关于树莓派配件的东西,有一个需求是从外部接入一个数字键盘,通过不同数字信号下发不同任务。

网上大部分的程序都是通过python的RPi.GPIO实现的,但是由于我跟外部机的通信是通过C++程序实现的,所以我用的是wiringPi库。数字键盘的原理很简单,就是把按键当成一个开关,当按键按下的时候即为导通。

实现方法
我们可以把列或者是行变成输出,然后把另外一边设置成输入,在循环内把某一行设置成高点平,判断所有接收是否有变成高点平的,在小循环结束时置为低电平。把数字跟二维数组里面的数字对应起来就可以了。(说到这里,C++的二维数组好奇怪,a[3][4]居然是4列三行。所以注意我这里用的是a[j][i]。
#include"wiringPi.h"
#include <iostream>
int main()
{
std::string a1[4][3]={"1","2","3","4","5","6","7","8","9","*","0","#"};
int raw[4]={1,28,23,24};
int column[3]={25,26,27};
wiringPiSetup();
for(int i=0;i<4;i++)
{pinMode(raw[i],INPUT);
digitalWrite(raw[i],LOW);}
for(int j=0;j<3;j++)
{pinMode(column[j],OUTPUT);
digitalWrite(column[j],LOW);}
while(1)
{
for(int i=0;i<3;i++)
{digitalWrite(column[i],HIGH);
for(int j=0;j<4;j++)
{
if(digitalRead(raw[j])==1)
{std::cout<<i<<":"<<j<<std::endl;
std::cout<<a1[j][i]<<std::endl;}
}
digitalWrite(column[i],LOW);
}
delay(500);
}
return 0;
}
注意事项
我用的是树莓派3B,在GPIO口的21和22这里有标注它的V是1,一开始我还不太理解是什么意思,直到我把两个INPUT口设置在这里的时候,才发现它不管设置什么,digitalRead出来的值都是1。因此大家在使用这两个口的时候要十分注意,我至今也没发现什么方法能把它置为0,如果有了解的朋友可以在评论区跟我说一下。
网友评论