目录
介绍
4×4键盘
键盘用作输入设备,用于读取用户按下的键并进行处理。
4×4键盘由4行和4列组成。开关位于行和列之间。
按键在相应的行和列之间建立连接,在它们之间放置开关。
连接图
连接4×4键盘和MSP-EXP430G2 TI Launchpad
例
读取按下4×4键盘上的按键并将其显示在Energia的串行终端上。
在这里,我们将使用Mark Stanley和Alexander Brevig的键盘库。
库下载:
提取库并将其添加到Energia IDE的库文件夹路径中。
有关如何将自定义库添加到Energia IDE并使用其中的示例的信息,请参阅“基础知识”部分中的“将库添加到Energia IDE”。
将库添加到Energia IDE后,打开IDE并从添加的库中打开CustomKeypad的示例程序。
注意: MSP-EXP430G2 TI Launchpad主板具有512字节的RAM,可轻松上传,尤其是在使用不同库时。有时您需要串行缓冲区足够大以包含所需的数据,并且您必须修改串行库的缓冲区大小。在做这些事情时,我们必须确保代码不会使用超过70%的RAM。这可能导致代码以不稳定的方式工作,有时运行良好并且在其他方面失败。
有些时候RAM使用率可能会超过70%并且代码将完全正常工作,并且即使RAM使用率为65%,代码也无法工作。
在这种情况下,可能需要对缓冲区大小和/或变量进行一些试验和错误。
4×4键盘的程序
/* @file CustomKeypad.pde
|| @version 1.0
|| @author Alexander Brevig
|| @contact alexanderbrevig@gmail.com
||
|| @description
|| | Demonstrates changing the keypad size and key values.
|| #
*/
#include <Keypad.h>
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
{'0','1','2','3'},
{'4','5','6','7'},
{'8','9','A','B'},
{'C','D','E','F'}
};
byte rowPins[ROWS] = {11, 12, 13, 14}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {7, 8, 9, 10}; //connect to the column pinouts of the keypad
//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup(){
Serial.begin(9600);
}
void loop(){
char customKey = customKeypad.getKey();if (customKey){
Serial.println(customKey);
}
}
使用的功能
1. makeKeymap(keys)
- 此函数用于将内部键映射初始化为等于用户定义的键映射(在上面给出的函数语法中,键)。
2. Keypad customKeypad = Keypad( makeKeymap(keys), rowPins, colPins, rows, cols)
- 这定义了类Keypad的对象customKeypad并对其进行初始化。
- rowPins和colPins是MSP-EXP430G2 TI Launchpad板上的引脚,键盘的行和列连接到该引脚。
- rows和cols是键盘具有的行数和列数。
3. customKeypad.getKey()
- 此功能用于识别键盘上按下了哪个键。
注意
byte rowPins[ROWS] = {R1, R2, R3, R4}; / *连接到键盘的行引脚分配* /
byte colPins[COLS] = {C1, C2, C3, C4}; / *连接到键盘的列引出线* /
如果您未根据此功能连接引脚,则按键识别将不会根据您定义的键盘给出结果。
注意事项: Keypad库中包含的示例草图自定义键盘是为Arduino板编写的,因此不应上传到MSP-EXP430G2 TI Launchpad板。这样做可能会出错,甚至可能在某些情况下损坏电路板。更改示例草图中为行和列指定的引脚,如上面的草图所示,并按接口图中所示进行连接。使用串行监视器时,请避免使用MSP-EXP430G2 TI Launchpad板的引脚3(P1_1)和4(P1_2),因为它可能会导致问题(因为串行监视器也使用这些引脚进行通信)。
键盘与MSP-EXP430G2 TI Launchpad的1-Wire接口
上面显示的接口消耗MSP-EXP430G2 TI Launchpad板的8个GPIO引脚。通过使用键盘的1线接口方法,我们可以使用1个GPIO引脚实现与上述相同的结果。
该方法利用简单的分压器概念为每个按下的键产生不同的电压。
让我们看看如何使用单个GPIO引脚将键盘连接到MSP-EXP430G2 TI Launchpad。
连接图
键盘与MSP-EXP430G2 TI Launchpad的1-Wire接口连接
程序
void setup() {
Serial.begin(9600); /* Define baud rate for serial communication */
}
void loop() {
int adc_val;
adc_val = analogRead(A1); /* Read input from keypad */if (adc_val>850)
{
Serial.print("Key Pressed : ");
Serial.println("0");
delay(100);
}else if ( adc_val>450 && adc_val<550)
{
Serial.print("Key Pressed : ");
Serial.println("1");
delay(100);
}else if ( adc_val>330 && adc_val<370)
{
Serial.print("Key Pressed : ");
Serial.println("2");
delay(100);
}else if ( adc_val>260 && adc_val<280)
{
Serial.print("Key Pressed : ");
Serial.println("3");
delay(100);
}else if ( adc_val>190 && adc_val<210)
{
Serial.print("Key Pressed : ");
Serial.println("4");
delay(100);
}else if ( adc_val>165 && adc_val<185)
{
Serial.print("Key Pressed : ");
Serial.println("5");
delay(100);
}else if ( adc_val>148 && adc_val<164)
{
Serial.print("Key Pressed : ");
Serial.println("6");
delay(100);
}else if ( adc_val>132 && adc_val<147)
{
Serial.print("Key Pressed : ");
Serial.println("7");
delay(100);
}else if ( adc_val>=121 && adc_val<=131)
{
Serial.print("Key Pressed : ");
Serial.println("8");
delay(100);
}else if ( adc_val>=115 && adc_val<=120)
{
Serial.print("Key Pressed : ");
Serial.println("9");
delay(100);
}else if ( adc_val>=107 && adc_val<=113)
{
Serial.print("Key Pressed : ");
Serial.println("A");
delay(100);
}else if ( adc_val>=100 && adc_val<=106)
{
Serial.print("Key Pressed : ");
Serial.println("B");
delay(100);
}else if ( adc_val>=95 && adc_val<=99)
{
Serial.print("Key Pressed : ");
Serial.println("C");
delay(100);
}else if ( adc_val>=90 && adc_val<=94)
{
Serial.print("Key Pressed : ");
Serial.println("D");
delay(100);
}else if ( adc_val>=87 && adc_val<=89)
余下程序:
注意事项: 实际上已经找到了用于决定按键的ADC值。您可能需要实际查找ADC值。已经找到了接口图中所示的电阻器组合的这些值。如果使用其他电阻值,则上述代码将给出错误输出。如果您决定使用其他电阻值,则必须找出每次按键的ADC值,并在代码中进行相应的更改。