Ir ao conteúdo
  • Cadastre-se

LCD + PIC = Relógio e temperatura


Posts recomendados

sim, desse jeito mesmo lincoln, igualzinho esta a.

você ja fez? poderia postar um video? se ja montou é claro.

Não ,Ainda nao pois o PIC16F877A esta esgotado no SoldaFria , Ja tenho Todos os componentes so falta o PIC e o LCD que vou comprar Juntos . Assim que desponibilizar eu monto . =D

Link para o comentário
Compartilhar em outros sites

@Lincon: Sim e sim!

@Nycolas95

Circuito novo:

pCtD3.jpg

Código novo:


Programa teste para fazer um relógio com o 16F877A
Implementada funções que mostram data e dia da semana
Teste promo_version v1.1
by MatheusLPS (Koala)
=============================================================================*/

#include <18F2455.h> //O PIC utilizado, obrigatório!
#device adc=10
#FUSES NOWDT //Sem Watch dog, evitando reset
#FUSES XT //Crystal de oscilação igual a 4mhz
#FUSES PUT //Tempo de início do PIC
#FUSES NOPROTECT //Codigo sem proteção de leitura, software livre!
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection


#use delay(clock=4000000) // Definição do clock utilizado. Obrigatório!

#include <lcd_FLEX.C> //Inclusão da biblioteca de LCD. Obrigatório!

// D0 enable //Pinos utilizados pelo LCD. Podem ser alterados.
// D1 rs
// D2 rw
// D4 D4
// D5 D5
// D6 D6
// D7 D7

/*=====================
Meu Botões:
=======================*/

#define BOTAO1 PIN_B0 //Botão de escolha de ajuste das funçoes.
#define BOTAO_INCREMENTO PIN_B1 //Botão incremento de variáveis.
#define BOTAO_DECREMENTO PIN_B2 //Botão de decremento das variáveis.
//Foram utilizados resistores pull-up e
//pull-down em todos os botões para
//evitar ruídos.

/*=====================
Minhas variáveis:
=======================*/

int16 q=0; //Variável que incrementa a cada 0.5s dentro da interupção do timer1.
int s=0; //Variável dos segundos, incrementa na metade de q.
int m=0; //Variável dos minutos. 0 a 59
int h=0; //Variável das horas. 0 a 23.
int contador=0; //Variável de controle do botão de ajuste.
int ndia_semana=1; //Variável dos dias da semana, é associada a uma string.
int dia=1; //Variável dos dias do mês. 0 a 31.
int mes=1; //Variável dos meses. 0 a 12.
int16 ano=2010; //Variável dos anos. 2000 a 2099.

int16 q1,q2;
float p;

/*=====================
Minha Interrupção:
=======================*/

#int_TIMER1 //Interrupção do Timer1
void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupão.
{
q++; //Variável q incrementada a cada estouro do Timer1
set_timer1 (3036); //Preload do Timer1
}

/*=====================
O programa Principal:
=======================*/
void main()
{
lcd_init(); //Inicializa o LCD (obrigatório)!

/*lcd_gotoxy (2,1); //Coluna 6, linha 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);
lcd_gotoxy (16,1);
lcd_putc (".");
delay_ms(500);
lcd_putc ("\f");
delay_ms(1000);*/

setup_adc_ports(AN0); //Canal 0 analógico
setup_adc(ADC_CLOCK_DIV_8); //Fuente de reloj RC
set_adc_channel(0); //Habilitación canal0
delay_us(20);

setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8
set_timer1 (3036); //Preload do Timer1
enable_interrupts(INT_TIMER1); //Habilita interrupção timer1
enable_interrupts(global); //habilita interrupcão global

while(TRUE) //Loop Principal
{
/*=====================================================================
Teste do botão de ajuste. A medida que é precionado, a variável contador
incrementa e as diversas funções de ajustes podem ser efetuadas. São 6
funções de ajuste, HORA, MINUTO, DIA DA SEMANA,DIA DO MES, MÊS e ANO. A
cada ajuste de uma função, o menu principal com todas as informações é
mostrado.
=====================================================================*/

if (input(BOTAO1)) //Teste do botão.
{
delay_ms (100); //Para evitar retorno.
if (contador>11) //Se maior q 11, zera o contador.
{
contador=0;
}

contador++; //Incremento da variável contador.
}

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

if (h>23) //Se a hora for maior que 23, reset.
{
h=0;
}
}

if (input (BOTAO_DECREMENTO)) //Decrementa a variável H(hora).
{
delay_ms (75);
h--;

if (h==255) //H é uma variável inteira de 8 bits.
{ //Quando é decrementada para um valor
h=23; //menor que zero, se torna 255. Ou seja,
} //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 variável 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) //Diferente aqui.
{
m=0;
}
}

if (input (BOTAO_DECREMENTO))
{
delay_ms (75);
m--;

if (m==255) //Igual aqui.
{
m=59;
}
}

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 função ficou meio bagunçada. Pesquisarei
um pouco sobre como trasformar uma string numa variável. Só
consegui fazer isso com 1 (um) caracter, mas não é o ideal. Depois disso,
provavelmente essa parte ficará mais enxuta.

A função ficou assim: Uma variável chamada ndia_semana(número dia da
semana) é incrementada de 1 a 7. Cada número é 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 função SWITCH para
associar cada número 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; //Variável q sempre resetada nos menus.
break;
}

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: \n%02u", mes);
delay_ms (100);
break;
}

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: \n%Lu", ano);
delay_ms (100);
break;
}

default: //Menu principal. Mostra todas as informações.
{
s=q/2; //A variável Q incrementa a 2Hz, então os segundos
//devem ser a metade.
if (s==60) //Se for igual a 60, reset em Q e S. M incrementa.
{
q=0;
s=0;
m++;
}

if (m>59)
{
m=0;
h++;
}

if (h>23) //Se H(horas) for maior q 23, reset. DIA DA SEMANA
{ //e DIA DO MÊS 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, "sábado ");
delay_ms (100);
break;
}
}

switch (mes) //Para saber se um mês possui 31, 30 ou 28 dias.
{ //Numa versão mais nova, farei essa rotina 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(); //Lectura canal0
p = (q1*5.0*100)/1024;

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;
}
}
}
}
/*=============================================================================

Arquivos para download: Relogio_LCD_novo

O arquivo que se chama LCD_Flex.C você copia e cola ele dentro da psta Arquivos de programas>PICC>Drivers

Falou

Link para o comentário
Compartilhar em outros sites

Boa lincon!

E nycolas, o colega janascimento está correto! Não compensa montar um gravador, a não ser que você queira montar o seu. Mas EU prefiro comprar pronto, bem menos dor de cabeça.

Sem falar que você pode comprar o de 26 reais. Sendo que o seu PC tem que ter conector serial atrás.

Falou

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...