有的时候我会用到很多数量的按键,而IO数量比较稀缺,那就要用到扫描按键了。
扫描按键就是将IO采用行列交叉的接法,每个交叉点放置一个按键,然后采用逐行(列)扫描的方式获取按键的值。
原理图如下:
这是一个常见的3*3的扫描按键原理图,共占用了6个IO,3行3列(行列可以自己随意来定)。
它的基本工作原理是这样的:
XIO_0,XIO_1,XIO_2被上拉到+5V,这三个IO作为输入端,YIO_0,YIO_1,YIO_2三个IO作为输出端;
将三路输出依次置为低电平,然后读取三路输入端的值,如果按键没有被按下,由于上拉电阻的存在,读数值一定是高(1);
如果按键被按下,输入端与输出端连接到低电平(一般是GND),这时,读数值就是低(0);
代码实现如下:
int getKey()
{
int XIO_iN[3]={XIO_0,XIO_1,XIO_2};//
int YIO_OUT[3]={YIO_0,YIO_1,YIO_2};
int KEY_VALUE[9]={0,1,2,3,4,5,6,7,8};
int i,j;
int k;
for(i=0;i<3;i++)
{
digitalWrite(YIO_OUT[i],0);//将输出端置底(0)
for(j=0;j<3;j++)
{
k= digitalRead(XIO_iN[j]); //读取输入端
if(k==0) //读数值为0,表示按键被按下
{
digitalWrite(YIO_OUT[i],1);//输出端置高(1),以免影响下一次读取
return KEY_VALUE[i*3+j];//返回按键的位置
}
}
digitalWrite(YIO_OUT[i],1);//输出端置高(1),以免影响下一次读取
}
}
这是扫描按键的基本思路,ARDUINO有一个专门的库实现了这个软件功能,就是Arduino Keypad键盘库(http://playground.arduino.cc//Code/Keypad)使用起来很方便。
下面是利用该库的一段代码(大家先熟悉一下,有机会结合实际硬件再来和大家一起讨论):
#include
constbyte ROWS = 4; // Four rows
const byte COLS = 4; // Four columns
//Definethe keymap
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
////Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduinopins.
byte rowPins[ROWS] = {6,7,8,9};
//Connect keypad COL0, COL1, COL2 and COL3 to these Arduinopins.
byte colPins[COLS] = {2,3,4,5};//connect to column pinouts
//Create the Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS,COLS );
voidsetup(){
Serial.begin(9600);
}
voidloop(){
char key =keypad.getKey();
if (key != NO_KEY){
Serial.println(key);
}
}