Teclado Matricial
Autor: Jean Carlos | Publicado: 2012-04-29T15:30:00-07:00

&nbsp; Dentre as várias maneiras de interagirmos com o hardware em uma IHM (Interface Homem Máquina) uma das formas mais comuns é através do pressionamento de chaves e botoeiras para que o programa possa então executar uma tarefa específica.  Hoje vamos interfacear um teclado matricial, como o encontrado em telefones celulares e calculadoras, onde temos várias chaves conectadas ao microcontrolador de maneira eficiente a fim de não despediçarmos pinos do hardware.  Para efetuar a conexão 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 nível de tensão que desejarmos quando ocorrer o pressionamento da tecla.  Porém nesta configuração precisamos um pino para cada tecla conectada ao microcontrolador, o que caracteriza o desperdício de hardware, porém isto pode ser resolvido&nbsp; com&nbsp; implementação de uma simples matriz, onde conseguimos maximizar a utilização dos pinos de forma eficiente. No esquema abaixo podemos observar a utilização das linhas e colunas que formam a matriz. &nbsp;  &nbsp; O número máximo de chaves para esta implementação pode ser obtida através da equação abaixo:  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; N°teclas = Colunas x Linhas O funcionamento do teclado matricial consiste em energizar apenas uma única linha por vez e efetuar a leitura das colunas para verificar o pressionamento de alguma das teclas, quando detectado um nível alto em alguma das colunas durante o rastreamento se torna possível a identificação da tecla pressionada. Para que não haja erros de leituras durante este processo, se faz necessário o uso de resistores de pull-down para garantir um nível baixo nas colunas que não estão sendo ativas pelo pressionamento de tecla. Função para escaneamento de teclado Para efetuar a leitura do teclado matricial, vamos criar uma função que retornará 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 através do site www.goodluckbuy.com. Assim que a função é chamada, colocamos um nivel alto na primeira linha e efetuamos a leitura das quatro colunas, caso alguma coluna responda nivel alto, retornamos da função com o valor correspondente a matrizagem, vejamos como fica o código:   #define Coluna_1&nbsp; PORTD.B0#define Coluna_2&nbsp; PORTD.B1#define Coluna_3&nbsp; PORTD.B2 #define Linha_1&nbsp;&nbsp;&nbsp; PORTD.B6#define Linha_2&nbsp;&nbsp;&nbsp; PORTD.B5#define Linha_3&nbsp;&nbsp;&nbsp; PORTD.B4#define Linha_4&nbsp;&nbsp;&nbsp; PORTD.B3 char Le_Teclado()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Função 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;&nbsp;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;&nbsp;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;&nbsp;return 255;}    Este código&nbsp; mostra como efetuar uma leitura “simples” do teclado matricial, porém 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 própria para uso com teclados matriciais e que torna o processo de escaneamento uma tarefa simples. Podem ser utilizadas as configurações [4x1] , [4x2] , [4x3] ou [4x4].  Keypad_Init() Efetua a inicialização do teclado matricial, esta função requer que seja declarado anteriormente uma variável chamada keypadPort que define o PORT onde será conectado o nosso hardware do teclado. char keypadPort at PORTD; &nbsp; Keypad_Key_Press() Efetua a leitura de uma tecla pressionada, retornando o valor da tecla (1 –16) ou 0 caso nenhuma tecla seja pressionada. Keypad_Key_Click() Efetua a leitura de uma tecla pressionada, retornando o valor da tecla (1 –16) ou 0 caso nenhuma tecla seja pressionada, porém é uma função com propriedades de bloqueio, ou seja, quando chamada, aguarda o pressionamento da tecla, bloqueando o processo do programa durante a espera do pressionamento da tecla. Notem que esta biblioteca do MikroC PRO, embora nos ajude a interfacear o teclado não retorna o valor direto das teclas e sim a posição dela na matriz. Vejamos como ficou o nosso código completo utilizando o compilador MikroC PRO. /****************************************************************************** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JL Audio – www.esquemas .org Data: 04/2012Autor: Jean CarlosProjeto: Teclado MatricialMicroprocessador: PIC18F4550Clock do processador: 48MHzEstação de desenvolvimento: PK2Lab V 1.1Compilador: MikroC PRO V 4.60.0.0Versão atual: 1.0Descrição:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Implementação de leitura de teclado matricial na&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; placa PK2Lab, através de biblioteca do MikroC PRO. *******************************************************************************/// Inicialização do teclado no PORTD char keypadPort at PORTD; // Configuração do LCD da placa PK2Lab V.1.1 sbit LCD_RS at RB2_bit;sbit LCD_EN at RB3_bit;sbit LCD_D4 at RB4_bit;sbit LCD_D5 at RB5_bit;sbit LCD_D6 at RB6_bit;sbit LCD_D7 at RB7_bit; sbit LCD_RS_Direction at TRISB2_bit;sbit LCD_EN_Direction at TRISB3_bit;sbit LCD_D4_Direction at TRISB4_bit;sbit LCD_D5_Direction at TRISB5_bit;sbit LCD_D6_Direction at TRISB6_bit;sbit LCD_D7_Direction at TRISB7_bit; //******************************************************************************// Variáveis Globais char tecla, tecla_antiga = 0; //******************************************************************************// Rotinas Auxiliares //******************************************************************************//Rotina Principal void main(){TRISA&nbsp;&nbsp;&nbsp;&nbsp; = 0b00000000;PORTA&nbsp;&nbsp;&nbsp; = 0b00000000;TRISB&nbsp;&nbsp;&nbsp;&nbsp; = 0b00000000;PORTB&nbsp;&nbsp;&nbsp; = 0b00000000;TRISC&nbsp;&nbsp;&nbsp;&nbsp; = 0b00000000;PORTC&nbsp;&nbsp;&nbsp; = 0b00000000;PORTD&nbsp;&nbsp;&nbsp; = 0b00000000;TRISE&nbsp;&nbsp;&nbsp;&nbsp; = 0b00000000;PORTE&nbsp;&nbsp;&nbsp; = 0b00000000;ADCON1&nbsp; = 0X0F;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Entradas digitais. Keypad_Init();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Inicializa o Teclado Matricial Lcd_Init();Lcd_Cmd(_Lcd_Cursor_Off);Lcd_Cmd(_LCD_CLEAR);Lcd_Out(1,1,"***&nbsp; PK2Lab&nbsp; ***");Lcd_Out(2,2,"Tecla Press:");Delay_ms(100); while(1){tecla = Keypad_Key_Press();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Efetua leitura do teclado&nbsp;if(tecla != 0){&nbsp; switch (tecla)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Efetua conversão para impressão&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case&nbsp; 1: tecla = 49; break; // 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case&nbsp; 2: tecla = 50; break; // 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case&nbsp; 3: tecla = 51; break; // 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case&nbsp; 4: tecla = 65; break; // A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case&nbsp; 5: tecla = 52; break; // 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case&nbsp; 6: tecla = 53; break; // 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case&nbsp; 7: tecla = 54; break; // 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case&nbsp; 8: tecla = 66; break; // B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case&nbsp; 9: tecla = 55; break; // 7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 10: tecla = 56; break; // 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 11: tecla = 57; break; // 9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 12: tecla = 67; break; // C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 13: tecla = 42; break; // *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 14: tecla = 48; break; // 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 15: tecla = 35; break; // #&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 16: tecla = 68; break; // D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; if(tecla != tecla_antiga)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Atualiza a ultima tecla pressionada&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; tecla_antiga = tecla;&nbsp;&nbsp;&nbsp; }&nbsp; Lcd_Chr(2,15,tecla);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Imprime a tecla pressionada no LCD}}//while(1)}//main    Abaixo o vídeo do projeto funcionando!    Bom projetos a todos e até a próxima!