Anda di halaman 1dari 10

1 const uint8_t row_size = 4; // Quantidade de linhas.

2 const uint8_t col_size = 4; // Quantidade de colunas.


3 const uint8_t row_pin[row_size] = {4, 5, 6, 7}; // Pinos que estão ligados as linhas.
4 const uint8_t col_pin[col_size] = {8, 9, 10, 11}; // Pinos que estão ligados as colunas.
5 const char keys[row_size][col_size] = { // Mapa de teclas do teclado.
6 { '1', '2', '3', 'A' },
7 { '4', '5', '6', 'B' },
8 { '7', '8', '9', 'C' },
9 { '*', '0', '#', 'D' }
10 };
11
12 bool stable[row_size][col_size]; // Guarda o último estado estável dos botões.
13 bool unstable[row_size][col_size]; // Guarda o último estado instável dos botões.
14 uint32_t bounce_timer;
15
16 // Executa o algoritmo de varredura simples.
17 void scan() {
18 for (uint8_t e = 0; e < col_size; ++e) { // Varre cada coluna.
19 pinMode(col_pin[e], OUTPUT);
20 digitalWrite(col_pin[e], 0); // Habilita a coluna "c".
21 for (uint8_t r = 0; r < row_size; ++r) { // Varre cada linha a procura de mudanças.
22 if (changed(r, e)) { // Se houver uma mudança de estado.
23 Serial.print(keys[r][e]);
24 Serial.print(" : "); // Imprime a tecla que sofreu a alteração
25 Serial.println(stable[r][e]); // e seu estado atual.
26 }
27 }
28 pinMode(col_pin[e], INPUT); // Desabilita a coluna "c".
29 }
30 }
31
32 // Checa se o estado do botão foi alterado além de tratar os efeitos de sua trepidação.
33 bool changed(const uint8_t& row, const uint8_t& col) {
34 bool now = digitalRead(row_pin[row]); // Lê o estado do botão na linha especificada.
35 if (unstable[row][col] != now) { // Checa se houve mudança.
36 bounce_timer = millis(); // Atualiza timer.
37 unstable[row][col] = now; // Atualiza estado instável.
38 }
39 else if (millis() - bounce_timer > 10) { // Checa o tempo de trepidação acabou.
40 if (stable[row][col] != now) { // Checa se a mudança ainda persiste.
41 stable[row][col] = now; // Atualiza estado estável.
42 return 1;
43 }
44 }
45 return 0;
46 }
47
48 void setup() {
49 Serial.begin(9600);
50
51 // Configura o estado inicial das linhas como entradas com pull up.
52 for (uint8_t r = 0; r < row_size; ++r) {
53 pinMode(row_pin[r], INPUT_PULLUP);
54 }
55
56 // Configura o estado inicial das linhas como entradas.
57 for (uint8_t c = 0; c < col_size; ++c) {
58 pinMode(col_pin, INPUT);
59 }
60
61 // Define estado inicial dos botões;
62 for (uint8_t c = 0; c < col_size; ++c) {
63 for (uint8_t r = 0; r < row_size; ++r) {
64 stable[r] = 1;
65 }
66 }
67 }
68
69 void loop() {
70 scan();
71 }
1 #include <Keypad.h>
2
3 const uint8_t row_size = 4; // Quantidade de linhas.
4 const uint8_t col_size = 4; // Quantidade de colunas.
5 const uint8_t row_pin[row_size] = {4, 5, 6, 7}; // Pinos que estão ligados as linhas.
6 const uint8_t col_pin[col_size] = {8, 9, 10, 11}; // Pinos que estão ligados as colunas.
7 const char keys[row_size][col_size] = { // Mapa de teclas do teclado.
8 { '1', '2', '3', 'A' },
9 { '4', '5', '6', 'B' },
10 { '7', '8', '9', 'C' },
11 { '*', '0', '#', 'D' }
12 };
13
14 Keypad keypad = Keypad(makeKeymap(keys), row_pin, col_pin, row_size, col_size);
15
16 void setup() {
17 Serial.begin(9600);
18 }
19
20 void loop() {
21 char key = keypad.getKey(); // Retorna a última tecla que foi apertada.
22 if (key != NO_KEY) Serial.println(key); // Imprime tecla na porta serial.
23 }
Rodolfo Picoreti
Estudante de Engenharia Elétrica e integrante do PET Elétrica UFES.

Anda mungkin juga menyukai