Teclado Matricial
Teclado Matricial
Teclado Matricial
Introduo
O Teclado Matricial
Este teclado como o nome indica formado de botes organizados em linhas e colunas de
modo a formar uma matriz. Quando pressionado um boto, conecta a linha com a coluna na qual
est ligado. A figura a seguir ilustra a ligao matricial.
O teclado matricial (neste caso) possui a seguinte pinagem (da esquerda para a direita):
A Multiplexao
Quando pressionadas 3 ou mais teclas um efeito conhecido como tecla fantasma pode
ocorrer. Caso a tecla fantasma seja pressionada e em seguida uma das teclas anteriores for solta,
a tecla que foi solta ainda ser considerada como pressionada. Para solucionar este problema
deve-se adicionar um diodo em cada boto para evitar que estes caminhos indesejados sejam
formados, como mostra a figura abaixo.
Biblioteca do MikroC
Esta biblioteca j vem pronta para usar o teclado matricial de 4x3 ou 4x4 (linhas x colunas)
do MikroC PRO (algumas mudanas foram feitas em relao ao cdigo original do programa).
Apenas verificar as portas de conexo do teclado (no exemplo est no PORTB) e do display LCD
(RS no pino RE0 e E no pino RE1, D4 a D7 nos pinos RD4 a RD7).
Este cdigo simplesmente mostra o valor digitado em formato ASCII e mostra tambm
quantas vezes este valor foi digitado.
Esta biblioteca est codificada para teclados matriciais de 4x3 e 4x4, portanto, para teclados
maiores, necessrio um cdigo diferente.
// Incio do cdigo
void main() {
ADCON1 = 0X06; // E/S digital
cnt = 0; // Reseta o contador
Keypad_Init(); // Inicializa a funo Keypad
Lcd_Init(); // Inicializa o LCD
Lcd_Cmd(_LCD_CLEAR); // Limpa o display
Lcd_Cmd(_LCD_CURSOR_OFF); // Desliga o cursor
Lcd_Out(1, 1, "1"); // Escreve no LCD na linha 1 e coluna 1
Lcd_Out(1, 1, "Key :"); // Escreve o valor digitado no LCD
Lcd_Out(2, 1, "Times:"); // Escreve quantas vezes o valor foi digitado no LCD
do {
kp = 0; // Reseta a varivel kp
// Estas duas funes tm a mesma funo, a diferena est que a Key_Press no trava a
varredura enquanto uma tecla est pressionada
while (!kp);
// Prepara o valor para sada e transforma a tecla pressionada em valor ASCII
switch (kp) {
// Fim do cdigo
Os resistores de pull down no so necessrios para a simulao no Proteus, porm na
montagem fsica do circuito, talvez seja necessrio coloc-los para evitar que o teclado mostre
teclas que no foram realmente pressionadas no display LCD. Valores de 4,7k a 10k so
apropriados. As conexes do teclado matricial podem variar dependendo do modelo utilizado,
portanto, verifique quais sadas so correspondentes s linhas e s colunas.
Algoritmo de exemplo
#define S2 RA0_bit
#define S1 RA1_bit
#define led2 RA2_bit
#define led1 RA3_bit
void interrupt()
{
if(T0IF_bit) //Houve estouro do Timer0?
{ //Sim...
if(!row_A) pulse(1);
else if(!row_B) pulse(4);
else if(!row_C) pulse(7);
else if(!row_D) pulse(11);
}
else if(col_2 && control == 0x02) //Coluna 2 em nvel high? Control igual 2?
{ //Sim...
control = 0x03;
col_1 = 0x01; //Apenas a coluna 2 em nvel baixo
col_2 = 0x00;
col_3 = 0x01;
if(!row_A) pulse(2);
else if(!row_B) pulse(5);
else if(!row_C) pulse(8);
else if(!row_D) pulse(10);
}
else if(col_3 && control == 0x03) //Coluna 3 em nvel high? Control igual 3?
{ //Sim...
control = 0x01;
col_1 = 0x01; //Apenas a coluna 3 em nvel baixo
col_2 = 0x01;
col_3 = 0x00;
if(!row_A) pulse(3);
else if(!row_B) pulse(6);
else if(!row_C) pulse(9);
else if(!row_D) pulse(12);
}
}
} //end interrupt
} //end while
} //end main
for(i=0;i<number;i++)
{
led1 = 0x01;
delay_ms(200);
led1 = 0x00;
delay_ms(200);
}
}
Neste exemplo, o circuito mostra o funcionamento do teclado matricial e quando pressionado
o nmero correspondente no teclado, o LED1 pisca este nmero de vezes. Por exemplo, se
pressionado a tecla correspondente ao nmero 5, o LED1 ir piscar 5 vezes. A varredura do circuito
feita a cada estouro do TIMER0 acionando pela condio lgica se e comparando com a varivel
de controle control para ligar e desligar cada coluna por vez. Diferente do exemplo utilizado pelo
MikroC, a lgica outra, funcionando com nvel alto nas linhas, e quando pressionado alguma tecla,
identifica nvel baixo nas portas do PIC, por isso a necessidade de utilizar resistores de pull up. J
a funo pulse() determina o nmero de vezes que a sada referente ao LED1 deve ficar alternando
entre nvel alto e baixo, ou seja, quantas vezes o led ir piscar. Os valores referentes a * 0 # do
teclado foram arbitrados como respectivamente: 11 10 12. Portanto, possvel modificar qualquer
valor no teclado atravs do cdigo.
O osciloscpio conectado nas sadas do PIC, referente s colunas, mostra o tempo que as
colunas ficam em nvel baixo em determinado perodo.
Referncias:
http://www.embarcados.com.br/
https://www.youtube.com/watch?v=ZKJ4wM3690I&list=PLZ8dBTV2_5HQTv6DRKZTp9L0iRReXis
0q&index=25