12 de novembro de 2017

Teclado Matricial

Função para ler um teclado matricial e retornar a tecla pressionada.


A ligação interna do teclado, por padrão é como na imagem acima.

Nos terminais temos a ligação das linhas seguido das ligações das colunas.
Esse é um teclado 4x3, e para utilizar um modelo 4x4, é só atualizar os valores das variáveis na função Keypad(), e teríamos a conexão P8 - quarta coluna - nos terminais do teclado.

Esquema de ligação:

Código fonte:
/*---------------------------------------------------------
  Programa : TECLADO MATRICIAL
  Autor    : Fellipe Couto [ http://www.efeitonerd.com.br ]
  Data     : 12/11/2017
  ---------------------------------------------------------*/

/*--- SETUP ---*/
void setup() {
  Serial.begin(9600); //Inicia a comunicação serial
}

/*--- LOOP PRINCIPAL ---*/
void loop() {
  String key = Keypad(); //Retorna o valor da tecla pressionada na variável key
  if (key != "") {
    Serial.println("Tecla pressionada: " + key);
  }
}

/*--- RETORNA A TECLA PRESSIONADA NO TECLADO ---*/
String Keypad() {
  const int totalLines = 4;   //Total de linhas do teclado
  const int totalColumns = 3; //Total de colunas do teclado
  const int lines[totalLines] = {2, 3, 4, 5};  //Portas de conexão das linhas
  const int columns[totalColumns] = {5, 7, 8}; //Portas de conexão das colunas
  const String keyBoard[totalLines][totalColumns] = { //Disposição das teclas
    {"1", "2", "3"},
    {"4", "5", "6"},
    {"7", "8", "9"},
    {"*", "0", "#"}
  };
  const String keyPressed = "";
  for (int i = 0; i < totalLines; i++) { //Configura os pinos das linhas como saída
    pinMode(lines[i], OUTPUT);
  }
  for (int i = 0; i < totalColumns; i++) { //Configura os pinos das colunas como entrada com pull-up
    pinMode(columns[i], INPUT_PULLUP);
  }

  for (int w = 0; w < totalLines; w++) { //Varre as linhas
    for (int i = 0; i < totalLines; i++) {
      digitalWrite(lines[i], HIGH);
    }
    digitalWrite(lines[w], LOW); //Uma linha LOW por vez
    for (int c = 0; c < totalColumns; c++) { //Varre as colunas
      while (digitalRead(columns[c]) == LOW) {
        keyPressed = keyBoard[w][c];
      }
    }
  }
  delay(50);
  return keyPressed;
}

Nenhum comentário:

Postar um comentário