// DS1302 ile saat ve takvim projesi #include #include #include #include #include #define ayar RA0 // AYAR butonu bağlı #define arttir RA1 // ARTTIR butonu bağlı #define azalt RB7 // AZALT butonu bağlı // Konfigürasyon ayarları __CONFIG(XT&WDTDIS&PWRTEN&LVPDIS); // ANA PROGRAM main(void) { unsigned char saat,dakika,saniye,gun,ay,yil,haftagun; unsigned char saat10,saat1,dakika10,dakika1,saniye10,saniye1; unsigned char gun10,gun1,ay10,ay1,yil10,yil1,sayac,i; unsigned char LCDsaat[]=" "; unsigned char LCDtarih[]=" "; unsigned char CHbit; // Port tanımlamaları ve başlangıç ayarları TRISA=0x03; // LCD için RA2-3 ve RB0-1-2-3 çıkış.DS1302 için TRISB=0x80; // RB4-5-6 çıkış.Butonlar için RA0-1, RB7 giriş. PORTA=0; PORTB=0; // Başlangıç durumu ayarları CMCON=0x07; DelayMs(250); lcd_init(); lcd_clear(); lcd_write(0x0C); // imleci gizle // DS1302 ayarları DS1302_yaz(0x8E,0x00); // Kontrol kaydedicisi ayarları DS1302_yaz(0x90,0xA5); // Şarj kaydedicisi ayarları //---------------------------------------- // CH bitinin kontrolu icin EKLEME 22-12-08 //---------------------------------------- saniye=DS1302_oku(0x81); // saniyeyi oku CHbit=(saniye&0x80)>>7; // 7.bit CH (clock halt) bitidir if(CHbit==1){ // CH biti 1 olarak okunduysa 0 yap saniye=saniye&0x7F; DS1302_yaz(0x80,saniye); } //---------------------------------------- lcd_goto(0x00); lcd_puts(" ELEKTRONiK "); lcd_goto(0x40); lcd_puts(" SAAT ve TAKViM "); for(i=0;i<4;i++)DelayMs(250); sayac=0; for(;;){ // SONSUZ döngü // Sıralı olarak DS1302 kaydedicilerini oku SCLK=0; reset_3w(); bayt_yaz(0xBF); // sıralı okuma için komut baytı saniye=DS1302_oku(0x81); dakika=DS1302_oku(0x83); saat=DS1302_oku(0x85); gun=DS1302_oku(0x87); ay=DS1302_oku(0x89); haftagun=DS1302_oku(0x8B); yil=DS1302_oku(0x8D); reset_3w(); lcd_clear(); // BCD'den onluk tabana dönüşüm yap saat10=saat/16; saat1=saat%16; dakika10=dakika/16; dakika1=dakika%16; saniye10=saniye/16; saniye1=saniye%16; gun10=gun/16; gun1=gun%16; ay10=ay/16; ay1=ay%16; yil10=yil/16; yil1=yil%16; sprintf(LCDsaat,"%d%d:",saat10,saat1); sprintf(LCDsaat+3,"%d%d:",dakika10,dakika1); sprintf(LCDsaat+6,"%d%d",saniye10,saniye1); lcd_goto(0x00);lcd_puts(LCDsaat); lcd_goto(0x0A); if(haftagun==1)lcd_puts("PAZAR"); if(haftagun==2)lcd_puts("P.TESi"); if(haftagun==3)lcd_puts("SALI"); if(haftagun==4)lcd_puts("CARSA."); if(haftagun==5)lcd_puts("PERSE."); if(haftagun==6)lcd_puts("CUMA"); if(haftagun==7)lcd_puts("C.TESi"); sprintf(LCDtarih,"%d%d/",gun10,gun1); sprintf(LCDtarih+3,"%d%d/",ay10,ay1); sprintf(LCDtarih+6,"20%d%d",yil10,yil1); lcd_goto(0x40);lcd_puts(LCDtarih); for(i=0;i<2;i++)DelayMs(250); // 0.5s bekle // Butonla saat ve tarih ayarlama if(ayar==1){ // AYAR butonuna basıldı mı? sayac++; // Evet ise sayacı 1 arttır if(sayac==7)sayac=0; for(i=0;i<2;i++)DelayMs(150); // 0.3s bekle } if(sayac==0){ lcd_goto(0x00); lcd_write(0x0C); // imleci gizle } if(sayac==1){ lcd_goto(0x00); lcd_write(0x0E); // imleci aç, yanıp sönmesin if(arttir==1){ // saat ayarlama bölümü saat1++; // birler hanesini arttır if(saat1==10){saat1=0;saat10++;} if(saat10==2 && saat1==4){saat10=0;saat1=0;} saat=((saat10<<4)&0xF0) | (saat1&0x0F); DS1302_yaz(0x84,saat); // saat güncellendi } if(azalt==1){ // saat ayarlama bölümü saat1--; // birler hanesini azalt if(saat10==0 && saat1==255){saat10=2;saat1=3;} if(saat1==255){saat1=9;saat10--;} saat=((saat10<<4)&0xF0) | (saat1&0x0F); DS1302_yaz(0x84,saat); // saat güncellendi } } if(sayac==2){ lcd_goto(0x03); lcd_write(0x0E); // imleci aç, yanıp sönmesin if(arttir==1){ // dakika ayarlama bölümü dakika1++; // birler hanesini arttır if(dakika1==10){dakika1=0;dakika10++;} if(dakika10==6 && dakika1==0){dakika10=0;dakika1=0;} dakika=((dakika10<<4)&0xF0) | (dakika1&0x0F); DS1302_yaz(0x82,dakika); // dakika güncellendi } if(azalt==1){ // dakika ayarlama bölümü dakika1--; // birler hanesini azalt if(dakika10==0 && dakika1==255){dakika10=5;dakika1=9;} if(dakika1==255){dakika1=9;dakika10--;} dakika=((dakika10<<4)&0xF0) | (dakika1&0x0F); DS1302_yaz(0x82,dakika); // dakika güncellendi } } if(sayac==3){ lcd_goto(0x0A); lcd_write(0x0E); // imleci aç, yanıp sönmesin if(arttir==1){ // haftanın gününü ayarlama bölümü haftagun++; if(haftagun==8)haftagun=1; DS1302_yaz(0x8A,haftagun); // haftanın günü güncellendi } if(azalt==1){ // haftanın gününü ayarlama bölümü haftagun--; if(haftagun==0)haftagun=7; DS1302_yaz(0x8A,haftagun); // haftanın günü güncellendi } } if(sayac==4){ lcd_goto(0x40); lcd_write(0x0E); // imleci aç, yanıp sönmesin if(arttir==1){ // gün ayarlama bölümü gun1++; // birler hanesini arttır if(gun1==10){gun1=0;gun10++;} if(gun10==3 && gun1==2){gun10=0;gun1=1;} gun=((gun10<<4)&0xF0) | (gun1&0x0F); DS1302_yaz(0x86,gun); // gün güncellendi } if(azalt==1){ // gün ayarlama bölümü gun1--; // birler hanesini azalt if(gun10==0 && gun1==0){gun10=3;gun1=1;} if(gun1==255){gun1=9;gun10--;} gun=((gun10<<4)&0xF0) | (gun1&0x0F); DS1302_yaz(0x86,gun); // gün güncellendi } } if(sayac==5){ lcd_goto(0x43); lcd_write(0x0E); // imleci aç, yanıp sönmesin if(arttir==1){ // ay ayarlama bölümü ay1++; // birler hanesini arttır if(ay1==10){ay1=0;ay10++;} if(ay10==1 && ay1==3){ay10=0;ay1=1;} ay=((ay10<<4)&0xF0) | (ay1&0x0F); DS1302_yaz(0x88,ay); // ay güncellendi } if(azalt==1){ // ay ayarlama bölümü ay1--; // birler hanesini azalt if(ay10==0 && ay1==0){ay10=1;ay1=2;} if(ay1==255){ay1=9;ay10--;} ay=((ay10<<4)&0xF0) | (ay1&0x0F); DS1302_yaz(0x88,ay); // ay güncellendi } } if(sayac==6){ lcd_goto(0x48); lcd_write(0x0E); // imleci aç, yanıp sönmesin if(arttir==1){ // yıl ayarlama bölümü yil1++; // birler hanesini arttır if(yil1==10){yil1=0;yil10++;} if(yil10==10 && yil1==10){yil10=0;yil1=0;} yil=((yil10<<4)&0xF0) | (yil1&0x0F); DS1302_yaz(0x8C,yil); // yıl güncellendi } if(azalt==1){ // yıl ayarlama bölümü yil1--; // birler hanesini azalt if(yil10==0 && yil1==255){yil10=9;yil1=9;} if(yil1==255){yil1=9;yil10--;} yil=((yil10<<4)&0xF0) | (yil1&0x0F); DS1302_yaz(0x8C,yil); // yıl güncellendi } } // } // sonsuz döngü }