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:
Top Related