#include <LiquidCrystal.h> // Biblioteca com funcoes para uso de um LCD baseado no Hitachi HD 44780
LiquidCrystal lcd(1, 0, 5, 4, 3, 2);// Define os pinos de ligacao do LCD ao arduino com esta ordem LiquidCrystal(rs, enable, d4, d5, d6, d7)
#define col1 13 // Com resistor de pull down
#define col2 12 // Com resistor de pull down
#define col3 6 // Com resistor de pull down
#define l1 10 // Linha 1
#define l2 9
#define l3 8
#define l4 7 // Linha 4
void setup()
{
/*lcd.begin(cols, rows) */
lcd.begin(20, 4); /* Tipo de LCD usado no meu caso de 20 colunas por 4 linhas */
lcd.print(" Central AVR!");
// Declarando as colunas como INPUT, fios 4,3,2 do teclado
pinMode(col1,INPUT); /* Coluna 1, fio 4 */
pinMode(col2,INPUT); /* Coluna 2, fio 3 */
pinMode(col3,INPUT); /* Coluna 3, fio 2 */
// Declarando as linhas como OUTPUT fios 1,5,6,7 do teclado
pinMode(l1,OUTPUT); /* Linha 1, fio 1 */
pinMode(l2,OUTPUT);
pinMode(l3,OUTPUT);
pinMode(l4,OUTPUT); /* Linha 4, fio 7 */
}
void loop()
{
int l[]={l1, l2, l3, l4}; // Array de 4 posições contendo os 4 pinos de linhas
int i=0;
int k=0;
int tecla_apertada=0;
for (i=0; i<4; i++)
{
digitalWrite(l1,LOW);
digitalWrite(l2,LOW);
digitalWrite(l3,LOW);
digitalWrite(l4,LOW);
digitalWrite(l[i],HIGH); // Torna uma linha alta por vez
k=i*3; // Responsavel pela mudança de valores nas linhas após cada ciclo do for
if(digitalRead(col1)==HIGH) // Se alguma tecla da coluna 1 for apertada executa o código abaixo
{
delay(10);
tecla_apertada=k+1;
lcd.setCursor(0, 1); /* O Cursor iniciara na coluna zero linha 3 */
lcd.print("Coluna 1: ");
lcd.print(tecla_apertada);
k=0;
}
if(digitalRead(col2)==HIGH)
{
delay(10);
tecla_apertada=k+2;
lcd.setCursor(0, 2); /* O Cursor iniciara na coluna zero linha 3 */
lcd.print("Coluna 2: ");
lcd.print(tecla_apertada);
k=0;
}
if(digitalRead(col3)==HIGH)
{
delay(10);
tecla_apertada=k+3;
lcd.setCursor(0, 3); // O Cursor iniciara na coluna zero linha 3
lcd.print("Coluna 3: ");
lcd.print(tecla_apertada);
k=0;
}
}
}
Algumas explicações sobre o funcionamento do programa.
A parte mais "complexa" deste código reside no laço do for onde utilizei um array para organizar a mudança para lógica HIGH das linhas, lembrando que o mesmo deve ser feito individualmente.
for (i=0; i<4; i++)
{
digitalWrite(l1,LOW);
digitalWrite(l2,LOW);
digitalWrite(l3,LOW);
digitalWrite(l4,LOW);
digitalWrite(l[i],HIGH); // Torna uma linha alta por vez
k=i*3; // Responsavel pela mudança de valores nas linhas após cada ciclo do for
.
.
.
.
.
}
Supondo i=0 a condição do for será verdadeira e o código dentro do laço será executado, todas as linhas são setada em nível LOW e apenas a linha 1 será setada em nível HIGH pois i=0 e no array l[] posição zero temos l1.
digitalWrite(l[0],HIGH); // Torna uma linha alta por vez
O código executará até o final das condições(IF) e se não não for pressionada nenhuma tecla novamente todas as linhas receberão nível lógico LOW e somente a linha 2 será setada em nivel HIGH pois i=1 e no array l[] posição um temos l2.
digitalWrite(l[1],HIGH); // Torna uma linha alta por vez
k=i*3 é uma jogada para retornar um valor condizente com a linha com lógica HIGH, novamente supondo i=0 ou seja a primeira execução do for temos k=0*3 portanto k=0 se a primeira coluna foi acionada o valor a ser impresso será 1 pois tecla_apertada=k+1;
Supondo i=1 ou seja a segunda execução do for temos k=1*3 portanto k=3 se a terceira coluna foi acionada o valor a ser impresso será 6 pois tecla_apertada=k+3;