// ===============================================================
//Layout do teclado 
// 1 | 2 | 3 | * |
// 4 | 5 | 6 | # |
// 7 | 8 | 9 | 0 |


// ===============================================================
// --- Mapeamento de Hardware ---
#define COLUNA_1 16
#define COLUNA_2 15
#define COLUNA_3 14
#define COLUNA_4 13
#define LINHA_1 17
#define LINHA_2 8
#define LINHA_3 9

// ===============================================================
// --- Protótipo das Funções ---
void readMatrix();      //leitura do teclado
void store(char value, int pino); //Função para armazenar o número digitado no teclado matricial
void printBotao();      //impressão do número correspondente ao botão pressionado na matriz

// ===============================================================
// --- Variáveis Globais---
char controleColuna = 0x01;
int  botaoPressionado  = 0x00;     //variável para armazenar o número pressionado no teclado
unsigned long tempoUltimoDebounce = 0;
unsigned long tempoDebounce = 50; //milisegundos
uint8_t statusChave;
// ===============================================================
// --- Setup ---
void setup() {
  Serial.begin(115200);  
  pinMode(COLUNA_1, OUTPUT);
  pinMode(COLUNA_2, OUTPUT);
  pinMode(COLUNA_3, OUTPUT);
  pinMode(COLUNA_4, OUTPUT);
  pinMode(LINHA_1, INPUT_PULLUP);
  pinMode(LINHA_2, INPUT_PULLUP);
  pinMode(LINHA_3, INPUT_PULLUP);

  digitalWrite(COLUNA_1, HIGH);    //Inicializa coluna 1 em HIGH
  digitalWrite(COLUNA_2, HIGH);    //Inicializa coluna 2 em HIGH
  digitalWrite(COLUNA_3, HIGH);    //Inicializa coluna 3 em HIGH
  digitalWrite(COLUNA_4, HIGH);    //Inicializa coluna 4 em HIGH                 
  Serial.println(botaoPressionado);
}//end setup

// ===============================================================
// --- Loop Infinito ---
void loop() {
  readMatrix();

}//end lopp infinito

// ===============================================================
//Layout do teclado 
// 1 | 2 | 3 | * |
// 4 | 5 | 6 | # |
// 7 | 8 | 9 | 0 |

// ===============================================================
// --- Desenvolvimento das Funções ---

void readMatrix(){
  if(digitalRead(COLUNA_1) && controleColuna == 0x01){    //Coluna 1 em nível high? controleColuna igual 1?
                                                          //Sim...
    //controleColuna = 0x02;        //habilita leitura para proxima coluna    
    digitalWrite(COLUNA_1,  LOW);    //apenas coluna 1 em nível baixo
    digitalWrite(COLUNA_2, HIGH);
    digitalWrite(COLUNA_3, HIGH);
    digitalWrite(COLUNA_4, HIGH);

// -- Testa qual botão foi pressionado e armazena o valor --
    if     (!digitalRead(LINHA_1))  store(1, LINHA_1);
    else if(!digitalRead(LINHA_2))  store(4, LINHA_2);
    else if(!digitalRead(LINHA_3))  store(7, LINHA_3);    
      
  } //end if COLUNA_1
  /*
  else if(digitalRead(COLUNA_2) && controleColuna == 0x02){    //Coluna 2 em nível high? controleColuna igual 2?
                                                          //Sim...
    controleColuna = 0x03;        //habilita leitura para proxima coluna
    digitalWrite(COLUNA_1, HIGH);    //apenas coluna 2 em nível baixo
    digitalWrite(COLUNA_2, LOW);
    digitalWrite(COLUNA_3, HIGH);
    digitalWrite(COLUNA_4, HIGH);

// -- Testa qual botão foi pressionado e armazena o valor --
    if     (!digitalRead(LINHA_1))  store(2);
    else if(!digitalRead(LINHA_2))  store(5);
    else if(!digitalRead(LINHA_3))  store(8);    
      
  } //end else if COLUNA_2

  else if(digitalRead(COLUNA_3) && controleColuna == 0x03){    //Coluna 3 em nível high? controleColuna igual 3?
                                                          //Sim...
    controleColuna = 0x04;        //habilita leitura para proxima coluna
    digitalWrite(COLUNA_1, HIGH);    //apenas coluna 3 em nível baixo
    digitalWrite(COLUNA_2, HIGH);
    digitalWrite(COLUNA_3, LOW);
    digitalWrite(COLUNA_4, HIGH);

// -- Testa qual botão foi pressionado e armazena o valor --
    if     (!digitalRead(LINHA_1))  store(3);
    else if(!digitalRead(LINHA_2))  store(6);
    else if(!digitalRead(LINHA_3))  store(9);    
      
  } //end else if COLUNA_3

  else if(digitalRead(COLUNA_4) && controleColuna == 0x04){    //Coluna 4 em nível high? controleColuna igual 4?
                                                          //Sim...
    controleColuna = 0x01;        //habilita leitura para proxima coluna
    digitalWrite(COLUNA_1, HIGH);    //apenas coluna 4 em nível baixo
    digitalWrite(COLUNA_2, HIGH);
    digitalWrite(COLUNA_3, HIGH);
    digitalWrite(COLUNA_4, LOW);

// -- Testa qual botão foi pressionado e armazena o valor --
    if     (!digitalRead(LINHA_1))  store(10);
    else if(!digitalRead(LINHA_2))  store(11);
    else if(!digitalRead(LINHA_3))  store(0);       
  } //end else if COLUNA_4*/
}// end readMatrix()

void store(char valor,  int pino ){                     //Função para armazenar o valor digitado no teclado 
  int ultimoStatusChave = 0x01;
 
  botaoPressionado  = 0x0F;
  //int leitura = valor;  
  while(1){    
    if (valor != ultimoStatusChave){ //houve mudança.  
      tempoUltimoDebounce = millis();  //inicializa contador
    }
   
    if((millis()-tempoUltimoDebounce) > tempoDebounce){// estourou contador? Sim.
      if (valor != botaoPressionado) {  //houve mudança.        
        botaoPressionado = valor;    //atualiza botaoPressionado
        printBotao();
        break;     
      }
    }
    ultimoStatusChave = valor;
    valor = digitalRead(pino);    
  }
  
  
  /*
  delay(350);      
  botaoPressionado = valor;    //atualiza botaoPressionado
  printBotao();  */
   
} //end store

void printBotao(){ //Função para imprimir o número pressionado
  if     (botaoPressionado == 10) Serial.println("*");
  else if(botaoPressionado == 11) Serial.println("#");  
  else Serial.println(botaoPressionado);
} //end printBotao()
Loading
franzininho-wifi