Académique Documents
Professionnel Documents
Culture Documents
umento
Introduo
um dispositivo indispensvel na maioria dos projetos, pois permite adicionar dados ao
Mc. Acompanhe o esquema de um teclado:
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.
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 {
No programa acima configuramos o pino RD0 como sada, pois trta-se de um led.
trisd.f0 = 0;
Criamos um lao de repetio atravs do comando do-while, cujo objetivo fazer com
que o microcontrolador sempre esteja executando os comandos do lao.
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.
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);
}
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;
}
Repare que a condio de teste do lao de repetio do-while ser sempre verdadeira
(while(1)).
//se a tecla fo
//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.
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.
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;
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);
}