Vídeo:
Código-fonte:
byte rows[] = {11,10,9,8};
byte columns[] = {7,6,5,4};
char getKey(){
char keys[4][4] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
char k = '\0';
for (int r=0; r<4; r++){
digitalWrite(rows[r], LOW);
for (int c=0; c<4; c++){
if (digitalRead(columns[c]) == LOW){
k = keys[r][c];
break;
}
}
digitalWrite(rows[r], HIGH);
if (k) {
break;
}
}
return k;
}
char getKeyOnce(){
static char lastVal = '\0';
static unsigned long m = 0;
char val = getKey();
if (lastVal != val && millis() > (m+100) ) { //M+100 -->DEBOUNCING 100ms
lastVal = val;
m = millis();
return lastVal;
}
return '\0';
}
void setup() {
for (int i=0; i<4; i++){
pinMode(rows[i], OUTPUT);
pinMode(columns[i], INPUT_PULLUP);
digitalWrite(rows[i], HIGH);
}
Serial.begin(9600);
}
void loop(){
char k = getKeyOnce();
if (k) {
Serial.println(k);
}
delay(10); //apenas para o simulador.
}
Exemplo de uma Calculadora utilizando keypad 4x4:
Código-fonte:
#include <LiquidCrystal.h>
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
byte rows[] = {5,4,3,2};
byte columns[] = {A5,A4,A3,A2};
String valor1 = "";
String valor2 = "";
String resultado = "";
char operacao = '\0';
char getKey(){
char keys[4][4] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
char k = '\0';
for (int r=0; r<4; r++){
digitalWrite(rows[r], LOW);
for (int c=0; c<4; c++){
if (digitalRead(columns[c]) == LOW){
k = keys[r][c];
break;
}
}
digitalWrite(rows[r], HIGH);
if (k) { break; }
}
return k;
}
char getKeyOnce(){
static char lastVal = '\0';
static unsigned long m = 0;
char val = getKey();
if (lastVal != val && millis() > (m+100) ) { //M+100 -->DEBOUNCING 100ms
lastVal = val;
m = millis();
return lastVal;
}
return '\0';
}
void setup() {
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("youtube.com/");
lcd.setCursor(0, 1);
lcd.print("fabianoallex");
for (int i=0; i<4; i++){
pinMode(rows[i], OUTPUT);
pinMode(columns[i], INPUT_PULLUP);
digitalWrite(rows[i], HIGH);
}
delay(3000);
lcd.clear();
lcd.setCursor(0, 0);
}
void loop() {
execKeypad();
delay(10); //apenas para o simulador.
}
void execKeypad(){
char operacoes[] = {'\0', '*', '/', '+', '-'};
static byte indexOperacao = 0;
char k = getKeyOnce();
if (k) {
if (k >= 48 && k<= 57) { /*digitos numericos*/
resultado = "";
if (operacao){
valor2 = valor2 + k;
} else {
valor1 = valor1 + k;
}
}
if (k == '*') {
if (resultado != "" && valor1 == ""){
valor1 = resultado;
resultado = "";
}
indexOperacao++;
if (indexOperacao > 4){ indexOperacao = 0; }
operacao = operacoes[indexOperacao];
}
if (k == '#' && valor1 != "" && valor2 != "") {
double v1, v2, r;
char vchar[10];
valor1.toCharArray(vchar, 10);
v1 = atof(vchar);
valor2.toCharArray(vchar, 10);
v2 = atof(vchar);
if (operacao == '*') { r = v1 * v2; }
if (operacao == '+') { r = v1 + v2; }
if (operacao == '-') { r = v1 - v2; }
if (operacao == '/') { r = (v2 == 0) ? 0 : v1 / v2; }
sprintf(vchar, "%d.%02d", (int)r, (long)(abs(r)*100)%100);
resultado = (operacao == '/' && r == 0) ? "Div 0" : String(vchar);
valor2 = "";
valor1 = "";
indexOperacao = 0;
operacao = '\0';
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(resultado != "" ? resultado : valor1);
lcd.setCursor(0, 1);
lcd.print(valor2);
lcd.setCursor(15, 0);
lcd.print(operacao ? operacao : ' ');
}
}