manipulacao de teclado no mikroc

11
Centro de Tecnologia Microgenios - Todos os direitos reservados Clique aqui para Imprimir o doc umento Manipulação de Teclados no mikroC Introdução É um dispositivo indispensável na maioria dos projetos, pois permite adicionar dados ao Mc. Acompanhe o esquema de um teclado: O resistor utilizado chama-se pull-up, pois garante o nível lógico 1 na entrada do Mc quando a chave estiver aberta. Quando pressionamos a tecla, alteramos o nível lógico do

Upload: francisco-josivan

Post on 23-Jan-2016

47 views

Category:

Documents


8 download

DESCRIPTION

Parte 14

TRANSCRIPT

Page 1: Manipulacao de Teclado No MikroC

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc umento

Manipulação de Teclados no mikroC

Introdução

É um dispositivo indispensável na maioria dos projetos, pois permite adicionar dados ao

Mc. Acompanhe o esquema de um teclado:

O resistor utilizado chama-se pull-up, pois garante o nível lógico 1 na entrada do Mc

quando a chave estiver aberta. Quando pressionamos a tecla, alteramos o nível lógico do

Page 2: Manipulacao de Teclado No MikroC

pino do Mc, ou seja, se por exemplo: o pino RB0, RB4 e RB7 estiver em nível lógico 1,

ao pressionarmos a tecla S1 o pino vai para nível 0. ( apesar do portb do PIC possuir

resistores de pull-up interno convencionamos a utilização também de resistores

externos)

Quando tivermos no projeto teclas conectadas ao Mc, devemos tomar cuidado com o

efeito mecânico Debouncing ao pressionarmos essas teclas.

Debouncing: o efeito mecânico de rebatimento que a tecla sofre logo após ser

pressionada é chamado "boucing", o qual provoca a leitura falsa da tecla, isto é, o

rebatimento faz com que a tecla seja lida mais de uma vez. A rotina de debouncing nada

mais é do que um pequeno intervalo de tempo entre o momento em que a tecla é solta e

a nova leitura do teclado. Esse intervalo permite que o fenômeno do rebatimento

termine naturalmente, evitando assim a leitura falsa dela. Tempo aproximado de 25 ms.

No mikroC podemos manipular teclados através de uma simples função intitulada

button. Acompanhe:

A Função Button

A função button tem como sintaxe:

Button(&port, pin, time, estado_de_ativação);

onde:

&port = port onde esta ligado a tecla, pode ser PORTA,

PORTB, PORTC, PORTD ou PORTE. pin = é o pino onde esta ligado a tecla no PIC, pode ser de

0 a 7. timer = tempo de debounce em escala de milisegundos. estado_de_ativação = determina se a tecla vai ser ativada

em nível 0 ou em 1.

Exemplo:

button (&portb, 1, 10, 0)

Apartir da configuração da função button acima, descobrimos que a tecla que será lida

está conectada ao portb, pino RB0, delay de debounce de 10 milisegundos e é acionada

em nível lógico 0 (zero).

O retorno da função button é: valor 0 (tecla não pressionada) ou 1 (tecla pressionada).

A função button automaticamente configura os respectivo port como entrada.

Vejamos um exemplo de programa utilizando a função button:

Page 3: Manipulacao de Teclado No MikroC

Primeiro Programa:

Conectado ao PIC temos uma tecla ( push- button) e um led. Repare que o led é ligado

com nivel lógico 1.

figura 01

Desejamos que toda vez que pressionarmos e soltermos a tecla S1, o led 1 deverá alterar

seu estado lógico, ou seja, se o led estiver acesso, ao pressionar e soltar a tecla S1, o led

será apagado, e ao pressionar a tecla novamente, o led será acesso. Devemos programar

delay para correção de debounce de 20 milisegundos.

Para realizar essa tarefa, iremos fazer um programa bem simples utilizando a função

button, acomanhe:

void main()

{

trisd.f0 = 0; //configura pino RD0 como saida (leds) trisb.f0 = 1; //configura pino RB0 (tecla) como entrada

do {

Page 4: Manipulacao de Teclado No MikroC

if (Button(&PORTB, 0, 20, 0)) //se a tecla S1 estiver pressionada o

comando if será executado

{

delay_ms(200); //delay de 200 milisegundos

portd.f0 = ~pord.f0; //inverte o estado do led

}

} while(1);

}

No programa acima configuramos o pino RD0 como saída, pois tráta-se de um led.

trisd.f0 = 0; //configura portd como saida (leds)

Criamos um laço de repetição através do comando do-while, cujo objetivo é fazer com

que o microcontrolador sempre esteja executando os comandos do laço.

A função button foi programada da seguinte forma:

Acompanhe o trecho de programa seguinte:

if (Button(&PORTB, 0, 20, 0)) //se a tecla S1 estiver pressionada o

comando if será executado

{

delay_ms(200); //delay de 200 milisegundos

portd.f0 = ~pord.f0; //inverte o estado do led

}

Caso a tecla S1 seja pressionada, ao executar a função button, teremos como retorno

valor 1 (verdadeiro), e caso não venhamos a pressionar a tecla, a função button nos

retornará o valor 0. Apartir disso concluímos que a condição IF somente será verdadeira

caso o retorno da função button for verdadeiro, que neste caso, ocorrerá quando a tecla

for pressionada.

O programa apresentado acima possui um problema, pois caso deixamos a tecla

pressionada, a condição IF sempre será verdadeira e então seus comandos serão

executados, fazendo com que o led acenda e apague enquanto a tecla estiver

pressionada.

Page 5: Manipulacao de Teclado No MikroC

Nosso segundo Programa :

Para corrigir o problema do programa anterior, vamos elaborar um novo programa que

acenda e apague o led 1 da figura 01 para cada toque que dermos no teclado, ou seja,

temos que pressior e soltar a tecla para executar a inversão do estado do led, se

deixarmos a tecla pressionada, o estado lógico do led somente mudará um vez. O tempo

de debouncing programado deverá ser de 20 milisegundos.

Programa: /* Programa de leitura de tecla. Curso: Microcontroladores PIC programação em C Este programa tem por objetivo ler o estado de uma tecla para

ligar/desligar um led. */

#define led1 portd.f0 //a diretiva define atribui ao pino RD0 o

nome led1.

int estado_antigo; //define uma variável de controle, cujo

objetivo é armazenar um estado.

void main() {

trisd.f0 = 0; //configura o pino RD0 como saida, pois

iremos ligar/desligar o led. trisb.f0 = 1; //configura pino RB0 (tecla) como entrada

do {

if (Button(&PORTB, 0, 20, 0)) estado_antigo = 1; //se a tecla fo

pressionada, a variável estado_antigo = 1.

if (estado_antigo == 1 && Button(&PORTB, 0, 20, 1)) { //verifica

se a tecla foi solta

led1 = ~led1; //inverte o estado do led 1.

estado_antigo = 0; //inverte o valor da variável estado_antigo

para o próximo acionamento.

}

} while(1);

}

Estudo detalhado do programa:

Primeira parte: Comentário Nesta primeira parte do programa, acrescentamos comentário de apresentação do

programa.

/* Programa de leitura de tecla. Curso: Microcontroladores PIC programação em C Este programa tem por objetivo ler o estado de uma tecla para

ligar/desligar um led. */

Page 6: Manipulacao de Teclado No MikroC

Segunda parte: a diretiva define

Até este ponto do curso não estudamos a utilização da diretiva define. Esta diretiva tem

por função atribuir a uma constante ou registrador um novo nome. Veja o comando:

#define led1 portd.f0 //a diretiva define atribui ao pino RD0 o

nome led1.

A diretiva #define atribui o nome led1 ao pino RD0 do PIC, partir deste ponto do

programa, toda vez que utilizarmos o nome led1, o compilador sabe que se refere ao

pino portd.f0 (RD0), e substituirá na compilação este novo nome pelo endereço fisico

de memória do pino RB0.

Exemplo:

#define display1 portd.f0 //a diretiva define atribui ao pino RD0 o

nome led1.

#define led2 portd.f1 //a diretiva define atribui ao pino RD0 o

nome led1.

void main() {

trisd = 0; //configura o pino RD0 como saida, pois iremos

ligar/desligar o led. display1 = 0; led2 = 1; }

Terceira parte: definição da variável

Definimos uma variável do tipo int chamada estado_antigo. Esta variável tem por

função fazer com que o led seja ligado/desligado somente com um unico toque na tecla,

evitando que ao deixarmos a tecla pressionada os comandos if sejam sempre

executados.

int estado_antigo; //define uma variável de controle, cujo

objetivo é armazenar um estado.

quarta parte: a função principal

A função principal main() é a primeira a ser executada no programa em C. Repare que a

função main() acompanha um modificador de tipo void que tem como objetivo

informar ao compilador que esta função é nula e não possui retorno de dados, pois, não

tem pra quem retornar os dados pois tratá-se da função principal.

void main() {

Quinta parte: programando as portas como entrada ou saida Como já estudamos anteriormente, o registrador TRIS do PIC, tem por

função informar a direção (leitura ou escrita) dos pinos da porta.

Neste programa temos uma tecla conectado ao pino RB0, e para lermos

essa tecla é necessário configurar este pino como entrada. A função

Page 7: Manipulacao de Teclado No MikroC

button se encarrega de configurar esses registradores de sentido para

nós.

Conectado ao pino RD0, temos um led. Para acionar este led, faz

necessário enviar nível lógico 1 a este pino, então devemos configurar

este pino como sáida.

trisd.f0 = 0; //configura o pino RD0 como saida, pois

iremos ligar/desligar o led.

Sexta parte: Rotina de loop

Lembre-se que devemos sempre manter o microcontrolador executando alguma rotina,

mesmo que essa rotina seja um comando sem saida (while(1);). Devemos criar um

programa que "amarre" o microcontrolador a sempre executar suas funções. No nosso

programa exemplo utilizamos os recursos do laço de repetição do - while.

do {

if (Button(&PORTB, 0, 20, 0)) estado_antigo = 1; //se a tecla fo

pressionada, a variável estado_antigo = 1.

if (estado_antigo && Button(&PORTB, 0, 20, 1)) { //verifica se a

tecla foi solta

led1 = ~led1; //inverte o estado do led 1.

estado_antigo = 0; //inverte o valor da variável estado_antigo

para o próximo acionamento.

}

} while(1);

}

Repare que a condição de teste do laço de repetição do-while será sempre verdadeira

(while(1)).

Sétima parte: Rotina de tomada de decisão e função button

Os comandos seguintes tem por objetivo ler o estado da tecla S1, conectada ao pino

RB0 do PIC, e ligar ou apagar o led 1 conectado ao pino RD0.

Para lermos a tecla, utilizamos a função do mikroC: Button, em conjunto com o

comando de tomada de decisão IF.

Vejamos:

if (Button(&PORTB, 0, 20, 0)) estado_antigo = 1; //se a tecla fo

pressionada, a variável estado_antigo = 1.

Sabemos que o comando if somente será executado se a condição de teste for

verdadeira, neste caso, a variável estado_antigo somente será executada se a função

button for verdadeira, para isso é necessário que a tecla seja pressionada.

Outro comando:

Page 8: Manipulacao de Teclado No MikroC

if (estado_antigo == 1 && Button(&PORTB, 0, 20, 1)) { //verifica

se a tecla foi solta

Nesta linha de programa efetuamos uma operação AND (E) entre a variável

estado_antigo e o retorno da função Button, cujo objetivo é verificar se a tecla foi solta

ou não. Repare que nesta segunda função Button o estado lógico de acionamento da

tecla passa a ser 1 (Button(&PORTB, 0, 20, 1)), contrário da função Button da linha

anterior, essa alteração indica que somente teremos a condição de retorno verdadeira

(1), caso a tecla não esteja pressionada.

Os comandos seguintes somente serão executados se a condição if for verdadeira, e para

isso faz necessário que a variável estado_antigo seja igual a 1 e que o retorno da função

Button seja verdadeira, ou seja, a tecla tem que estar solta.

oitava parte: Inversão do estado do led e resset de variável de estado led1 = ~led1; //inverte o estado do led 1.

estado_antigo = 0; //inverte o valor da variável estado_antigo

para o próximo acionamento.

Leituras de 4 teclas:

Nosso próximo passo é elaborar um programa para lermos 4 teclas conectado ao PIC,

conforme figura abaixo:

Page 9: Manipulacao de Teclado No MikroC

Figura 03

Perceba no esquema eletrônico acima que nossos teclados não possuem mais resistores

de pull-up externo (compare com o circuito eletrônicos da figura 01), neste caso

devemos acionar os resistores de pull-up interno disponivel no PORTB do PIC através

do bit RBPU do registrador INTCON2.

Page 10: Manipulacao de Teclado No MikroC

No PORTB do PIC18f442, por default, o circuito de pull-up interno vem desativado

(após reset). Esses resistores de pull-up são automaticamente ativados quando

programamos o PORTB como saida (trisb = 0), para outros casos, devemos nós mesmos

ativá-los.

O registrador bit RBPU é ativado com nível lógico 0 (zero), e destivado com nível

lógico 1 (um).

Nosso programa: /*

Programa de leitura de tecla.

Curso: Microcontroladores PIC programação em C

Este programa tem por objetivo ler o estado de 4 tecla para

ligar/desligar um led.

*/

#define led1 portd.f0 //a diretiva define atribui ao pino RD0 o

nome led1.

int estado_antigo; //define uma variável de controle, cujo

objetivo é armazenar o estado anterior da tecla.

void main() {

trisd = 0; //configura o pino RD0 como saida, pois iremos

ligar/desligar o led.

portd = 0;

Page 11: Manipulacao de Teclado No MikroC

intcon2.rbpu = 0; //habilita os resistores internos de pull-up do

PORTB do PIC

trisb.f0 = 1; //configura pino RB0 (tecla) como entrada trisb.f1 = 1; //configura pino RB1 (tecla) como entrada trisb.f2 = 1; //configura pino RB2 (tecla) como entrada trisb.f3 = 1; //configura pino RB3 (tecla) como entrada

do {

if (Button(&PORTB, 0, 20, 0)) //lê tecla 1

portd = 0b00000001;

else if (Button(&PORTB, 1, 20, 0)) //lê tecla 2

portd = 0b00000010;

else if (Button(&PORTB, 2, 20, 0)) //lê tecla 3

portd =0b00000011;

else if (Button(&PORTB, 3, 20, 0)) //lê tecla 4

portd =0b00000100;

Delay_ms(200); //delay de 200 milisegundos

} while(1);

}

Video do funcionamento do programa acima no KIT PICGenios .

Your browser does not support inline frames or is currently configured not to display

inline frames.

voltar para o topo da pagina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programação

em C

Microgenios © 1998 - 2007. Todos os direitos reservados. É proibido cópia parcial ou

integral desse material sem prévio aviso. Maiores informações:

[email protected]