Veja o funcionamento na imagem ( simulado no proteus ISIS 7.0 )
Abaixo um código exemplo do uso da biblioteca com PIC 16F877A
OBS : esse código usa a biblioteca lcd_flex.c ( fornecida por mim neste tópico )
#include<16f877.h> #use delay(clock=4000000) #use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7) #fuses XT,NOWDT,PUT,NOBROWNOUT #include<input.c> #include<string.h> #include<stdio.h> #include<libDS1307.c> #define LCD_DB4 PIN_B4 #define LCD_DB5 PIN_B5 #define LCD_DB6 PIN_B6 #define LCD_DB7 PIN_B7 #define LCD_RS PIN_B2 #define LCD_E PIN_B3 #include<lcd_flex.c> #define BT_ajustaHora_e_mais pin_a0 //botao para entrar no ajuste de hora e dado++ #define BT_ajutaData_e_menos pin_a1 //botao para entrar no ajuste de data e dado-- #define BT_desloca_dir pin_a2 //desloca para direita #define BT_desloca_esq pin_a3 //desloca cursor para esquerda // [...] quantos botões a aplicação exigir #define ajuste_hora 1 #define ajuste_data 2 /* VAriaveis globais */ byte _dia,_mes,_ano,_dow,_hora,_min,_seg; //Variaveis que guardam os dados int op=0; // variavel que mostra qual botao foi prescionado /* Protótipo das funções */ void carrega_dados(); boolean debouce(); void trata_botoes(int op); /* Declaração das funções */ void carrega_dados() { ds1307_get_date(&_dia,&_mes,&_ano,&_dow); ds1307_get_time(&_hora,&_min,&_seg); } boolean debounce(void) { disable_interrupts(INT_TIMER1); //desabilita interrupção delay_ms(150); if((!input(BT_ajustaHora_e_mais ))|(!input( BT_ajutaData_e_menos))) { return true; } else return false; } void trata_botoes(int op) { switch(op) { case ajuste_hora: //[...] Aqui o usuario define os comando de ajuste de hora //printf("ajuste de hora\r") // linha para debug break; case ajuste_data: //[...] Aqui o usuario define os comando de ajuste de data //printf("ajuste de data\r") // linha para debug break; default: break; } } #INT_TIMER1 void atualiza_hora() { /******************************************************/ /* A interrupção é chamada a cada 1s e atualiza */ /* os dados adquiridos pelo DS1307 através do TIMER1 */ /******************************************************/ char dia_semana[7][4]={"dom","seg","ter","qua","qui","sex","sab"}; char dia_hoje[4]; set_timer1(3036-get_timer1()); ds1307_get_time(&_hora,&_min,&_seg); ds1307_get_date(&_dia,&_mes,&_ano,&_dow); strcpy(dia_hoje,dia_semana[_dow-1]); lcd_gotoxy(1,1); printf(lcd_putc,"%s - %02d/%02d/%02d",dia_hoje,_dia,_mes,_ano); lcd_gotoxy(5,2); printf(lcd_putc,"%02d:%02d:%02d ",_hora,_min,_seg); } void main() { /***************************************/ /* Configurações dos PORTS e TIMER1 e */ set_tris_b(0); set_tris_c(0b00011000); set_tris_e(1); set_tris_a(1); enable_interrupts(INT_TIMER1); setup_timer_1( T1_INTERNAL|T1_DIV_BY_8); set_timer1(3036); disable_interrupts(INT_TIMER0); enable_interrupts(GLOBAL); /**************************************/ //Inicializa o LCD e o DS1307 lcd_init(); delay_ms(1000); ds1307_init(); while(1) { /**************************************************************************/ /* Tratamento de botões /* Para o tratamento de botões pode usar as seguinte técnicas: /* >> Botoões no PORTB - trata interrupção de mundança de estado /* Vantagens: >Não é necessário scan em loop infinito /* sempre então o evento será tratado independente do tempo de prescionamento /* Desvantagens: /* >É preciso verificar qual botão foi prescionado /* para então trata-lo /* >Ruídos no PORTB podem causar mau funcionamento /* >> Scan dos butões /* Vantagens /* >Maior estabilidade contra ruídos /* >Cada botão pode ter sua própria função() /* Desvantagens /* >Tempo é crítico /* >Debounce necessita ter outras interrupções desativadas /* Neste programa será usado o scan /* Apenas um modelo como a implementação é trabalhosa não foi feita aqui /**************************************************************************/ if((!input(BT_ajustaHora_e_mais ))) { if(debounce()) { op = ajuste_hora; trata_botoes(op); } } else if((!input(BT_ajutaData_e_menos))) { if(debounce()) { op = ajuste_data; trata_botoes(op); } } enable_interrupts(INT_TIMER1); //após tratar os botões habilita interrupção } }
Espero ter ajudado!
Abraço!
Ola alyson tentei montar aqui o circuito e o codigo fonte,porém o mesmo esta dando erro.será que você não poderia postar um codigo fonte sem ajustes das horas, somente para mostrar as horas no display.
Ola alyson tentei montar aqui o circuito e o codigo fonte,porém o mesmo esta dando erro.Será que você poderia postar um codigo fonte sem ajustes das horas, somente para mostrar as horas no display.
Ola gostaria de saber se você consegui resolver este problema,pois tambem estou enfrentando o mesmo problema que você.Se você consegui resolver,poderia me ajudar.Tambem uso o ccs.Obrigado