#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;
Obrigado por compartilhar,
sou iniciante e vai me ajudar a montar o meu teclado.
Grande Abraço
Que bom que foi útil, elaborei esse código quando estava fazendo meu tcc, li diversos exemplos na internet, mas não conseguia gostar deles, essa maneira que fiz IMHO é a mais didatica (tirando os vetores).
Um codigo simples pra me dar uma ajuda: Quero apertar determinada tecla do meu teclado e na linha do display aparecer o * ao inves do numero. Obg
Faça um IF
if(tecla_apertada)==3) // por exemplo quando a tecla 3 é apertada imprime o *
{
delay(10);
tecla_apertada=k+1;
lcd.setCursor(0, 1); /* O Cursor iniciara na coluna zero linha 3 */
lcd.print("Coluna 1: ");
lcd.print("*");
k=0;
}
Não testei mas deve resolver sua dúvida.