1. Leitura de teclas e teclado matricial
Prof.MSc.Rodrigo Maximiano Antunes de Almeida
Universidade Federal de Itajubá
rodrigomax@unifei.edu.br
ELT024 Leitura de teclas e teclado matricial
2. Display de 7 segmentos
Revisão
ELT024 Leitura de teclas e teclado matricial
3. Display de 7 segmentos
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 quantitade 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
ELT024 Leitura de teclas e teclado matricial
4. Display de 7 segmentos
ELT024 Leitura de teclas e teclado matricial
5. Display de 7 segmentos
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
ELT024 Leitura de teclas e teclado matricial
9. 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
ELT024 Leitura de teclas e teclado matricial
11. Display de 7 segmentos
Criação da biblioteca disp7seg
• 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...)
ELT024 Leitura de teclas e teclado matricial
12. Leitura de Teclas
Circuito básico
Exemplo Eletrônico
http://www.scienceprog.com/how-does-tri-state-buffers-
work/
ELT024 Leitura de teclas e teclado matricial
13. Leitura de Teclas
Circuito básico
Exemplo Eletro-mecânico
http://www.labbookpages.co.uk/electronics/debounce.html -
Dr. Andrew Greensted
ELT024 Leitura de teclas e teclado matricial
14. Leitura de Teclas
Debounce
• 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
ELT024 Leitura de teclas e teclado matricial
15. Leitura de Teclas
Debounce
Circuito com bouncing
http://www.labbookpages.co.uk/electronics/debounce.html - Dr. Greensted
ELT024 Leitura de teclas e teclado matricial
16. 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
ELT024 Leitura de teclas e teclado matricial
17. Leitura de Teclas
Debounce
http://www.ikalogic.com/debouncing.php - Ibrahim Kamal
ELT024 Leitura de teclas e teclado matricial
18. Leitura de Teclas
Debounce
Circuito sem bouncing - debounce
http://www.labbookpages.co.uk/electronics/debounce.html - Dr. Greensted
(modificado)
ELT024 Leitura de teclas e teclado matricial
19. 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)
ELT024 Leitura de teclas e teclado matricial
20. Leitura de Teclas
Debounce
1 void main(void) {
2 unsigned char valTemp, valAtual, tempo;
3 //inserir as configurações necessárias 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 = 22;
8 while (tempo > 0) {
9 if (valTemp == PORTB) { // se não mudar continua a contar
10 tempo--;
11 } else {
12 valTemp = PORTB; // se mudar, atualiza e reinicia
13 tempo = 22;
14 }
15 }
16 valAtual = valTemp; //valor atualizado;
17 //Aqui a variável está pronta para ser usada
18 }
19 }
ELT024 Leitura de teclas e teclado matricial
22. Leitura Matricial
Introdução
• 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 até 10% de diferença no preço 3
• O processo de inserção e soldagem de compontentes é 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
PIC18F4550 TQFP = US$4,42, DIP = US$7,00
4
Geralmente componentes com muitos terminais tem encapsulamento
SMD/QFP ou BGA
ELT024 Leitura de teclas e teclado matricial
23. Leitura Matricial
Circuito básico
ELT024 Leitura de teclas e teclado matricial
24. Leitura Matricial
Vantagens e Desvantagens
• Na leitura por varredura matricial temos:
• Aumento da quantidade de chaves que podem ser lidas 5
• 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 ( N )2 chaves
2
ELT024 Leitura de teclas e teclado matricial
25. Leitura Matricial
Configurações
1 void main(void)
2 {
3 unsigned char i,j;
4 //armazena 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 //habilita pull-up interno
8 BitClr(INTCON2,0);
9 //apenas AN0 é analógico, os demais são digitais
10 ADCON1 = 0b00001110;
11 //os 4 últimos bits são entradas, os 4 primeiros saídas
12 TRISB = 0xF0;
13 TRISD = 0x00;
14 for(;;)
15 {
16 //processo de varredura
17 }
18 }
ELT024 Leitura de teclas e teclado matricial
26. Leitura Matricial
Processo de Varredura
1 //processo de varredura
2
3 for(i = 0; i < 4; i++){
4 PORTB = 0xff; //liga todas as colunas
5 for(j = 0; j < 100; j++);
6 BitClr(PORTB,i); //desliga coluna a ser testada
7 for(j = 0; j < 100; j++); //gasta tempo (garantir estabilidade)
8 for(j = 0; j < 4; j++){
9 if (!BitTst(PORTB,j+4)){ //realiza o teste para cada bit
10 chave[i][j] = 1; //atualiza a matriz
11 BitSet(PORTD,j+4*i); //mostra na porta D
12 }else{
13 chave[i][j] = 0;
14 BitClr(PORTD,j+4*i);
15 }
16 }
17 }
ELT024 Leitura de teclas e teclado matricial
27. Leitura Matricial
Processo de Varredura
Atenção
O código não apresenta debounce em software para as teclas. Além
disso a operação com 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.
ELT024 Leitura de teclas e teclado matricial
28. Leitura Matricial
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
ELT024 Leitura de teclas e teclado matricial
29. Leitura Matricial
Criação da biblioteca teclado
1 #include "teclado.h"
2 #include "basico.h"
3 static unsigned int valor = 0x0000;
4 static unsigned char tempo;
5 void InicializaTeclado(void)
6 {
7 TRISB = 0xF0; //quatro entradas e quatro saídas
8 BitClr(INTCON2,0); //habilita pull-up
9 ADCON1 = 0b00001110; //apenas AN0 é analógico
10 SPPCFG = 0x00; //a porta B não opera como paralela
11 tempo = 10; //tempo para debounce
12 }
13
14 unsigned int LerTeclas(void)
15 {
16 return valor;
17 }
ELT024 Leitura de teclas e teclado matricial
30. Leitura Matricial
Criação da biblioteca teclado
1 void DebounceTeclas(void){
2 unsigned char i,j;
3 unsigned int valorNovo = 0x0000;
4 unsigned int valorAntigo = 0x0000;
5 for(i = 0; i < 4; i++){
6 PORTB |= 0x0F; //desliga todas as colunas
7 BitClr(PORTB,(i)); //liga a coluna correspondente
8 for(j=0;j<100;j++); //gasta tempo (estabilidade)
9 for(j = 0; j < 4; j++){//teste para cada bit, atualiza a variáve
10 if (!BitTst(PORTB,j+4)){
11 BitSet(valorNovo,(i*4)+j);
12 }else{
13 BitClr(valorNovo,(i*4)+j);
14 }
15 }
16 }
17 //continua
ELT024 Leitura de teclas e teclado matricial
31. Leitura Matricial
Criação da biblioteca teclado
18 //rotina de debounce
19 //a cada chamada o tempo é decrementado em 1un.
20 if (valorAntigo == valorNovo){
21 tempo --;
22 }else{
23 tempo = 10;
24 valorAntigo = valorNovo;
25 }
26 if (tempo == 0){
27 valor = valorAntigo;
28 }
29 }
ELT024 Leitura de teclas e teclado matricial
33. Leitura Matricial
Uso da Biblioteca
Exemplo de uso da biblioteca
1 #include "basico.h"
2 #include "config.h"
3 #include "teclado.h"
4
5 //inicio do programa
6 void main(void)
7 {
8 InicializaTeclado();
9 TRISD = 0x00; //Configura a porta D como saída
10 PORTD = 0xFF; //desliga todos os leds
11 while (1==1)
12 {
13 DebounceTeclas();
14 PORTD = LerTeclas();
15 }
16 }
ELT024 Leitura de teclas e teclado matricial