Vous êtes sur la page 1sur 8

www.u8051.com.

br

Prtica 5
Leitura de Teclas - Parte 2
Durante a leitura de teclas ou de sensores, o programador pode se deparar com dois problemas muito comuns:

Contagem excessiva de pulsos enquanto a tecla ou sensor mantido pressionado;

Nesta seco de estudos analisaremos e corrigiremos o primeiro destes dois problemas.

1. Observe o programa abaixo (SEQUENCIAL_1.C):


#include<at89x52.h> void main(){ char contador=0; while(1){ if(P3_0){ if(contador<7) contador++; else contador=0; } if(contador==0) P0=1; if(contador==1) P0=2; if(contador==2) P0=4; if(contador==3) P0=8; if(contador==4) P0=16; if(contador==5) P0=32; if(contador==6) P0=64; if(contador==7) P0=128 } }

www.u8051.com.br

1.1. Observe que o programa anterior carece de comentrios. Analise o cdigo fonte e adicione em cada linha em negrito, um comentrio que descreva o efeito de cada comando. 1.2. Existe um erro de digitao no programa que o impede de ser compilado. Voc capaz de identificar e corrigir esse erro? 1.3. Descreva o funcionamento deste programa num pargrafo.

2. Abra o JFE Editor e faa a seguinte atividade:


Acesse o menu File New e em Seguida acesso o menu File Save As... Salve o arquivo como SEQUENCIAL_1.C Digite o programa no JFE Editor, compile-o e grave-o no KIT; Pressione a tecla P3.0 para observar o seu funcionamento; ou

O programa apresenta o comportamento esperado, apresenta o problema da contagem excessiva de pulsos?

No programa anterior, o lao de repetio while(1), aliado ao rpido processamento interno de 1MHz (freqncia do cristal/12) faz com que o programa seja repetido muitas vezes por segundo. Isso quer dizer que dependendo da demora em que mantemos a tecla P3.0 pressionada, o processador poder ter executado o while(1) vrias vezes e para cada repetio, encontrar a tecla P3.0 pressionada novamente (embora s tenha pressionado uma nica vez muito demorado) e executar novamente a instruo contador++. Vamos abordar este problema por outro ngulo: Imagine que o programa se repita a cada 1 milisegundo e que o usurio mantenha a tecla P3.0 pressionada por 50 milisegundos

www.u8051.com.br para gerar um pulso no seqencial. Ocorre que, apesar do usurio ter pressionado a tecla P3.0 muito rapidamente, esse tempo foi suficiente para o 8051 realizar 50 repeties e, como o processador encontrou a tecla P3.0 pressionada nestas 50 repeties, o teste if(P3_0) foi verdadeiro em todas elas e portando, acabou por incrementar a varivel contador 50 vezes.

Para corrigir esse problema, precisamos de um programa que incremente varivel contagem quando, por exemplo, o usurio pressionar e soltar a tecla, caracterizando assim, um pulso. Assim temos o programa abaixo (SEQUENCIAL_2.C):
#include<at89x52.h> void main(){ char contador=0; bit teclaFoiPressionada=0; while(1){ if(P3_0) teclaFoiPressionada=1;

//se pressionar P3.0 marca //a varivel teclaFoiPress.. if(!P3_0 & teclaFoiPressionada){ // se soltar P3.0 e a vari//teclaFoi... estiver marcada if(contador<7) contador++; //executa comandos

else contador=0;
teclaFoiPressionada=0; } if(contador==0) if(contador==1) if(contador==2) if(contador==3) if(contador==4) if(contador==5) if(contador==6) if(contador==7) } }
//desmarca varivel para //sinalizar que executou o pulso

P0=1; P0=2; P0=4; P0=8; P0=16; P0=32; P0=64; P0=128;

Funcionamento do programa acima apresenta 3 possibilidades:

I.

A TECLA P3.0 NO FOI PRESSIONADA

www.u8051.com.br O sistema, estando simplesmente ligado, repete o lao while(1) infinitamente.

Caso a tecla P3.0 no esteja pressionada (com nvel alto), o teste if(P3_0) teclaFoiPressionada=1;
que equivalente : if(P3_0==1) teclaFoiPressionada=1;

falso e portanto, no executado. Em seguida o teste


if(!P3_0 & teclaFoiPressionada) que equivalente : if(P3_0==0) & (teclaFoiPressionada==1))

parcialmente verdadeiro. Ocorre que !P3.0 verdadeiro, pois a entrada P3.0 est em nvel zero, mas o teste com a varivel teclaFoiPressionada retorna falso, pois a varivel foi inicializada com o valor zero. Deste modo, temos que estes dois testes if no so executados.

II.

A TECLA P3.0 MANTIDA PRESSIONADA

Caso a tecla P3.0 seja mantida pressionada (com nvel alto), o teste if(P3_0) teclaFoiPressionada=1;
que equivalente : if(P3_0==1) teclaFoiPressionada=1;

ser verdadeiro e a instruo executada.

teclaFoiPressionada=1 ser

www.u8051.com.br

Em seguida o teste
if(!P3_0 & teclaFoiPressionada) que equivalente : if(P3_0==0) & (teclaFoiPressionada==1))

ser novamente parcialmente verdadeiro. Ocorre que o teste com a varivel teclaFoiPressionada retorna verdadeiro, pois o if anterior acabou atribuindo 1 a esta varivel, mas agora !P3.0 falso, pois a entrada P3.0 est em nvel alto (a tecla est pressionada), e portanto, os comandos pertencentes esse if no so executados. Ao repetir o programa, manter a tecla P3.0 pressionada, far com que o teste if(P3_0) teclaFoiPressionada=1; seja verdadeiro e executado. Entretanto, no causar mudanas no comportamento do programa uma vez que a varivel teclaFoiPressionada j continha o valor 1. Em sntese: Manter a tecla P3.0 pressionada no produz efeito ao programa.

III.

A TECLA P3.0 APS TER SIDO PRESSIONADA, SOLTA

Caso a tecla P3.0 seja solta, aps ter sido pressionada (com nvel alto), o teste if(P3_0) teclaFoiPressionada=1;
que equivalente : if(P3_0==1) teclaFoiPressionada=1;

ser falso do mesmo modo que era no instante inicial da execuo do programa, exceto pelo fato de que agora varivel teclaFoiPressionada tem o valor 1. Em seguida o teste
if(!P3_0 & teclaFoiPressionada) que equivalente :

if(P3_0==0) & (teclaFoiPressionada==1))

www.u8051.com.br

ser finalmente verdadeiro. Ocorre que o teste com a varivel teclaFoiPressionada retorna verdadeiro, esta varivel recebeu 1 por que a tecla P3.0 havia sido pressionada, e o teste if(!P3.0) tambm verdadeiro, pois a entrada P3.0 est em nvel baixo (solta). Portanto, os comandos pertencentes este teste if sero executados.

Outra instruo importante a


teclaFoiPressionada=0;

este comando impede que o teste


if(!P3_0 & teclaFoiPressionada)

continue verdadeiro e garante que a instruo seja executada uma nica vez.

3. Verifique se o programa SEQUENCIAL_2.C resolve o problema do SEQUENCIAL_1.C. 3.1. Abra o JFE Editor e faa a seguinte atividade:

Acesse o menu File New e em Seguida acesso o menu File Save As... Salve o arquivo como SEQUENCIAL_2.C

Digite o programa no JFE Editor, compile-o e grave-o no KIT; Pressione a tecla P3.0 para observar o seu funcionamento; 3.2. Que concluso voc obteve quanto ao comportamento entre os programas SEQUENCIAL_1.C e SEQUENCIAL_2.C ?

www.u8051.com.br 3.3. Qual seria o comportamento do programa, caso a instruo teclaFoiPressionada=0; no estivesse no programa SEQUENCIAL_2.C?

3.4. Adicione mais uma tecla ao sistema (P3.1), cuja funo ser decrementar o seqencial, ou seja, a varivel contagem. Dica: necessrio criar mais uma varivel do tipo bit, cuja finalidade ser sinalizar se a tecla P3.1 foi ou no pressionada. Ex.: bit y=0; 3.5. Adicione no trecho que julgar mais conveniente, um teste que reinicie o seqencial caso P3.2 seja pressionada. Obs.: Neste caso no necessrio utilizar a tcnica de pressionar e soltar a tecla.

4. Observe o programa abaixo (SEQUENCIAL_3.C):


#include<at89x52.h> bit x=0; unsigned char contador=0; unsigned int tempo=0; const TEMPO_PULSO=3000; void main(){ while(1){ if(P3_0){ x=1; tempo++; } if(!P3_0 & x){ if(tempo>TEMPO_PULSO){ contador++; x=0; } tempo=0; } if(contador==0) P0=1;

if(contador==1) if(contador==2) if(contador==3) if(contador==4) if(contador==5) if(contador==6) if(contador==7) } }

P0=2; P0=4; P0=8; P0=16; P0=32; P0=64; P0=128;

www.u8051.com.br

Este programa emprega uma tcnica para medir a durao do pulso fornecido pela tecla P3.0 e somente executar a instruo contador++ caso a tecla seja mantida pressionada mais do que o tempo determinado na constante TEMPO_PULSO e em seguida seja solta. Isto far que pulsos muito curtos, interferncias, desgastes ou imperfeies de teclas e sensores de contato gerem repiques que ocasionem pulsos falsos na contagem. 4.1. Verifique o funcionamento do programa SEQUENCIAL_3.C Abra o JFE Editor e faa a seguinte atividade:

4.2.

Acesse o menu File New e em Seguida acesso o menu File Save As... Salve o arquivo como SEQUENCIAL_3.C

Digite o programa no JFE Editor, compile-o e grave-o no KIT; Pressione a tecla P3.0 em pulsos muito curtos e depois pulsos longos para observar o seu funcionamento;