bu tür hazır istemlere çok karşı birisi olarak sana çalışan bir termometre ve saat devresi yolluyorum.belki başka bir ihtiyacı olanda çıkar.
#include <16f877A.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#device ADC=10 // ADC yi 10 bit ayarla
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD//sigortalar
#use delay(CLOCK=4000000)//kristal frenkası bildiriliyor.
#define use_portb_lcd TRUE//lcd PORT B ye bağlanacak
#include <ONURDS1302.C>//RTC kütüphanesini ekle
#include <ONURLCD_pd.c> //LCD kütüphanesini ekle
//buton tanımlamaları
#define set pin_a5
#define sol pin_e0
#define yukari pin_e1
#define asagi pin_e2
// değişken tanımlamaları
unsigned int saniye,dakika,saat,gun,ay,yil,haftanin_gunu;
unsigned int gun1,ay1,yil1,saat1,dakika1,derece1,deger=1;
unsigned long int bilgi; // digital bilgi değişkeni
float voltaj,sicaklik; // analog değer değişkeni
void goruntule()// verileri ekranda görüntüleme fonksiyonu
{
lcd_gotoxy(1,1);
printf(lcd_putc,"%02d:%02d:%02d",saat,dakika,saniye);
lcd_gotoxy(1,2);
printf(lcd_putc,"%02d/%02d/20%02d"gun,ay,yil);}
void main ( )
{
set_tris_a(0x0F);
setup_adc(adc_clock_div_32); // ADC clock frekansını ayarla fosc/32
setup_adc_ports(AN0); //RA0/AN0 girişi analog
set_adc_channel(0); // RA0/AN0 ucundaki sinyale A/D işlemi uygula
delay_us(20); //kanal seçimi beklemesi
enable_interrupts(GLOBAL); // Tüm kesmeler aktif
lcd_init();//lcd yi hazırla
while(1) // sonsuz döngü hazırla
{
anadongu:
bilgi=read_adc(); // digital değeri yükle
voltaj=(0.0048828125*bilgi)*1000;
sicaklik=(voltaj/10); // Her 10mV'ta 1 derece artma
rtc_init();//rtc yi hazırla
rtc_get_time(saat,dakika,saniye);//rtc den saat bilgilerini al
rtc_get_date(gun,ay,yil,haftanin_gunu);//rtc den takvim bilgilerini al
goruntule();//fonksiyonu çağır ve verileri ekranda görüntüle
if(saniye==59)//gecen zaman 1 dakika ya eşit mi ?
{
lcd_gotoxy(10,1);
printf(lcd_putc,"%fßC" sicaklik);
delay_ms(250);// 1000 ms bekle
}
if(input(set))// SET tuşuna basılırsa menü ye git ve sonsuz döngüden çık
{
while(input(set));// butonun bırakılmasını bekle
lcd_putc("\f");//lcd'yi temizle
goto ayar;//menü isimli alt programa git
}
output_c(0x01);
delay_ms(500);//600 ms bekle
/////sonsuz döngünün sonu işlemleri tekrarla
}
ayar:// saat ayarlama alt programı
lcd_gotoxy(1,1);
printf(lcd_putc,"%02d:%02d:%02d",saat,dakika,saniye);
lcd_gotoxy(1,2);
printf(lcd_putc,"%02d:%02d:%02d",gun,ay,yil);
if(input(set))
{
while(input(set));
deger++;
}
if(input(sol))
{
while(input(sol));
deger--;
if(deger==0)
deger=1;
}
switch(deger)
{
case 1:
{
lcd_gotoxy(1,1);
lcd_putc('z');
delay_ms(100);
if(input(yukari))
{
while(input(yukari));
saat++;
if(saat==24)
saat=0;
}
if(input(asagi))
{
while(input(asagi));
saat--;
if(saat==255)
saat=23;
}
}
break;
case 2:
{
lcd_gotoxy(4,1);
lcd_putc('z');
delay_ms(10);
if(input(yukari))
{
while(input(yukari));
dakika++;
if(dakika==60)
dakika=0;
}
if(input(asagi))
{
while(input(asagi));
dakika--;
if(dakika==255)
dakika=59;
}
}
break;
case 3:
{
lcd_gotoxy(1,2);
lcd_putc('z');
delay_ms(100);
if(input(yukari))
{
while(input(yukari));
gun++;
if(gun==32)
gun=1;
}
if(input(asagi))
{
while(input(asagi));
gun--;
if(gun==255)
gun=31;
}
}
break;
case 4:
{
lcd_gotoxy(4,2);
lcd_putc('z');
delay_ms(100);
if(input(yukari))
{
while(input(yukari));
ay++;
if(ay==13)
ay=1;
}
if(input(asagi))
{
while(input(asagi));
ay--;
if(ay==255)
ay=12;
}
}
break;
case 5:
{
lcd_gotoxy(7,2);
lcd_putc('z');
delay_ms(100);
if(input(yukari))
{
while(input(yukari));
yil++;
if(yil==100)
yil=0;
}
if(input(asagi))
{
while(input(asagi));
yil--;
if(yil==255)
yil=99;
}
}
break;
}
if(deger==6)
{
rtc_init(); // DS1302 başlangıç ayarları yapılıyor
rtc_set_datetime(gun,ay,yil,haftanin_gunu,saat,dakika);
lcd_send_byte(0,0x0c);
lcd_putc("\f");
deger=1;
goto anadongu;
}
goto ayar;
goto anadongu;//anadongüye git sonsuz döngüye gir.
}