Você está na página 1de 36

Leitura de teclas e teclado matricial

Rodrigo Almeida

Universidade Federal de Itajubá

rodrigomax@unifei.edu.br

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 1 / 33


Revisão

Revisão

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 2 / 33


Revisão

Multiplexação dos displays

Multiplexar: Consiste em combinar diversos sinais num único canal de


transmissão
Vantagens
Redução de custos com cabeamento e tamanho de placa
Utilização de uma quantidade maior de dispositivos que saı́das
disponı́veis
Desvantagens
Perda de tamanho de banda devido a efeitos de overhead
Discretização do tempo no acionamento dos dispositivos
Aumento da complexidade do sistema

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 3 / 33


Revisão

Display de 7 segmentos

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 4 / 33


Revisão

Multiplexação dos displays

Rotina para acionar displays de 7 segmentos multiplexados:


1 colocar no barramento de dados o valor a ser mostrado no display X
2 ligar o display X através da linha de comando
3 esperar um tempo adequado para evitar flicker
4 desligar o display
5 escolher o próximo display (X+1)
6 voltar ao passo 1

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 5 / 33


Revisão

Atenção

ATENÇÃO

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 6 / 33


Revisão

Variáveis globais-locais

Armazenamento de dados dentro de uma biblioteca


Usado sempre que for necessário passar valores entre funções dentro
de um mesmo arquivo ou armazenar valores que não podem ser
perdidos ao longo da execução do programa. Ex: o display que está
atualmente ligado
É feito através de variáveis ”globais-locais”1
As variáveis devem possuir o atributo static
Usar sempre o menor tamanho possı́vel pois estas variáveis são
alocadas permanentemente, reduzindo a memória RAM disponı́vel.
Devem ser inicializadas dentro da função principal da biblioteca

1
Global dentro do escopo da biblioteca, local pois não pode ser acessada fora do
arquivo
ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 7 / 33
Leitura de Teclas

Leitura de Teclas

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 8 / 33


Leitura de Teclas

Leitura de Teclas

Criação de um circuito para entrada de informação digital


A saı́da deve possuir apenas dois estados
O consumo de energia deve ser o mı́nimo possı́vel
As tensões devem ser compatı́veis com o circuito (TTL, CMOS, etc...)

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 9 / 33


Leitura de Teclas

Exemplo Eletrônico

http://www.scienceprog.com/how-does-tri-state-buffers-work/

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 10 / 33


Leitura de Teclas

Exemplo Eletromecânico

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 11 / 33


Leitura de Teclas

Bounce

Problema de bouncing
Causado pela oscilação mecânica da chave
Pode gerar acionamentos indevidos no sistema
Soluções
Via hardware através de circuito dedicado
Via software através de confirmação temporal

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 12 / 33


Leitura de Teclas

Bounce

Circuito com bouncing

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 13 / 33


Leitura de Teclas

Debounce

Debounce por hardware


Não gasta processamento
Protege o circuito contra surtos
Auxilia na estabilidade do sistema pois funciona como filtro
Gera delay de R × C na resposta

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 14 / 33


Leitura de Teclas

Debounce

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 15 / 33


Leitura de Teclas

Debounce

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 16 / 33


Leitura de Teclas

Debounce

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 17 / 33


Leitura de Teclas

Debounce

Debounce por software


Consome tempo e recurso do processador
Não necessita de hardware ($$$) extra
Gera delay de acordo com a rotina desenvolvida
É preciso conhecer aproximadamente o tempo de estabilização da chave
Ex: Para debounce de 150 (µs) = 300 ciclos de clock 2

2
Um PIC com cristal de 8MHz tem cada ciclo com duração de 0,5 (µs)
ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 18 / 33
Leitura de Teclas

Debounce

1 void main ( void ) {


2 unsigned char valTemp , valAtual , tempo ;
3 // inserir as c o n f i g u r a ç ~
o e s n e c e s s á r i a s aqui
4 for (;;) {
5 while ( valAtual == PORTB ) ; // aguarda uma mudança na porta B
6 valTemp = PORTB ; // na mudança , aguarda um tempo
7 tempo = 42 ;
8 while ( tempo > 0 ) {
9 if ( valTemp == PORTB ) { // se n~ a o mudar c o n t i n u a a contar
10 tempo - -;
11 } else {
12 valTemp = PORTB ; // se mudar , a t u a l i z a e r e i n i c i a
13 tempo = 42 ;
14 }
15 }
16 valAtual = valTemp ; // valor a t u a l i z a d o ;
17 // Aqui a v a r i á v e l está pronta para ser usada
18 }
19 }

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 19 / 33


Leitura Matricial

Leitura Matricial

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 20 / 33


Leitura Matricial

Leitura Matricial

Para cada tecla inserida no projeto, do modo apresentado até agora, é


necessário um terminal de I/O no microcontrolador
Projetos que exigem muitos terminais são mais caros por vários
motivos
O encapsulamento pode gerar entre 5 e 30% de diferença no preço 3
O processo de inserção e soldagem de componentes é mais caro 4
O tamanho e complexidade da placa aumenta (quantidade da camadas,
roteamento, etc...)
Para entradas digitais tipo teclado existe uma alternativa: Leitura por
varredura matricial

3
18f4520 = US$4,47, 18f2550 = US$3,98
4
Geralmente componentes com muitos terminais tem encapsulamento SMD/QFP ou
BGA
ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 21 / 33
Leitura Matricial

Leitura Matricial

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 22 / 33


Leitura Matricial

Leitura Matricial

Na leitura por varredura matricial temos:


5
Aumento da quantidade de chaves que podem ser lidas
Aumento da complexidade do software
Atraso na detecção de eventos (devido à varredura)

5
Para N terminais disponı́veis no microcontrolador, temos um aumento de N chaves
para ( N2 )2 chaves
ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 23 / 33
Leitura Matricial

Leitura Matricial

1 void main ( void ) {


2 unsigned char i , j ;
3
4 // a r m a z e n a valor de cada chave
5 unsigned char chave [ 4 ][ 4 ] = {{ 0 ,0 ,0 , 0 } ,{0 ,0 ,0 , 0 } ,
6 {0 ,0 ,0 , 0 } ,{0 ,0 ,0 , 0 }};
7 // h a b i l i t a pull−up interno
8 BitClr ( INTCON2 , 0 ) ;
9 // apenas AN0 é analógico , os demais s~ ao digitais
10 ADCON1 = 0b00001110 ;
11 // os 4 últimos bits s~ a o entradas , os 4 p r i m e i r o s ←-
( i n i c i a l m e n t e ) saı́das
12 TRISB = 0xF0 ;
13 TRISD = 0x00 ;
14 for (;;)
15 {
16 // p r o c e s s o de v a r r e d u r a
17 }
18 }

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 24 / 33


Leitura Matricial

Leitura Matricial

1 // p r o c e s s o de v a r r e d u r a
2 for ( i = 0 ; i < 4 ; i ++) {
3 // apenas a coluna de i n t e r e s s e é c o n f i g u r a d a como saı́da
4 TRISB = ~(( unsigned char )1 < < i ) ;
5 // apenas a coluna de i n t e r e s s e é ligada
6 PORTB = ~(( unsigned char )1 < < i ) ;
7
8 for ( j = 0 ; j < 4 ; j ++) { // j<2 sem usar a fonte
9 if (! BitTst ( PORTB , j + 4 ) ) { // realiza o teste para cada bit
10 chave [ i ][ j ] = 1 ; // a t u a l i z a a matriz
11 } else {
12 chave [ i ][ j ] = 0 ;
13 }
14 }
15 }

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 25 / 33


Leitura Matricial

Processo de Varredura

Atenção
O código não apresenta debounce em software para as teclas.
A operação com uma matriz gasta muito processamento e memória.
Para minimizar estes gastos podemos representar cada chave como
um bit numa variável.
A operação de debounce será apresentada nas funções a seguir.

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 26 / 33


Criação da biblioteca teclado

Criação da biblioteca teclado

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 27 / 33


Criação da biblioteca teclado

Criação da biblioteca teclado

Funções necessárias para a criação de uma biblioteca que realiza a leitura


de um teclado matricial e disponibiliza as teclas pressionadas:
Inicialização()
Configura os terminais de acionamento e de leitura
Debounce()
Realiza a leitura das teclas (varredura)
Realiza o debounce dos valores
Armazena internamente as teclas pressionadas
LerTeclas()
Retorna uma variável unsigned int
Cada bit desta variável representa uma tecla
0 = desligado, 1 = pressionado

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 28 / 33


Criação da biblioteca teclado

Criação da biblioteca teclado

1 # include " keypad . h "


2 # include " pic18f4520 . h "
3
4 static unsigned char valor = 0x00 ;
5 static unsigned char tempo ;
6
7 void kpInit ( void ) {
8 // quatro e n t r a d a s e quatro saidas ( i n i c i a l m e n t e )
9 TRISB = 0xF0 ;
10 // liga pull up
11 BitClr ( INTCON2 , 7 ) ;
12 // apenas AN0 é analogico , a r e f e r e n c i a é baseada na fonte
13 ADCON1 = 0b00001110 ;
14 }
15
16 unsigned char kpRead ( void ) {
17 return valor ;
18 }

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 29 / 33


Criação da biblioteca teclado

Criação da biblioteca teclado

1 void kpDevounce ( void ) {


2 unsigned char i , j ;
3 static unsigned int valorNovo = 0x0000 ;
4 static unsigned int valorAntigo = 0x0000 ;
5 for ( i = 0 ; i < 4 ; i ++) {
6 TRISB = ~(( unsigned char )1 < < i ) ;
7 PORTB = ~(( unsigned char )1 < < i ) ;
8 // realiza o teste para cada bit e a t u a l i z a a v a r i á v e l
9 for ( j = 0 ; j < 4 ; j ++) {
10 if (! BitTst ( PORTB , j + 4 ) ) {
11 BitSet ( valorNovo , ( i * 4 ) + j ) ;
12 } else {
13 BitClr ( valorNovo , ( i * 4 ) + j ) ;
14 }
15 }
16 }
17 // c o n t i n u a

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 30 / 33


Criação da biblioteca teclado

Criação da biblioteca teclado

1 // rotina de d e b o u n c e
2 // a cada chamada o tempo é d e c r e m e n t a d o em 1un .
3 if ( valorAntigo == valorNovo ) {
4 tempo - -;
5 } else {
6 tempo = 10 ;
7 valorAntigo = valorNovo ;
8 }
9 if ( tempo == 0 ) {
10 valor = valorAntigo ;
11 }
12 }

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 31 / 33


Criação da biblioteca teclado

Header

Header

1 # ifndef TECLADO_H
2 # define TECLADO_H
3 unsigned int LerTeclas ( void ) ;
4 void Debounce Teclas ( void ) ;
5 void I n i c i a l i z a T e c l a d o ( void ) ;
6 # endif // T E C L A D O H

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 32 / 33


Criação da biblioteca teclado

Uso da Biblioteca

1 # include " pic18f4520 . h "


2 # include " config . h "
3 # include " keypad . h "
4
5 // inı́cio do p r o g r a m a
6 void main ( void ) {
7 kpInit () ;
8 // C o n f i g u r a a porta D como saı́da
9 TRISD = 0x00 ;
10 // desliga todos os leds
11 PORTD = 0xFF ;
12 for (;;) {
13 kpDebounce () ;
14 PORTD = kpRead () ;
15 }
16 }

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 33 / 33


Contagem de pressionamentos

Contagem de pressionamentos

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 34 / 33


Contagem de pressionamentos

Uso da Biblioteca

1 # include " pic18f4520 . h "


2 # include " config . h "
3 # include " keypad . h "
4
5 // inı́cio do p r o g r a m a
6 void main ( void ) {
7 char count = 0 ;
8 kpInit () ;
9 ssdInit () ;
10 for (;;) {
11 kpDebounce () ;
12 ssdUpdate () ;
13 if ( BitTst ( kpRead () ,0 ) ) {
14 count ++;
15 ssdDigit ( count , 0 ) ;
16 }
17 }
18 }

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 35 / 33


Contagem de pressionamentos

Contagem de pressionamentos

Porque o código anterior não funciona?


Estados de uma chave
Detecção do evento
Não aguardar mudança
Executar exemplo na placa.

ECOP04 Leitura de teclas e teclado matricial rodrigomax@unifei.edu.br 36 / 33

Você também pode gostar