Você está na página 1de 40

Teclado Matricial

Curso Técnico de Nível Médio Integrado – Eletrônica - 8o Período


Disciplina de Microcontroladores 2 (EL08D) – 1º Sem 2016
Professor Gabriel Kovalhuk
Email: kovalhuk@utfpr.edu.br
Página pessoal: http://paginapessoal.utfpr.edu.br/kovalhuk

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Rotinas de debounce

Rotinas de debounce

(As informações desta seção foram retiradas do site:


https://www.embarcados.com.br/leitura-de-chaves-debounce/
em 02/04/2017)

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Rotinas de debounce

Um dos métodos mais simples de entrar com informações em


sistemas digitais são as chaves, ou teclas, mecânicas;

Vcc

R1
10kW

Figura 1. Exemplo de uso Figura 2. Exemplos de


de uma chave simples para chaves e teclas mecânicas
entrada de dados em
sistemas digitais

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Rotinas de debounce


Porém, estas chaves apresentam o problema de repique,
comumente chamadas de bounce;

Isto é interpretado pelo processador como se a chave tivesse sido
pressionada diversas vezes;

Figura 3. exemplo do efeito de repique numa chave simples


Fonte: http://www.labbookpages.co.uk/electronics/debounce.html - Dr. Andrew Greensted

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Rotinas de debounce


Uma solução, por hardware, é colocar um capacitor em paralelo
com a chave;

Isto faz com que o tempo, na carga, do capacitor, diminua o efeito
do repique;

Figura 4. circuito para diminuir o efeito do repique

Fonte: http://www.ikalogic.com/debouncing.php - Ibrahim Kamal Fonte: http://www.labbookpages.co.uk/electronics/debounce.html - Dr. Andrew Greensted

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Rotinas de debounce


outra solução e fazer o debounce por software;

Existem diversas técnicas de debounce por software;

Uma delas consiste em fazer a leitura da chave por um número
determinado de vezes e verificar se o pino alcançou a
estabilidade;

O número de vezes que o estado da chave será verificado
depende do clock do processador e do tempo que ocorre o
repique (uns 130us no caso da figura 3)

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Rotinas de debounce
char letecla()
{
tecla = pino; // obtem o valor atual do pino onde esta a chave
while(tecla == pino); // espera por uma mudança de estado
// no pino, isto pode ser que a chave foi
// pressionada ou que a chave foi solta

// quando houve uma mudanca de estado no pino, espera estabilizar

tecla = pino;
tempo = 22; // define o “tempo” de espera para
// alcancar a estabilidade
while(tempo > 0)
{
if(tecla == pino) // se nao houve mudanca,
tempo --; // decrementa a contagem de tempo
else // se houve mudanca,
{
tecla = pino; // reinicia o processo
tempo = 22;
}
}
return tecla;
}

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Teclado Matricial

Teclado Matricial

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Teclado Matricial


Teclado: conjunto de teclas (chaves) para entrada de dados em
sistemas microprocessados;

Para poucas teclas, pode-se usar diretamente os pinos de GPIO do
microcontrolador;

A medida que a quantidade de teclas aumenta, o microcontrolador
pode não ter mais pinos suficientes para cada chave;

Solução: usar multiplexação. Uma maneira muito usual de
implementar a multiplexação são os teclados matriciais;

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Teclado Matricial

Funcionamento:
Realize-se a varredura das colunas, ativando-se uma coluna de
cada vez;
Para cada coluna ativa, verifica-se a situação das linhas. Caso
alguma tecla tenha sido pressionada, a linha desta tecla terá
o valor da coluna;
Sabendo-se qual é a coluna e qual é a linha, pode-se determinar
qual é a tecla pressionada;

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Teclado Matricial

C D E F
R1Pull-up
P1.0
8 9 A B
R2Pull-up
P1.1

4 5 6 7
R3Pull-up Vcc
P1.2
0 1 2 3
R4Pull-up
P1.3

P1.4
P1.5

P1.6

P1.7

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Teclado Matricial

C D E F
R1Pull-up
P1.0 == 1
8 9 A B
R2Pull-up
P1.1 == 1

4 5 6 7
R3Pull-up Vcc
P1.2 == 1
0 1 2 3
R4Pull-up
P1.3 == 1

P1.4 ← 0
P1.5 ← 1

P1.6 ← 1

P1.7 ← 1

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Teclado Matricial

C D E F
R1Pull-up
P1.0 == 1
8 9 A B
R2Pull-up
P1.1 == 1

4 5 6 7
R3Pull-up Vcc
P1.2 == 1
0 1 2 3
R4Pull-up
P1.3 == 1

P1.4 ← 1
P1.5 ← 0

P1.6 ← 1

P1.7 ← 1

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Teclado Matricial

C D E F
R1Pull-up
P1.0 == 1
8 9 A B
R2Pull-up
P1.1 == 1

4 5 6 7
R3Pull-up Vcc
P1.2 == 1
0 1 2 3
R4Pull-up
P1.3 == 1

P1.4 ← 1
P1.5 ← 1

P1.6 ← 0

P1.7 ← 1

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Teclado Matricial

C D E F
R1Pull-up
P1.0 == 1
8 9 A B
R2Pull-up
P1.1 == 1

4 5 6 7
R3Pull-up Vcc
P1.2 == 1
0 1 2 3
R4Pull-up
P1.3 == 1

P1.4 ← 1
P1.5 ← 1

P1.6 ← 1

P1.7 ← 0

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Teclado Matricial

C D E F
R1Pull-up
P1.0 == 1
8 9 A B
R2Pull-up
P1.1 == 1

4 5 6 7
R3Pull-up Vcc
P1.2 == 1
0 1 2 3
R4Pull-up
P1.3 == 1

P1.4 ← 1
P1.5 ← 1
Tecla 9
Pressionada
P1.6 ← 1

P1.7 ← 1

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Teclado Matricial

C D E F
R1Pull-up
P1.0 == 1
8 9 A B
R2Pull-up
P1.1 == 1

4 5 6 7
R3Pull-up Vcc
P1.2 == 1
0 1 2 3
R4Pull-up
P1.3 == 1

P1.4 ← 0
P1.5 ← 1 Coluna 1
Ativada
P1.6 ← 1 (em nível 0)

P1.7 ← 1

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Teclado Matricial

C D E F
R1Pull-up
P1.0 == 1
8 9 A B
R2Pull-up
P1.1 == 1

4 5 6 7
R3Pull-up Vcc
P1.2 == 1
0 1 2 3
R4Pull-up
P1.3 == 1

P1.4 ←0
P1.5 ← 1 Como não é a coluna
da chave pressionada,
P1.6 ← 1 todas as linhas (entradas)
estão em nível lógico 1
P1.7 ← 1

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Teclado Matricial

C D E F
R1Pull-up
P1.0 == 1
8 9 A B
R2Pull-up
P1.1 == 1

4 5 6 7
R3Pull-up Vcc
P1.2 == 1
0 1 2 3
R4Pull-up
P1.3 == 1

P1.4 ← 1
P1.5 ← 0 Coluna 2
Ativada
P1.6 ← 1 (em nível 0)

P1.7 ← 1

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Teclado Matricial

C D E F
R1Pull-up
P1.0 == 1
8 9 A B
R2Pull-up
P1.1 == 0

4 5 6 7
R3Pull-up Vcc
P1.2 == 1
0 1 2 3
R4Pull-up
P1.3 == 1

P1.4 ← 1
P1.5 ← 0 Como é a coluna
da chave pressionada,
P1.6 ← 1 a linha 2 está em
nível lógico 0
P1.7 ← 1

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Teclado Matricial

Sabendo-se que é a coluna 2 e linha 2, sabemos que a tecla 9 foi
pressionada.

Uma vez encontrada a tecla, pode-se terminar a varredura. Neste
caso apenas uma tecla será encontrada para cada varredura.

Se for necessário, pode-se continuara a varredura para verificar se
não existem duas ou mais teclas pressionadas
simultaneamente.

Para fazer uma rotina de debounce, é aconselhável ler todas as
quatro entradas simultaneamente e aplicar a rotina de
debounce sobre estas quatro entradas.

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Display LCD

Display LCD

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Display LCD

LCD – Display de Cristal Líquido;

Dispositivo de saída, usado para mostrar informações do sistema;

Os LCDs inteligentes possuem um controlador, que recebe as
informações do sistema, processa e aciona os segmentos dos
displays;

Os controladores mais comuns usam o padrão Hitachi HD44780;

Estes LCDs podem ter diferentes configurações de caracteres,
sendo as mais populares 16x2 (16 caracteres em duas linhas)
e 20x4 (20 caracteres em 4 linhas);

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Display LCD

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


2017 – Gabriel Kovalhuk
A - Anode (backlight)
16 15
Display LCD

K – Cathode (backlight)
Vss - GND
1

VDD - Vcc
2

Vo - Contraste

EL08D - MICROCONTROLADORES 2
3

RS – Register Select
4

RW- Read/Write
5
E - Enable
6
DB0 – Data Bus 0
7
DB1 – Data Bus 1
8
DB2 – Data Bus 2

14 13 12 11 10 9
DB3 – Data Bus 3
DB4 – Data Bus 4
DB5 – Data Bus 5
DB6 – Data Bus 6
Pinagem
DB7 – Data Bus 7
Display LCD

A pinagem consiste em:



8 pinos de dados: realiza a comunicação entre o microcontrolador
e o display. Pode ser configurado para operar com 4 bit ou
com 8 bits;

3 pinos de controle:

E (Enable): habilita a transferência de dados entre o
microcontrolador e o LCD;

R/W (Read/Write): seleciona uma operação de leitura ou
de escrita no LCD;

RS (Register Select): define se o dado transferido é um
caracter (em código ASCII) ou um comando;
EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk
Display LCD


2 pinos de alimentação;

1 pino para ajuste do contraste do LCD: ajusta o contraste do
LCD;

2 pinos para alimentação da luz de fundo (backlight);

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Display LCD


Os três pinos de controle permitem a seguinte combinação de
operações:

E RS R/W Operação
0 0 0 Nenhuma operação
1 0 0 Escrita de comando
1 0 1 Leitura de status
1 1 0 Escrita de caracter
1 1 1 Leitura de caracter

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Display LCD
Configuração e Operação

Como o LCD é um dispositivo muito lento, é necessário gerar
períodos de espera entre um comando e outro. Normalmente
um tempo de ~5ms é suficiente para os vários tipos de
displays;

A configuração inicial do LCD define o seu modo de operação,
como por exemplo, se o barramento de dados será de 4 ou de
8 bits;

A configuração é feita enviando comandos ao LCD. Neste caso o
pino RS deve estar em nível lógico 0 (zero), assim como
opino R/W.

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Display LCD

Exemplo de utilização com o MSP430G2553

+3,3v*

Vcc

MSP430
LCD_EN +5v* +5v*
P2.2
LCD_RS
P2.3 100nF
LCD_D4
P2.4 10kW
LCD_D5
P2.5
LCD_D6
P2.6 LCD_D8 Deixar R/W
P2.7 sempre em 0
Deixar D0 a
D3 em aberto
Vss

Lembrar de
ligar todos os
GNDs juntos
*Atenção: Não ligar o Vcc do
MSP ao Vcc do Display
EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk
Display LCD

Definições dos pinos usados nas funções


#define LCD_EN BIT2
#define LCD_RS BIT3
#define LCD_D4 BIT4
#define LCD_D5 BIT5
#define LCD_D6 BIT6
#define LCD_D7 BIT7
#define LCD_BUS P2OUT
#define LCD_DIR P2DIR

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Display LCD
Função de Configuração para barramento de 4 bits
void lcd_init()
{
LCD_DIR |= LCD_EN + LCD_RS + LCD_D7 + LCD_D6 + LCD_D5 +
LCD_D4); // configura os pinos de saida de P1 que irao se
// comunicar com o LCD
LCD_BUS &= ~LCD_RS; // coloca display em modo de comando
for(int i=0;i<3;i++)
{
__delay_cycles(15000); // espera lcd
LCD_BUS &= 0x0F;
LCD_BUS |= 0x30; // envia comando de configuração
LCD_BUS |= LCD_EN; // envia pulso de enable
LCD_BUS &= ~LCD_EN;
}
lcd_cmd(0x28); // configura barramento de dados de 4 bits,
// e habilita 2 linhas do LCD
lcd_cmd(0x0C); // torna o cursor visivel
lcd_cmd(0x01); // limpa o LCD
lcd_cmd(0x06); //habilita o modo de auto incremento do cursor
}
EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk
Display LCD

Função enviar um comando para o display


void lcd_cmd(unsigned char cmd)
{
LCD_BUS &= ~LCD_RS; // coloca LCD em modo de comando
__delay_cycles(5000); // espera 5ms
LCD_BUS &= 0x0F; // zera a parte mais significativa de
// LCD_DATA (P2OUT)
LCD_BUS |= (cmd & 0xF0); // envia a parte alta do comando
LCD_BUS |= LCD_EN; // gera pulso para LCD
LCD_BUS &= ~LCD_EN;
LCD_BUS &= 0x0F; // zera a parte mais significativa de
// LCD_DATA (P2OUT)
LCD_BUS |= (cmd << 4); // envia a parte baixa do comando
LCD_BUS |= LCD_EN; // gera pulso para LCD
LCD_BUS &= ~LCD_EN;
}

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Display LCD

Função enviar um caracter para o display


void lcd_putch(unsigned char ch)
{
LCD_BUS |= LCD_RS; // coloca LCD em modo de dados
__delay_cycles(5000); // espera 5ms
LCD_BUS &= 0x0F; // zera a parte mais significativa de
// LCD_DATA (P1OUT)
LCD_BUS |= (ch & 0xF0); // envia a parte alta do comando
LCD_BUS |= LCD_EN; // gera pulso para LCD
LCD_BUS &= ~LCD_EN;
LCD_BUS &= 0x0F; // zera a parte mais significativa de
// LCD_DATA (P1OUT)
LCD_BUS |= (ch << 4); // envia a parte baixa do comando
LCD_BUS |= LCD_EN; // gera pulso para LCD
LCD_BUS &= ~LCD_EN;
}

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Display LCD

Alguns Comandos básicos do LCD:


Comando de configuração:
DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 1 DL N F x x

DL = no de bits do barramento:

DL = 0 → 4 bits;

DL = 1 → 8 bits;
N = nº de linhas a serem usadas no LCD:

N = 0 → 1 linha;

N = 1 → 2 linhas;
F = configuração da matriz de caracteres:

F = 0 → 5x7 pixels;

F = 1 → 5x10 pixels;
EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk
Display LCD

Comando de controle do display:

DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0


0 0 0 0 1 D C B

D: define o estado do display:



D = 0 → desativado (o conteúdo da memória não é apagado);

D = 1 → ativado;
C: define se o cursor aparece ou não no display:

C = 0 → cursor não aparece;

C = 1 → cursor aparece;
B: define se o cursor pisca ou não:

B = 0 → cursor não pisca;

B = 1 → cursor pisca;

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Display LCD

Comando para limpar o display:


DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 0 1

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Display LCD

Comando para posicionar o cursor:



Cada caracter possui um endereço (de memória RAM) específico;

Estes endereços são mostrados abaixo para um display 16x2:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F


Para um display de 20x4 caracteres temos os seguintes endereços:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13
40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53
14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27
54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67


Para posicionar o cursor, usa-se o seguinte comando:
DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 a a a a a a a

Onde aaaaaaa é o endereço do caracter conforme as tabelas acima.


EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk
Display LCD

Comando de configuração do modo de entrada:


DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 1 I/D S

I/D: incrementa ou decrementa o endereço da RAM interna (do


LCD):

I/D = 0 → decrementa;

I/D = 1 → incrementa;

S: controla o deslocamento dos caracteres no display:



S = 0 → os caracteres não se deslocam;

S = 1 → os caracteres se deslocam para a direita, se I/D=0 ou
para a esquerda, se I/D=1;

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk


Display LCD

EL08D - MICROCONTROLADORES 2 2017 – Gabriel Kovalhuk

Você também pode gostar