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
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)
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; Figura 1. Exemplo de uso de uma chave simples para entrada de dados em sistemas digitais Fonte: http://www.labbookpages.co.uk/electronics/debounce.html - Dr. Andrew Greensted
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 2. exemplo do efeito de repique numa chave simples Fonte: http://www.labbookpages.co.uk/electronics/debounce.html - Dr. Andrew Greensted
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 3. 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
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 2)
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; while(tempo > 0) { if(tecla == pino) tempo ; else { tecla = pino; tempo = 22; } } return tecla; // define o tempo de espera para // alcancar a estabilidade // se nao houve mudanca, // decrementa a contagem de tempo // se houve mudanca, // reinicia o processo
Rotinas de debounce Exercício 1: Implementar a rotina de debounce por software para o pino P1.3 e P1.4 da launchpad: 1) Colocar um jumper entre os pinos P1.3 e P1.4. Com isto o botão da placa poderá ser lido pelos dois pinos do MSP430; 2) Fazer a rotina de debounce para o pino P1.3 e fazer com que está informação controle o led vermelho; 3) Controlar o led verde pelo pino P1.4, sem a rotina de debounce;
Teclado Matricial Teclado Matricial
Teclado Matricial Teclado: conjunta 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; O número de teclas é dado por: Teclas=(Números de Pinos /2)^2
Teclado Matricial C D E F R1 Pull-up P1.0 P1.1 P1.2 P1.3 8 9 A B 4 5 6 7 0 1 2 3 R2 Pull-up R3 Pull-up R4 Pull-up Vcc P1.4 P1.5 P1.6 P1.7
Teclado Matricial C D E F R1 Pull-up P1.0 == 1 P1.1 == 1 P1.2 == 1 P1.3 == 1 8 9 A B 4 5 6 7 0 1 2 3 R2 Pull-up R3 Pull-up R4 Pull-up Vcc P1.4 0 P1.5 1 P1.6 1 P1.7 1
Teclado Matricial C D E F R1 Pull-up P1.0 == 1 P1.1 == 1 P1.2 == 1 P1.3 == 1 8 9 A B 4 5 6 7 0 1 2 3 R2 Pull-up R3 Pull-up R4 Pull-up Vcc P1.4 1 P1.5 0 P1.6 1 P1.7 1
Teclado Matricial C D E F R1 Pull-up P1.0 == 1 P1.1 == 1 P1.2 == 1 P1.3 == 1 8 9 A B 4 5 6 7 0 1 2 3 R2 Pull-up R3 Pull-up R4 Pull-up Vcc P1.4 1 P1.5 1 P1.6 0 P1.7 1
Teclado Matricial C D E F R1 Pull-up P1.0 == 1 P1.1 == 1 P1.2 == 1 P1.3 == 1 8 9 A B 4 5 6 7 0 1 2 3 R2 Pull-up R3 Pull-up R4 Pull-up Vcc P1.4 1 P1.5 1 P1.6 1 P1.7 0
Teclado Matricial C D E F R1 Pull-up P1.0 == 1 P1.1 == 1 P1.2 == 1 P1.3 == 1 8 9 A B 4 5 6 7 0 1 2 3 R2 Pull-up R3 Pull-up R4 Pull-up Vcc P1.4 1 P1.5 1 P1.6 1 Tecla 9 Pressionada P1.7 1
Teclado Matricial C D E F R1 Pull-up P1.0 == 1 P1.1 == 1 P1.2 == 1 P1.3 == 1 8 9 A B 4 5 6 7 0 1 2 3 R2 Pull-up R3 Pull-up R4 Pull-up Vcc P1.4 0 P1.5 1 P1.6 1 Coluna 1 Ativada (em nível 0) P1.7 1
Teclado Matricial C D E F R1 Pull-up P1.0 == 1 P1.1 == 1 P1.2 == 1 P1.3 == 1 8 9 A B 4 5 6 7 0 1 2 3 R2 Pull-up R3 Pull-up R4 Pull-up Vcc P1.4 0 P1.5 1 P1.6 1 P1.7 1 Como não é a coluna da chave pressionada, todas as linhas (entradas) estão em nível lógico 1
Teclado Matricial C D E F R1 Pull-up P1.0 == 1 P1.1 == 1 P1.2 == 1 P1.3 == 1 8 9 A B 4 5 6 7 0 1 2 3 R2 Pull-up R3 Pull-up R4 Pull-up Vcc P1.4 1 P1.5 0 P1.6 1 Coluna 2 Ativada (em nível 0) P1.7 1
Teclado Matricial C D E F R1 Pull-up P1.0 == 1 P1.1 == 0 P1.2 == 1 P1.3 == 1 8 9 A B 4 5 6 7 0 1 2 3 R2 Pull-up R3 Pull-up R4 Pull-up Vcc P1.4 1 P1.5 0 P1.6 1 P1.7 1 Como é a coluna da chave pressionada, a linha 2 está em nível lógico 0
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. Teclado Matricial Para fazer uma rotina de debounce, é aconselhável ler todas as quatro entradas simultaneamente e aplicar a rotina de debounce sobre estas quatro entradas.
Display LCD 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; Display LCD 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);
Display LCD
A - Anode (backlight) K Cathode (backlight) Vo - Contraste RS Register Select RW- Read/Write E - Enable DB0 Data Bus 0 DB1 Data Bus 1 DB2 Data Bus 2 DB3 Data Bus 3 DB4 Data Bus 4 DB5 Data Bus 5 DB6 Data Bus 6 DB7 Data Bus 7 Pinagem Display LCD 14 13 12 11 10 9 8 7 6 5 4 3 2 1 16 15 Vss - GND VDD - Vcc
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; Display LCD RS (Register Select): define se o dado transferido é um caracter (em código ASCII) ou um comando;
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);
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
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. Display LCD
Display LCD Exemplo de utilização com o MSP430G2553 +3,3v* Vcc MSP430 Vss P2.2 P2.3 P2.4 P2.5 P2.6 P2.7 LCD_EN LCD_RS LCD_D4 LCD_D5 LCD_D6 LCD_D8 Deixar R/W sempre em 0 Deixar D0 a D3 em aberto +5v* 10k +5v* 100nF *Atenção: Não ligar o Vcc do MSP ao Vcc do Display Lembrar de ligar todos os GNDs juntos
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
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 }
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(500); // espera 50us 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; }
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(500); // espera 50us 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; }
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;
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;
Display LCD Comando para limpar o display: DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 0 0 0 1
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.
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;
Display LCD