Olá! Este artigo demonstra a implementação de um relógio digital com alarme na placa PK2LAB utilizando o PIC18F4520 e o compilador C18. O programa demonstra como utilizar múltiplas interrupções e o modo de dupla prioridade de interrupção do PIC18.

Esta aplicação utiliza o display LCD da placa para apresentação da hora atual e a hora de alarme. O led conectado ao pino RC0 muda de estado a cada segundo e o led conectado ao pino RC1 indica se o alarme está habilitado ou não.

As teclas conectadas aos pinos RD0, RD1 e RD2 permitem incrementar a hora, minuto e segundo atuais. Pressionando-se a tecla conectada ao pino RD3 em conjunto com as teclas conectadas aos pinos RD0, RD1 ou RD2, podemos ajustar o horário do alarme.

A tecla conectada ao pino RD7 permite habilitar ou desabilitar o alarme. Ao atingir o horário selecionado, o buzzer irá soar, pressionando-se a tecla conectada ao pino RD3 podemos fazer cessar o alarme (que será disparado novamente quando o horário do alarme for atingido).

Para que o programa opere corretamente na placa, o DIP LCD e os DIPS LED_C e RD0 a RD7 devem estar na posição ENABLE.

Nós utilizamos o timer 0 para fornecer a base de tempo principal de 1 segundo para o relógio e o timer 1 para a geração de som e temporização auxiliar de 1ms (utilizada na leitura das teclas e temporização de som).

O código da função principal é bastante reduzido. Basicamente há um loop infinito onde o programa verifica se há uma requisição de atualização de display pendente (variável update=1) e se o timer de varredura do teclado atingiu o valor zero (ele é sempre recarregado com 25 dentro da função processa_teclas() ).

O código da função de atualização do display é simples:

O código da função de processamento do teclado é um pouco mais complexo e merece uma descrição mais detalhada. Ela é executada aproximadamente a cada 25ms (controlada através da variável timer_tecla que é decrementada pela interrupção do CCP1 a cada 1 ms). Cada tecla é lida e se encontrada pressionada a ação correspondente é executada (incrementar hora, minuto, segundo ou habilitar/desabilitar o alarme) e um timer (timer_pressao) é incrementado.

Se a tecla permanece pressionada este timer é incrementado e ao atingir um valor superior a 20 a ação correspondente é novamente executada o o timer é recarregado com o valor 10 (no caso da tecla de hora) ou 15 (no caso das teclas de minuto e segundo). Desta forma, implementamos de forma simples um mecanismo de auto repetição quando a tecla permanece pressionada. Utilizando o limite de 20, temos a primeira auto repetição em 20 * 25ms = 500ms e as próximas em 10 * 25ms = 250ms aproximadamente.

Quando nenhuma tecla está pressionada, o timer de pressao é zerado.

O restante do código pode ser visto no arquivo fonte da aplicação. O projeto completo para o MPLAB pode ser baixado aqui.

Relógio Digital com Alarme na PK2LAB
Classificado como:                                            

Deixe uma resposta