Dentre as varias maneiras de interagirmos com o hardware em uma IHM (Interface Homem Maquina) uma das formas mais comuns e atraves do pressionamento de chaves e botoeiras para que o programa possa entao executar uma tarefa especifica. Hoje vamos interfacear um teclado matricial, como o encontrado em telefones celulares e calculadoras, onde temos varias chaves conectadas ao microcontrolador de maneira eficiente a fim de nao despedicarmos pinos do hardware. Para efetuar a conexao de uma tecla ao microcontrolador, podemos citar a maneira mais simples que utiliza apenas uma tecla e um resistor de Pull-up ou Pull-down conforme o nivel de tensao que desejarmos quando ocorrer o pressionamento da tecla. Porem nesta configuracao precisamos um pino para cada tecla conectada ao microcontrolador, o que caracteriza o desperdicio de hardware, porem isto pode ser resolvido com implementacao de uma simples matriz, onde conseguimos maximizar a utilizacao dos pinos de forma eficiente. No esquema abaixo podemos observar a utilizacao das linhas e colunas que formam a matriz. O numero maximo de chaves para esta implementacao pode ser obtida atraves da equacao abaixo: Nteclas = Colunas x Linhas O funcionamento do teclado matricial consiste em energizar apenas uma unica linha por vez e efetuar a leitura das colunas para verificar o pressionamento de alguma das teclas, quando detectado um nivel alto em alguma das colunas durante o rastreamento se torna possivel a identificacao da tecla pressionada. Para que nao haja erros de leituras durante este processo, se faz necessario o uso de resistores de pull-down para garantir um nivel baixo nas colunas que nao estao sendo ativas pelo pressionamento de tecla. Funcao para escaneamento de teclado Para efetuar a leitura do teclado matricial, vamos criar uma funcao que retornara o valor da tecla pressionada em hexadecimal ou o valor 0xFF caso nenhuma tecla tenha sido pressionada.No nosso exemplo utilizaremos um teclado matricial de [4x3] que foi adquirido atraves do site www.goodluckbuy.com. Assim que a funcao e chamada, colocamos um nivel alto na primeira linha e efetuamos a leitura das quatro colunas, caso alguma coluna responda nivel alto, retornamos da funcao com o valor correspondente a matrizagem, vejamos como fica o codigo: #define Coluna_1 PORTD.B0#define Coluna_2 PORTD.B1#define Coluna_3 PORTD.B2 #define Linha_1 PORTD.B6#define Linha_2 PORTD.B5#define Linha_3 PORTD.B4#define Linha_4 PORTD.B3 char Le_Teclado() // Funcao que efetua a leitura do teclado matricial{Coluna_1 = 1;Coluna_2 = 0;Coluna_3 = 0;Delay_ms(1);if(Linha_1) return 1;if(Linha_2) return 4;if(Linha_3) return 7;if(Linha_4) return 10; Coluna_1 = 0;Coluna_2 = 1;Coluna_3 = 0;Delay_ms(1);if(Linha_1) return 2;if(Linha_2) return 5;if(Linha_3) return 8;if(Linha_4) return 0; Coluna_1 = 0;Coluna_2 = 0;Coluna_3 = 1;Delay_ms(1);if(Linha_1) return 3;if(Linha_2) return 6;if(Linha_3) return 9;if(Linha_4) return 11; return 255;} Este codigo mostra como efetuar uma leitura simples do teclado matricial, porem dependendo do hardware utilizado pode apresentar problemas de estabilidade efetuando leituras falsas ou deixando de apresentar um pressionamento. MikroC PRO O compilador MikroC PRO, possui internamente uma biblioteca propria para uso com teclados matriciais e que torna o processo de escaneamento uma tarefa simples. Podem ser utilizadas as configuracoes [4x1] , [4x2] , [4x3] ou [4x4]. Keypad_Init() Efetua a inicializacao do teclado matricial, esta funcao requer que seja declarado