0°

(十五)msp430进阶:4×4键盘与MSP-EXP430G2 TI Launchpad连接

介绍

(十五)msp430进阶:4x4键盘与MSP-EXP430G2 TI Launchpad连接

4×4键盘

键盘用作输入设备,用于读取用户按下的键并进行处理。

4×4键盘由4行和4列组成。开关位于行和列之间。

按键在相应的行和列之间建立连接,在它们之间放置开关。

 

连接图

(十五)msp430进阶:4x4键盘与MSP-EXP430G2 TI Launchpad连接

连接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并对其进行初始化。
  • rowPinscolPins是MSP-EXP430G2 TI Launchpad板上的引脚,键盘的行和列连接到该引脚。
  • rowscols是键盘具有的行数和列数。

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。

 

连接图

(十五)msp430进阶:4x4键盘与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值,并在代码中进行相应的更改。

程序下载

限制以下用户组阅读此隐藏内容

请先登录

您的用户组:
「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论