Você está na página 1de 11

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Manipulao de Teclados no mikroC

Introduo
um dispositivo indispensvel 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 nvel lgico 1 na entrada do Mc


quando a chave estiver aberta. Quando pressionamos a tecla, alteramos o nvel lgico do

pino do Mc, ou seja, se por exemplo: o pino RB0, RB4 e RB7 estiver em nvel lgico 1,
ao pressionarmos a tecla S1 o pino vai para nvel 0. ( apesar do portb do PIC possuir
resistores de pull-up interno convencionamos a utilizao tambm de resistores
externos)
Quando tivermos no projeto teclas conectadas ao Mc, devemos tomar cuidado com o
efeito mecnico Debouncing ao pressionarmos essas teclas.
Debouncing: o efeito mecnico de rebatimento que a tecla sofre logo aps 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 fenmeno do rebatimento
termine naturalmente, evitando assim a leitura falsa dela. Tempo aproximado de 25 ms.
No mikroC podemos manipular teclados atravs de uma simples funo intitulada
button. Acompanhe:

A Funo Button
A funo button tem como sintaxe:
Button(&port,

pin,

time,

estado_de_ativao);

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_ativao = determina se a tecla vai ser ativada
em nvel 0 ou em 1.
Exemplo:
button (&portb, 1, 10, 0)
Apartir da configurao da funo button acima, descobrimos que a tecla que ser lida
est conectada ao portb, pino RB0, delay de debounce de 10 milisegundos e acionada
em nvel lgico 0 (zero).
O retorno da funo button : valor 0 (tecla no pressionada) ou 1 (tecla pressionada).
A funo button automaticamente configura os respectivo port como entrada.

Vejamos um exemplo de programa utilizando a funo button:

Primeiro Programa:
Conectado ao PIC temos uma tecla ( push- button) e um led. Repare que o led ligado
com nivel lgico 1.

figura 01

Desejamos que toda vez que pressionarmos e soltermos a tecla S1, o led 1 dever alterar
seu estado lgico, 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 correo de debounce de 20 milisegundos.
Para realizar essa tarefa, iremos fazer um programa bem simples utilizando a funo
button, acomanhe:
void main()
{
trisd.f0 = 0;
trisb.f0 = 1;
do {

//configura pino RD0 como saida (leds)


//configura pino RB0 (tecla) como entrada

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 sada, pois trta-se de um led.
trisd.f0 = 0;

//configura portd como saida (leds)

Criamos um lao de repetio atravs do comando do-while, cujo objetivo fazer com
que o microcontrolador sempre esteja executando os comandos do lao.

A funo 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 funo button, teremos como retorno
valor 1 (verdadeiro), e caso no venhamos a pressionar a tecla, a funo button nos
retornar o valor 0. Apartir disso conclumos que a condio IF somente ser verdadeira
caso o retorno da funo 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 condio IF sempre ser verdadeira e ento seus comandos sero
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 inverso do estado do led, se
deixarmos a tecla pressionada, o estado lgico 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 programao em C
Este programa tem por objetivo ler o estado de uma tecla para
ligar/desligar um led.
*/
#define led1 portd.f0
nome led1.

//a diretiva define atribui ao pino RD0 o

int estado_antigo;
//define uma varivel 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 varivel 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 varivel estado_antigo
para o prximo acionamento.
}
} while(1);
}

Estudo detalhado do programa:


Primeira parte: Comentrio
Nesta primeira parte do programa, acrescentamos comentrio de apresentao do
programa.
/*
Programa de leitura de tecla.
Curso: Microcontroladores PIC programao 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 no estudamos a utilizao da diretiva define. Esta diretiva tem
por funo atribuir a uma constante ou registrador um novo nome. Veja o comando:
#define led1 portd.f0
nome led1.

//a diretiva define atribui ao pino RD0 o

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 compilao este novo nome pelo endereo fisico
de memria do pino RB0.
Exemplo:
#define display1 portd.f0
nome led1.
#define led2 portd.f1
nome led1.
void main() {
trisd = 0;
ligar/desligar o led.
display1 = 0;
led2 = 1;
}

//a diretiva define atribui ao pino RD0 o


//a diretiva define atribui ao pino RD0 o

//configura o pino RD0 como saida, pois iremos

Terceira parte: definio da varivel


Definimos uma varivel do tipo int chamada estado_antigo. Esta varivel tem por
funo 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 varivel de controle, cujo
objetivo armazenar um estado.

quarta parte: a funo principal


A funo principal main() a primeira a ser executada no programa em C. Repare que a
funo main() acompanha um modificador de tipo void que tem como objetivo
informar ao compilador que esta funo nula e no possui retorno de dados, pois, no
tem pra quem retornar os dados pois trat-se da funo principal.
void main() {

Quinta parte: programando as portas como entrada ou saida


Como j estudamos anteriormente, o registrador TRIS do PIC, tem por
funo informar a direo (leitura ou escrita) dos pinos da porta.
Neste programa temos uma tecla conectado ao pino RB0, e para lermos
essa tecla necessrio configurar este pino como entrada. A funo

button se encarrega de configurar esses registradores de sentido para


ns.
Conectado ao pino RD0, temos um led. Para acionar este led, faz
necessrio enviar nvel lgico 1 a este pino, ento devemos configurar
este pino como sida.
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 funes. No nosso
programa exemplo utilizamos os recursos do lao de repetio do - while.
do {
if (Button(&PORTB, 0, 20, 0)) estado_antigo = 1;
//se a tecla fo
pressionada, a varivel 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 varivel estado_antigo
para o prximo acionamento.
}
} while(1);
}

Repare que a condio de teste do lao de repetio do-while ser sempre verdadeira
(while(1)).

Stima parte: Rotina de tomada de deciso e funo 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 funo do mikroC: Button, em conjunto com o
comando de tomada de deciso IF.
Vejamos:
if (Button(&PORTB, 0, 20, 0)) estado_antigo = 1;
pressionada, a varivel estado_antigo = 1.

//se a tecla fo

Sabemos que o comando if somente ser executado se a condio de teste for


verdadeira, neste caso, a varivel estado_antigo somente ser executada se a funo
button for verdadeira, para isso necessrio que a tecla seja pressionada.
Outro comando:

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


se a tecla foi solta

//verifica

Nesta linha de programa efetuamos uma operao AND (E) entre a varivel
estado_antigo e o retorno da funo Button, cujo objetivo verificar se a tecla foi solta
ou no. Repare que nesta segunda funo Button o estado lgico de acionamento da
tecla passa a ser 1 (Button(&PORTB, 0, 20, 1)), contrrio da funo Button da linha
anterior, essa alterao indica que somente teremos a condio de retorno verdadeira
(1), caso a tecla no esteja pressionada.
Os comandos seguintes somente sero executados se a condio if for verdadeira, e para
isso faz necessrio que a varivel estado_antigo seja igual a 1 e que o retorno da funo
Button seja verdadeira, ou seja, a tecla tem que estar solta.

oitava parte: Inverso do estado do led e resset de varivel de estado


led1 = ~led1;
//inverte o estado do led 1.
estado_antigo = 0; //inverte o valor da varivel estado_antigo
para o prximo acionamento.

Leituras de 4 teclas:
Nosso prximo passo elaborar um programa para lermos 4 teclas conectado ao PIC,
conforme figura abaixo:

Figura 03
Perceba no esquema eletrnico acima que nossos teclados no possuem mais resistores
de pull-up externo (compare com o circuito eletrnicos da figura 01), neste caso
devemos acionar os resistores de pull-up interno disponivel no PORTB do PIC atravs
do bit RBPU do registrador INTCON2.

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


(aps reset). Esses resistores de pull-up so automaticamente ativados quando
programamos o PORTB como saida (trisb = 0), para outros casos, devemos ns mesmos
ativ-los.
O registrador bit RBPU ativado com nvel lgico 0 (zero), e destivado com nvel
lgico 1 (um).
Nosso programa:
/*
Programa de leitura de tecla.
Curso: Microcontroladores PIC programao em C
Este programa tem por objetivo ler o estado de 4 tecla para
ligar/desligar um led.
*/
#define led1 portd.f0
nome led1.

//a diretiva define atribui ao pino RD0 o

int estado_antigo;
//define uma varivel de controle, cujo
objetivo armazenar o estado anterior da tecla.
void main() {
trisd = 0;
ligar/desligar o led.
portd = 0;

//configura o pino RD0 como saida, pois iremos

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 - Programao


em C
Microgenios 1998 - 2007. Todos os direitos reservados. proibido cpia parcial ou
integral desse material sem prvio aviso. Maiores informaes:
suporte@microgenios.com.br

Você também pode gostar