teclado matricial

Embed Size (px)

Citation preview

porRodrigo Almeidaem quarta-feira, 02 de abril de 2014.

Sofa-Teclado:http://www.zo-loft.com/design/Para se realizar a leitura de uma tecla ou chave necessrio utilizar um terminal do microcontrolador. No post sobredebounceso explicados mais detalhes deste procedimento. Para teclados com uma quantidade maior de chaves possvel que o microcontrolador no possua terminais disponveis em quantidade suficiente, ou que o controlador que possua essa quantidade seja de um custo mais elevado.A soluo padro para este problema realizar-se a multiplexao das chaves. Isto aumenta a quantidade de chaves que pode ser lida para uma mesma quantidade de terminais. Esta economia de hardware, no entanto, aumenta a complexidade do software e o custo, em termos de tempo de computao.Uma das tcnicas mais eficientes de multiplexao para leitura de teclados o arranjo em formato matricial. Com esta configurao podemos, com N terminais, ler at (N/2)^2 chaves, ou seja, com apenas 8 terminais possvel fazer uma leitura de 16 teclas. J um teclado alfanumrico padro de 105 teclas pode ser montado com apenas 21 terminais, uma reduo de quase 80%.A multiplexao a capacidade de enviar mais de um sinal utilizando um mesmo caminho, o dividindo de algum modo, geralmente em frequncias diferentes, ou em perodos de tempo diferentes.Na leitura matricial dispe-se os grupos de chaves separados em colunas, de modo que seja possvel ligar uma coluna por vez. Isto pode ser feito utilizando terminais de sada para acionamento de cada coluna e terminais de entrada para a leitura das linhas. muito comum utilizarresistores de pull-upsna entrada do microcontrolador ou, caso o microcontrolador possua, pull-ups internos das prprias entradas. Para proteger o sistema de curto entre os terminais, geralmente se utiliza resistores em srie nas sadas a serem controladas. Um modelo deste circuito apresentado na figura 1.

Figura 1 Teclado matricialConforme podemos ver na Figura 1, cada chave pode ser identificada unicamente pela sua posio (linha, coluna). A leitura realizada ento por um processo conhecido como varredura: liga-se uma coluna por vez e verifica-se quais chaves daquela coluna esto ligadas. O cdigo abaixo apresenta um modelo de varredura utilizando-se a porta B.

1234567891011121314151617181920212223242526272829void main(void) {unsigned char i, j;unsigned char chave[4][4] ={{0,0,0,0},{0,0,0,0}};INTCON2 &= 0x7F; //habilita pull-upTRISB = 0xF0;//4 terminais de entrada e 4 terminais de sadafor(;;){for(i = 0; i < 4; i++){PORTB = 0xff;//desliga todas as colunasBitClr(PORTB,i); //liga a coluna correspondente//tempo para estabilizao do sinalfor(j = 0; j < 100; j++);//realiza o teste para cada chavefor(j = 0; j < 4; j++){if (!BitTst(PORTB,j+4)){chave[i][j] = 1;}else{chave[i][j] = 0;}}}}}

importante notar que o cdigo acima no apresenta debounce em software para as teclas. H apenas uma pequena contagem de tempo entre os acionamentos das colunas para permitir que as capacitncias, tanto as utilizadas como filtro nas chaves quanto as parasitas, possam se carregar para informar corretamente o estado das chaves. incomum utilizar uma matriz para armazenar o estado das chaves, sendo mais comum a utilizao de um vetor de bits. Utilizando uma varivelunsignedintde 16 bits, possvel guardar o valor de at 16 chaves. Esta varivel pode ento ser interpretada como um vetor de 16 bits. Outra vantagem a possibilidade de realizar o debounce de todas as chaves simultaneamente, bastando esperar que o valor da varivel estabilize durante um tempo antes de termos certeza do estado das chaves. Juntando-se esta idia com a questo da varredura chega-se ao cdigo abaixo.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748//ltimo valor confivel, pode estar atrasado devido ao processo de debounce//define a quantidade de leituras iguais antes que o sinal seja considerado estvel#define DEBOUNCE_TIME 10static unsigned int valor = 0x0000;unsigned int LerTeclas(void){return valor;}//Funo para varredura e debounce, deve ser chamada peridicamentevoid VarreduraDebounceTeclas(void){unsigned char i,j;//variveis estticas para gerenciamento do debouncestatic unsigned char tempo;static unsigned int valorNovo = 0x0000;static unsigned int valorAntigo = 0x0000;//inicio do processo de varredurafor(i = 0; i < 4; i++){PORTB |= 0x0F;//desliga todas as colunasBitClr(PORTB,(i));//liga uma coluna//tempo para estabilizar o sinalfor(j=0;j Saidas p/ LEDs;RB0-RB2 -> Saidas para scan de teclado (colunas);RB4-RB7 -> Entradas para scan de teclado (linhas)

radixdecinclude __CONFIG _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC ;configura bits

;**********************************************;Define registros

PICRESequ0x00PICINTequ0x04RAMINITequ0x0C

;**********************************************;Variaveis j definidas em P16F84A.INC;;PORTA, PORTB, STATUS, PCL, DC, C, Z;**********************************************;Variaveis de uso do programa;orgRAMINIT;endereco da RAM

TEMPres1TECLAres1TECLA_Lres1T1res 1T2res1AUX1res1

orgPICRES;endereco de resetgotoinicio;desvia p/ inicio

orgPICINT;endereco do vector de INTretfie;**********************************************;inicio do programa;seta ambiente

inicio:movlw 0x00 ;ajuste para os bits INTCON movwf INTCON bsf STATUS,RP0 ;seleciona banco 1 para options e tris

movlw 0x00 ;ajusta os bits em A como saida movwf TRISA

movlw 0xF0 ;ajusta os bits em B como saida e entradas movwf TRISB

bcf STATUS,RP0 ;volta ao banco 0... (padro do reset)

movlw0x04;apaga leds do port AmovwfPORTAmovwfAUX1

clrfPORTB;**********************************************;loop principal

loop:movlwB'11110111';seta em low primeira colunamovwfTEMP;salva

tec1:bsfSTATUS,RP0;seleciona banco 1movlw0xF0movwfTRISB;seta novamente o port BbcfSTATUS,RP0;volta ao banco 0movfTEMP,0;carrega W com TEMPmovwfPORTB;envia TEMP para BmovfPORTB,W;Le o port Bandlw0xF0;mascara para ver se houve...xorlw0xF0;mudanca no portbtfssSTATUS,Z;nao??? entao pula proximogotodet_tecla;sim??? entao tem tecla

tec3:bsfSTATUS,C;seta carryrrfTEMP,1;marca prxima colunabtfscSTATUS,C;ultima coluna??? pula proximogototec1;senao, faz novamenteclrfTECLA;zera tecladecfTECLA,1;faz tecla igual FF

tec2:clrfPORTB;zera port BbsfSTATUS,RP0;seta banco 1movlw0xF0movwfTRISB;seta novamente portbbcfSTATUS,RP0;volta ao banco 0gotoled;led 3, opera invertido

apaga:movlw0x04gotoled

acende:movwfTECLA

led1:movwfPORTA;ativa ledcall pausa

led:movfAUX1,W;pega ultimo valormovwfPORTAgotoloop;volta para inicio

det_tecla:incfTECLA,1;incrementa teclabtfssSTATUS,Z;se TECLA estava limpa, pulagototec2;senao, limpa e voltamovfPORTB,0;colhe teclaiorlwB'00001111';operacao ORandwfTEMP,0;AND do resultado com TEMPmovwfTECLA;salva em tecla

pega_tec:andlwB'00001111';pega o bit em low (coluna)movwfTECLA_L;grava em tecla linhamovlw0x04;valor para contadormovwfTEMP;carrega valor em TEMPpt1:bsfSTATUS,C;seta bit carryrrfTECLA_L,1;roda a direita btfssSTATUS,C;testa bit de carry, se 1 pulagotopega_hi;pega parte altadecfszTEMP,1;decrementa TEMPgotopt1;loop ate zerar contador

erro_meu:gotoinicio;retorna e inicializa

pega_hi:decfTEMP,1;decrementa TEMPswapfTECLA,0;troca 0 por 1 e vice-versaandlwB'00001111';and do resultado com o literalmovwfTECLA_L;salva o novo valormovfTEMP,W;carrega temp em WaddwfPCL,1;soma counter ao Program Countergotopega4;pula para cada um de acordo com PCgotopega8gotopega12gotopega16

pega4:movlw0x04;seta contador com 4pega_com:movwfTEMP;salva em temp

pega_c1:bsfSTATUS,C;seta o bit de carryrrfTECLA_L,1;roda a direitabtfssSTATUS,C;testa o carrygototabela_tec;carry=0, vai para tabeladecfszTEMP,1;decrementa tempgotopega_c1;loop, testa novamente

gotoerro_meu;ERRO! forca reset

pega8:movlw0x08;carrega W com 8gotopega_com;testa

pega12:movlw0x0C;carrega W com 12gotopega_compega16:movlw0x10;carrega W com 16gotopega_com;testa

;**********************************************;tabela com valores das teclas

tabela_tec:calltabela;chama tabelamovwfAUX1;salva Teclagotoacende;acende leds

tabela:decfTEMP,1;decrementa TEMPmovfTEMP,0;poe temp em waddwfPCL,F;soma W a PC

;Led 3 opera invertido, ento tabela deve passar bit 2 para PORT A;tambm invertido -> 0=1 e 1=0;valor de retornovalor real e tecla

retlw0x07;03 tecla 77H -> F3retlw0x03;07 tecla B7H -> F2retlw0x0F;11 tecla D7H -> F1retlw0x0B;15 tecla E7H -> E

retlw0x06;2 tecla 7BH -> 9retlw0x02;6 tecla BBH -> 6retlw0x0E;10 tecla DBH -> 3retlw0x0A;14 tecla EBH -> C

retlw0x05;1 tecla 7DH -> 8retlw0x01;5 tecla BDH -> 5retlw0x0D;9 tecla DDH -> 2retlw0x09;13 tecla EDH -> ponto

retlw0x04;0 tecla 7EH -> 7retlw0x00;4 tecla BEH -> 4retlw0x0C;8 tecla DEH -> 1retlw0x08;12 tecla EEH -> 0

;**********************************************;subrotina de temporizao

pausa: movlw 0xff ;carrega W com 255movwfT1;carrega T1 com Wcar_1: movlw 0xff ;carrega W com 255movwfT2;carrega T2 com 255dec_1:decfsz T2,1;decrementa T2gotodec_1;255 x T1 vezesdecfsz T1,1;decrementa T1goto car_1;volta a carregar T2retlw0x00;retorna 0 em W

;;**********************************************;fim do programa;**********************************************

endMICROCONTROLADORES PIC PRTICA - PARTE 5CONTROLE DE TECLADOS MATRICIAIS

TECLADO MATRICIALOs teclados matriciais so muito utilizados hoje em dia. Sempre que for necessrio coletar informaes em campo, no cho de fabrica, ou mesmo passar orientaes a um pequeno rob, podemos utilizar um teclado.

A figura acima demonstra alguns tipos de teclados matriciais. Estes teclados so formados basicamente por botes tipo normalmente abertos intercalados entre colunas e linhas. Veja a figura abaixo. Para saber qual tecla foi pressionada necessrio lera linha e coluna referente a tecla. Assim podemos determinar exatamente qual das teclas na matriz foi pressionada.

Porm como saber exatamente qual linha e qual coluna devemos analisar?!? E como garantir que estaremos analisando a linha e coluna da tecla esperada no exato momento em que ela foi pressionada?!?Para tal necessrio realizar uma operao muito conhecida no mundo dos microcontroladores,conhecida comovarredura. Observe a figura abaixo.

Voc pode observar que forado um valor fixo nas linhas. Este valor geralmente equivale ao 1 lgico (5V). Ento, o microcontrolador executa um loop inserindo um 0 lgico (GND) na coluna que dever ser lida e 1 lgico nas colunas que no deseja-se ler. Assim quando algum pressiona uma tecla na coluna onde existe o 0 lgico, imediatamente a linha referente tecla assume o valor 0 tambm. Por meio de uma interrupo ou mesmo atravs da leitura direta possvel saber qual linha teve seu valor inicial alterado. Como sabemos qual coluna estava em 0 naquele exato momento, podemos determinar atravs de uma tabela, qual tecla foi pressionada.Voc deve estar se perguntando:Mas como garantir que a tecla pressionada era realmente a que desejvamos ler?!?!Simples. A varredura faz isso. A varredura insere nas colunas o valor 0 com uma velocidade muito maiorque uma pessoa pressiona uma tecla. Este valor 0 inserido na primeira coluna, depois na segunda, e assim por diante at chegar a ltima. Se nenhuma tecla for pressionada, uma nova varredura iniciada na busca de uma tecla e assim o microcontrolador ficar em umloopeterno na busca de uma tecla.Resumindo: foramos os valores nas linhas igual a 1 lgico, inserimos 0 lgico na primeira coluna (mantendo todas as outras em 1) e lemos as linhas. Se nada se alterou, nenhuma tecla foi pressiona nas linhas referentes coluna. Passamos ento a forar o 0 na prxima coluna e novamente lemos as linhas. Isso feito at que uma das linhas seja alterada. Neste momento, verificamos uma tabela de decodificao que guarda o valor da tecla. Com este valor possvel saber exatamente qual tecla foi pressionada.

O CIRCUITONada melhor do que um pouco de prtica para uma melhor compreenso do que foi exposto. O circuito que serproposto a seguir demonstrar como utilizar um teclado matricial de quatro linhas e quatro colunas, tambm conhecido como teclado matricial 4 x 4 (16 teclas).Na figura abaixo temos o circuito eltrico para o exerccio proposto. O teclado ligado na porta B do PIC. Nesta porta o microcontrolador realiza toda a varredura para o teclado. Na porta A esto ligados quatro LEDs que sero utilizados para demonstrar o valor binrio da tecla pressionada. Chamaremos a tecla que fica no canto superior esquerdo da matriz de tecla 0, na linha 1 / coluna 1. Assim teremos as prximas colunas indicadas como 2, 3 e 4. O mesmo acontecendo para as linhas. As teclas so lidas sempre como linha / coluna. A tecla na linha 4 / coluna 4 ser a tecla 15.

Na tabela abaixo, voc encontrar os valores decimais e binrio de cada tecla, podendo assim dimensionar seu teclado para a resposta esperada nos LED's. O 1 binrio equivale ao LED aceso, o 0 equivale ao mesmo apagado.Tabela - Tecla e seu valor decimal e binrioTeclaValor DecimalValor BinrioTeclaValor DecimalValor Binrio

Linha 1 / Coluna 100000Linha 3 / Coluna 181000

Linha 1 / Coluna 210001Linha 3 / Coluna 291001

Linha 1 / Coluna 320010Linha 3 / Coluna 3101010

Linha 1 / Coluna 430011Linha 3 / Coluna 4111011

Linha 2 / Coluna 140100Linha 4 / Coluna 1121100

Linha 2 / Coluna 250101Linha 4 / Coluna 2131101

Linha 2 / Coluna 360110Linha 4 / Coluna 3141110

Linha 2 / Coluna 470111Linha 4 / Coluna 4151111

O PROGRAMAO cdigo fonte para gravar o microcontrolador pode ser obtido nesta pgina, mais abaixo, no itemDownloads. E na figura abaixo temos o fluxograma do exemplo proposto. Meu programa exemplo funciona executando constantemente a varredura do teclado. Voc notar que entre o deslocamento de uma coluna e outra sempre feito umdelayde algunsmilisegundos, para assegurar tempo suficiente para a deteco da tecla. Se isso no fosse feitoa varredura no teclado seria muito rpida e umatecla pressionada poderia ser detectada vrias vezes durante o seu acionamento.Tambm existe um outrodelayinserido aps a tecla ter sido detectada, para segurar ainda mais a velocidade da varredura, evitando mais uma vez o repique da tecla.

Aps a deteco e a decodificao da tecla atravs da tabela, a mesma transportada para a porta A, para ligar/desligar os LEDs de acordo com o valor inserido na tabela. Este valor ficar exposto atravs dos LEDs at que uma tecla diferente seja pressionada.O cdigo fonte tambm foi extensamente comentado para facilitar a compreenso das rotinas empregadas. Com a alterao deste cdigo fonte possvel, por exemplo, fazer a varredura de teclados telefnicos 4 x 3 (4 linhas, 3 colunas), 3 x 3 (3 linhas, 3 colunas) e at mesmo teclados maiores como os de 44 teclas (4 linhas, 11 colunas).As aplicaes para este tipo de circuito so vastas: tranca microcontrolada, teclado para micro-terminal de dados, operao de um rob, habilitao de processos atravs de senhas, controle de mquinas, etc.

CONCLUSOEspero ter ajudado voc que busca por informaes sobre teclados matriciais e seu controle atravs dos microcontroladores PIC. Mais uma vez chamo a ateno para a importncia da compreenso do conceito! As linguagens de programao mudam, mas a aplicao de um conceito sempre a mesma, independente da Linguagem. Tenha isso sempre em mente!

DOWNLOADS:-Cdigo fonte

Lista de materiaisMaterial para o exerccio proposto

SemicondutoresCI1 PIC16F84A-04/P microcontrolador MicrochipD1, D2, D3, D4 1N4149 diodos de sinal (silcio)D5, D6, D7, D8 Leds comuns redondos (vermelhos)

ResistoresR2, R3, R4, R5 4K7 (amarelo, viloleta, vermelho)R1, R6, R7, R8, R9 330R (laranja, laranja, marrom)

CapacitoresC1, C2 33pF cermicoC3 100nF cermico

DiversosCristal 4MHz, teclado matricial 4x4 ou 16 push-buttons NA (veja texto), matriz de contatos ou placa, fios para ligao, etc.

Copyright deste contedo reservado para Mrcio Jos Soares e protegido pela Lei de Direitos Autorais LEI N 9.610, de 19 de Fevereiro de 1998. estritamente proibida a reproduo total ou parcial do contedo desta pgina em outros pontos da internet,livros ou outros tipos de publicaes comerciais ou no, sem a prvia autorizao por escrito do autor.