/******************************************************************************* * * Projeto 107: Usando o Teclado Matricial 4X4 (keypad) - sem biblioteca * http://squids.com.br/arduino * *******************************************************************************/ #include //biblioteca para usar comunicação I2C #include //biblioteca para usar display LCD com I2C const int rows = 4; //número de linhas do teclado const int cols = 4; //número de colunas do teclado char keys[rows][cols] = { //definição do teclado {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; byte rowPins[rows] = {9, 8, 7, 6}; //pinos do Arduino - linhas do teclado byte colPins[cols] = {5, 4, 3, 2}; //pinos do Arduino - colunas do teclado const int debounce = 20; //tempo de pausa para debounce const char controle = 0; //controle para verificar se a tecla foi pressionada LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); // Inicializa o display no endereco 0x27 void setup() { lcd.begin (16,2); //instancia o objeto lcd (display lcd 16X2) //configura as linhas como entradas com padrão em nível lógico alto for(int linha = 0; linha < rows; linha++) { pinMode(rowPins[linha], INPUT_PULLUP); digitalWrite(rowPins[linha], HIGH); //habilita pull-up } //configura as colunas como saídas com padrão em nível lógico alto for(int coluna = 0; coluna < cols; coluna++){ pinMode(colPins[coluna], OUTPUT); digitalWrite(colPins[coluna], HIGH); } lcd.setBacklight(HIGH); lcd.clear(); // limpa a tela do display lcd.setCursor(0,0); lcd.print("-- Digite --"); } void loop() { char tecla = teclaPressionada(); //chama a função teclaPressionada() que retorna o valor da tecla digitada if(tecla != controle) { lcd.clear(); lcd.setCursor(0,0); lcd.print("Tecla: "); lcd.print(tecla); } } //Função teclaPressionada() -> Determina qual tecla foi pressionada char teclaPressionada() { char tecla = controle; //atribui o valor padrão de retorno (nenhuma tecla pressionada) boolean match = false; //inicialmente considera que nenhuma tecla foi pressionada //varre as colunas procurando por uma tecla pressionada for (int coluna = 0; coluna < cols; coluna++) { digitalWrite(colPins[coluna], LOW); //muda o estado do pino //varre as linhas procurando por uma tecla pressionada for(int linha = 0; linha < rows; linha++) { //lê linha pela primeira vez if(digitalRead(rowPins[linha]) == LOW) { //tecla está pressionada delay(debounce); //insere pausa para descartar ruídos } //lê linha pela segunda vez if(digitalRead(rowPins[linha]) == LOW) { //tecla continua pressionada, não é ruído while(digitalRead(rowPins[linha]) != HIGH); //espera soltar o tecla tecla = keys[linha][coluna]; //determina qual foi a tecla pressionada match = true; //uma tecla foi pressionada break; //sai da varredura das linhas } } digitalWrite(colPins[coluna], HIGH); //retorna o pino ao seu estado inicial //se uma tecla foi pressionada, sai do laço for if(match) break; } return tecla; //retorna a tecla pressionada (kNADA se nenhuma foi encontrada) }