manipulacao de teclado no mikroc

Post on 23-Jan-2016

47 Views

Category:

Documents

8 Downloads

Preview:

Click to see full reader

DESCRIPTION

Parte 14

TRANSCRIPT

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

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:

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 {

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.

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. */

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

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:

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:

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.

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;

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:

suporte@microgenios.com.br

top related