Anda di halaman 1dari 11

/*=============================================================================

Programa teste para fazer um relgio com o 16F877A


Implementada funes que mostram data e dia da semana
Teste promo_version v1.1
by MatheusLPS (Koala)
=============================================================================*/
#include <16F877A.h>
#device adc=10
#FUSES NOWDT
#FUSES XT
#FUSES PUT
#FUSES NOPROTECT
#FUSES NODEBUG
#FUSES NOLVP
used for I/O
#FUSES NOCPD

//O PIC utilizado, obrigatrio!

#use delay(clock=4000000)

// Definio do clock utilizado. Obrigatrio!

#include <lcd.C>

//Incluso da biblioteca de LCD. Obrigatrio!

//
.
//
//
//
//
//
//

//Pinos utilizados pelo LCD. Podem ser alterados

//Sem Watch dog, evitando reset


//Crystal de oscilao igual a 4mhz
//Tempo de incio do PIC
//Codigo sem proteo de leitura, software livre!
//No Debug mode for ICD
//No low voltage prgming, B3(PIC16) or B5(PIC18)
//No EE protection

D0 enable
D1
D2
D4
D5
D6
D7

rs
rw
D4
D5
D6
D7

/*=====================
Meu Botes:
=======================*/
#define BOTAO1 PIN_B0
#define BOTAO_INCREMENTO PIN_B1
#define BOTAO_DECREMENTO PIN_B2

//Boto de escolha de ajuste das funoes.


//Boto incremento de variveis.
//Boto de decremento das variveis.
//Foram utilizados resistores pull-up e
//pull-down em todos os botes para
//evitar rudos.

/*=====================
Minhas variveis:
=======================*/
int16 q=0;
timer1.
int s=0;
int m=0;
int h=0;
int contador=0;
int ndia_semana=1;
int dia=1;
int mes=1;
int16 ano=2010;
int16 q1,q2;
float p;

//Varivel que incrementa a cada 0.5s dentro da interupo do


//Varivel
//Varivel
//Varivel
//Varivel
//Varivel
//Varivel
//Varivel
//Varivel

dos segundos, incrementa na metade de q.


dos minutos. 0 a 59
das horas. 0 a 23.
de controle do boto de ajuste.
dos dias da semana, associada a uma string.
dos dias do ms. 0 a 31.
dos meses. 0 a 12.
dos anos. 2000 a 2099.

/*=====================
Minha Interrupo:
=======================*/
#int_TIMER1
void temp1s(void)
{
q++;
set_timer1 (3036);
}

//Interrupo do Timer1
//Funco. O que dever ser feiro a cada interrupo.
//Varivel q incrementada a cada estouro do Timer1
//Preload do Timer1

/*=====================
O programa Principal:
=======================*/
void main()
{
lcd_init();
/*lcd_gotoxy (2,1);
lcd_putc("Projeto Tempo:");
delay_ms(2000);
lcd_gotoxy (2,2);
lcd_putc("Com PIC16F877A");
delay_ms(2000);
lcd_putc ("\f");
lcd_gotoxy (2,1);
lcd_putc("Promo Version");
delay_ms(2000);
lcd_gotoxy (6,2);
lcd_putc ("1.10");
delay_ms(2000);
lcd_putc ("\f");
lcd_gotoxy (7,1);
lcd_putc("by");
lcd_gotoxy (2,2);
lcd_putc ("Matheus Koala");
delay_ms(3000);
lcd_putc ("\f");
delay_ms(1000);
lcd_gotoxy (1,1);
lcd_putc ("Iniciando");
lcd_gotoxy (10,1);
lcd_putc (".");
delay_ms(500);
lcd_gotoxy (11,1);
lcd_putc (".");
delay_ms(500);
lcd_gotoxy (12,1);
lcd_putc (".");
delay_ms(500);
lcd_gotoxy (13,1);
lcd_putc (".");
delay_ms(500);
lcd_gotoxy (14,1);
lcd_putc (".");
delay_ms(500);
lcd_gotoxy (15,1);
lcd_putc (".");
delay_ms(500);

//Inicializa o LCD (obrigatrio)!


//Coluna 6, linha 1.

lcd_gotoxy (16,1);
lcd_putc (".");
delay_ms(500);
lcd_putc ("\f");
delay_ms(1000);*/
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_8);
set_adc_channel(0);
delay_us(20);

//Canal 0 analgico
//Fuente de reloj RC
//Habilitacin canal0

setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8);


interno = 1E6 dividido por 8
set_timer1 (3036);
enable_interrupts(INT_TIMER1);
enable_interrupts(global);

//Configurao do Timer1 para clock


//Preload do Timer1
//Habilita interrupo timer1
//habilita interrupco global

while(TRUE)
//Loop Principal
{
/*=====================================================================
Teste do boto de ajuste. A medida que precionado, a varivel contador
incrementa e as diversas funes de ajustes podem ser efetuadas. So 6
funes de ajuste, HORA, MINUTO, DIA DA SEMANA,DIA DO MES, MS e ANO. A
cada ajuste de uma funo, o menu principal com todas as informaes
mostrado.
=====================================================================*/
if (input(BOTAO1))
{
delay_ms (100);
if (contador>11)
{
contador=0;
}
contador++;

//Teste do boto.
//Para evitar retorno.
//Se maior q 11, zera o contador.

//Incremento da varivel contador.

}
switch (contador)
//Depois de incrementada, a varivel CONTADOR
{
//assume um dos casos a seguir:
case 1:
//Menu de ajuste da HORA.
{
if (input (BOTAO_INCREMENTO)) //Incrementa a varivel H(hora).
{
delay_ms (75);
h++;
if (h>23)
{
h=0;
}

//Se a hora for maior que 23, reset.

}
if (input (BOTAO_DECREMENTO)) //Decrementa a varivel H(hora).
{
delay_ms (75);
h--;
if (h==255)
{

//H uma varivel inteira de 8 bits.


//Quando decrementada para um valor

h=23;

//menor que zero, se torna 255. Ou sej

a,
}

//deve voltar para 23.

}
q=0;
//Quando se est em algum menu, Q resetada.
lcd_gotoxy (1,1);
//V para a coluna 1 e linha 1 do LCD.
printf (lcd_putc, "\fAjuste Hora:%02u", h); //Escreva com 2 digitos
a varivel H.
delay_ms (100);
//Mantenha na tela.
break;
}
case 3:
//Menu de ajuste do MINUTO. Idem ao anterior.
{
if (input (BOTAO_INCREMENTO))
{
delay_ms (75);
m++;
if (m>59)
{
m=0;
}

//Diferente aqui.

}
if (input (BOTAO_DECREMENTO))
{
delay_ms (75);
m--;
if (m==255)
{
m=59;
}

//Igual aqui.

}
q=0;
lcd_gotoxy (1,1);
printf (lcd_putc, "\fAjuste Minuto:%02u", m);
delay_ms (100);
break;
}
case 5:
//Menu de ajuste do DIA DA SEMANA.
{
/*=====================================================================
Ajuste do DIA DA SEMANA. A funo ficou meio bagunada. Pesquisarei
um pouco sobre como trasformar uma string numa varivel. S
consegui fazer isso com 1 (um) caracter, mas no o ideal. Depois disso,
provavelmente essa parte ficar mais enxuta.
A funo ficou assim: Uma varivel chamada ndia_semana(nmero dia da
semana) incrementada de 1 a 7. Cada nmero associado a um dia da
semana. 1 Domingo, 2 Segunda e assim por diante. Se ndia_semana for
maior que 7, ela resetada em 1 de novo. Utilizei a funo SWITCH para
associar cada nmero de 1 a 7 a cada dia da semana.
=====================================================================*/
if (input (BOTAO_INCREMENTO))
{

delay_ms (100);
ndia_semana++;
if (ndia_semana>7)
{
ndia_semana=1;
}
}
if (input (BOTAO_DECREMENTO))
{
delay_ms (75);
ndia_semana--;
if (ndia_semana==255)
{
ndia_semana=7;
}
}
switch (ndia_semana)
{
case 1:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "\fDia da Semana:\nDomingo ");
delay_ms (100);
break;
}
case 2:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "\fDia da Semana:\nSegunda ");
delay_ms (100);
break;
}
case 3:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "\fDia da Semana:\nTerca ");
delay_ms (100);
break;
}
case 4:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "\fDia da Semana:\nQuarta ");
delay_ms (100);
break;
}
case 5:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "\fDia da Semana:\nQuinta ");
delay_ms (100);
break;
}

case 6:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "\fDia da Semana:\nSexta ");
delay_ms (100);
break;
}
case 7:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "\fDia da Semana:\nSabado ");
delay_ms (100);
break;
}
}
q=0;
break;

//Varivel q sempre resetada nos menus.

}
case 7:
//Menu de ajuste do DIA DO MES. Idem ao caso 3.
{
if (input (BOTAO_INCREMENTO))
{
delay_ms (100);
dia++;
if (dia>31)
{
dia=1;
}
}
if (input (BOTAO_DECREMENTO))
{
delay_ms (75);
dia--;
if (dia==0)
{
dia=31;
}
}
q=0;
lcd_gotoxy (1,1);
printf (lcd_putc, "\fAjuste dia Mes: \n%02u", dia);
delay_ms (100);
break;
}
case 9:
//Menu de ajuste do MES. Idem ao caso 3.
{
if (input (BOTAO_INCREMENTO))
{
delay_ms (100);
mes++;
if (mes>12)
{

mes=1;
}
}
if (input (BOTAO_DECREMENTO))
{
delay_ms (75);
mes--;
if (mes==0)
{
mes=12;
}
}
q=0;
lcd_gotoxy (1,1);
printf (lcd_putc, "\fAjuste Mes:
delay_ms (100);
break;

\n%02u", mes);

}
case 11:
//Menu de ajuste do ANO. Idem ao caso 3.
{
if (input (BOTAO_INCREMENTO))
{
delay_ms (100);
ano++;
if (ano>2099)
{
ano=2000;
}
}
if (input (BOTAO_DECREMENTO))
{
delay_ms (75);
ano--;
if (ano==1999)
{
ano=2099;
}
}
q=0;
lcd_gotoxy (1,1);
printf (lcd_putc, "\fAjuste Ano:
delay_ms (100);
break;

\n%Lu", ano);

}
default:
{
s=q/2;
if (s==60)
{
q=0;
s=0;

//Menu principal. Mostra todas as informaes.


//A varivel Q incrementa a 2Hz, ento os segundos
//devem ser a metade.
//Se for igual a 60, reset em Q e S. M incrementa.

m++;
}
if (m>59)
{
m=0;
h++;
}
if (h>23)
//Se H(horas) for maior q 23, reset. DIA DA SEMANA
{
//e DIA DO MS incrementam.
dia++;
ndia_semana++;
h=0;
}
if (ndia_semana>7)
{
ndia_semana=1;
}
switch (ndia_semana) //Os DIAS DA SEMANA s alteram sozinhos no menu
{
//principal. Idem ao caso 5.
case 1:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "DOMINGO ");
delay_ms (100);
break;
}
case 2:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "SEGUNDA ");
delay_ms (100);
break;
}
case 3:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "TERCA
delay_ms (100);
break;
}

");

case 4:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "QUARTA ");
delay_ms (100);
break;
}
case 5:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "QUINTA ");
delay_ms (100);

break;
}
case 6:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "SEXTA
delay_ms (100);
break;
}

");

case 7:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "SABADO ");
delay_ms (100);
break;
}
}
switch (mes)

//Para saber se um ms possui 31, 30 ou 28

//Numa verso mais nova, farei essa rotina

dias.
mais enxuta.
case (1):
{
if (dia>31)
{
dia=1;
mes++;
}
break;
}
case 2:
{
if (dia>28)
{
dia=1;
mes++;
}
break;
}
case (3):
{
if (dia>31)
{
dia=1;
mes++;
}
break;
}
case (4):
{
if (dia>30)
{
dia=1;
mes++;

}
break;
}
case (5):
{
if (dia>31)
{
dia=1;
mes++;
}
break;
}
case (6):
{
if (dia>30)
{
dia=1;
mes++;
}
break;
}
case (7):
{
if (dia>31)
{
dia=1;
mes++;
}
break;
}
case (8):
{
if (dia>31)
{
dia=1;
mes++;
}
break;
}
case (9):
{
if (dia>30)
{
dia=1;
mes++;
}
break;
}
case (10):
{
if (dia>31)
{
dia=1;
mes++;

}
break;
}
case (11):
{
if (dia>30)
{
dia=1;
mes++;
}
break;
}
case (12):
{
if (dia>31)
{
dia=1;
mes=1;
ano++;
}
break;
}
}
q1 = read_adc();
p = (q1*5.0*100)/1024;

//Lectura canal0

lcd_gotoxy (9,1);
printf (lcd_putc, "%02u:%02u:%02u\n%02u/%02u/%Lu %2.1f%C", h, m, s,
dia, mes, ano,p,0xdf);
delay_ms (100);
break;
}
}
}
}

Anda mungkin juga menyukai