DS1302 ayarlı dijital saat ayar buton'u ekleme

Başlatan mechanicalengine, 24 Nisan 2014, 02:36:22

mechanicalengine

Arkadaşlar merhaba;

PIC16f877A ve DS1302 kullanarak her gün aynı saatte bir LED'i yakan bir yazılım yaptım. Yazılımda bulunan dijital saati PIC'e üç buton ekleyerek ayarlamak istiyorum

(1.buton-saat,dakika,gün,ay,yıl seçmek için seçim tuşu/
2.buton-rakamları artan şekilde ayarlamak için yukarı butonu/
3.buton- rakamları azalan yönde ayarlamak için aşağı butonu)

Başlangıç olarak tavsiye edebileceğiniz örnek bir yazılım veya uygulama olabilir mi?

Yardımlarınız için şimdiden teşekkürler.




Recep METE

include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları

#use delay (clock=4000000)                         //4mhz delay süresi

#include "flex_lcd.c"                            //lcd c dosyası
#include "ds18b20.c"                              //termometre entegresi c dosyası
#include "ds1302.C"                               //saat entegresi c dosyasi


int8 saniye,dakika,saat,gun,ay,hafta,yil,ayar=0;
float sicak;
void lcd()
{
   lcd_gotoxy(1,1);
   printf(lcd_putc,"%02d/%02d/%02d",gun,ay,yil);  
   lcd_gotoxy(1,2);
   printf(lcd_putc,"%02d:%02d:%02d",saat,dakika,saniye);
   lcd_gotoxy(11,1);
   switch(hafta)  
      {                     
         case 1: printf(lcd_putc,"Pzts"); break; 
         case 2: printf(lcd_putc,"SALI"); break; 
         case 3: printf(lcd_putc,"CARS"); break; 
         case 4: printf(lcd_putc,"PERS"); break;
         case 5: printf(lcd_putc,"CUMA"); break; 
         case 6: printf(lcd_putc,"Cmts"); break; 
         case 7: printf(lcd_putc,"Pzar"); break; 
      }
}
void sicaklik()
{
   sicak=ds1820_read();  //termometre entegresindeki değeri sicak değişkenine aktar
   
   if(sicak>=85){
       sicak=0;}
   
   lcd_gotoxy(10,2);printf(lcd_putc,"%2.1f",sicak);
   lcd_gotoxy(15,2);lcd_send_byte(0x4a,0xdf);lcd_gotoxy(16,2);printf(lcd_putc,"C");
}
void ayaryap(){
//(0x0d) lcd belirtilen konumun yanıp sönmesi

   if(input(pin_d0)==0){ayar++;delay_ms(20);printf(lcd_putc,"\f AYAR MODU");delay_ms(450);printf(lcd_putc,"\f");}

   while(ayar==1){
   lcd();lcd_gotoxy(1,1);lcd_send_byte(0x01,0x0d);lcd_gotoxy(2,1);lcd_send_byte(0x02,0x0d);   
   if(input(pin_d0)==0){gun++;delay_ms(20);if(gun==32){gun=1;}while(input(pin_d0)==0);}
   if(input(pin_d1)==0){gun--;delay_ms(20);if(gun==0){gun=31;}while(input(pin_d1)==0);}
   if(input(pin_d2)==0){ayar++;delay_ms(200);while(input(pin_d2)==0);}}
   
   while(ayar==2){
   lcd();lcd_gotoxy(4,1);lcd_send_byte(0x04,0x0d);lcd_gotoxy(5,1);lcd_send_byte(0x05,0x0d);
   if(input(pin_d0)==0){ay++;delay_ms(20);if(ay==13){ay=1;}while(input(pin_d0)==0);}
   if(input(pin_d1)==0){ay--;delay_ms(20);if(ay==0){ay=12;}while(input(pin_d1)==0);}
   if(input(pin_d2)==0){ayar++;delay_ms(200);while(input(pin_d2)==0);}}
   
 
   while(ayar==3){
   lcd();lcd_gotoxy(7,1);lcd_send_byte(0x07,0x0d);lcd_gotoxy(8,1);lcd_send_byte(0x08,0x0d);
   if(input(pin_d0)==0){yil++;delay_ms(20);while(input(pin_d0)==0);}
   if(input(pin_d1)==0){yil--;delay_ms(20);if(yil==-1)yil=99;while(input(pin_d1)==0);}
   if(input(pin_d2)==0){ayar++;delay_ms(200);while(input(pin_d2)==0);}}
   
   while(ayar==4){
   lcd_gotoxy(11,1);lcd_send_byte(0x11,0x0d);lcd();delay_us(5);
   if(input(pin_d0)==0){hafta++;delay_ms(20);if(hafta==8){hafta=1;}while(input(pin_d0)==0);}
   if(input(pin_d1)==0){hafta--;delay_ms(20);if(hafta==0){hafta=7;}while(input(pin_d1)==0);}
   if(input(pin_d2)==0){ayar++;delay_ms(200);while(input(pin_d2)==0);}}
   
   while(ayar==5){
   lcd_gotoxy(1,2);lcd_send_byte(0x40,0x0d);lcd_gotoxy(2,2);lcd_send_byte(0x41,0x0d);lcd();
   if(input(pin_d0)==0){saat++;delay_ms(20);if(saat==24){saat=0;}while(input(pin_d0)==0);}
   if(input(pin_d1)==0){saat--;delay_ms(20);if(saat==-1){saat=23;}while(input(pin_d1)==0);}
   if(input(pin_d2)==0){ayar++;delay_ms(200);while(input(pin_d2)==0);}}
   
   while(ayar==6){
   lcd_gotoxy(4,2);lcd_send_byte(0x43,0x0d);lcd_gotoxy(5,2);lcd_send_byte(0x44,0x0d);lcd();
   if(input(pin_d0)==0){dakika++;delay_ms(20);if(dakika==60){dakika=0;}while(input(pin_d0)==0);}
   if(input(pin_d1)==0){dakika--;delay_ms(20);if(dakika==-1){dakika=59;}while(input(pin_d1)==0);}
   if(input(pin_d2)==0){ayar++;delay_ms(200);while(input(pin_d2)==0);}}
   
   
   while(ayar==7){rtc_set_datetime(gun,ay,yil,hafta,saat,dakika);    //değişkenleri saat entegresine aktar.
   delay_ms(20);
   printf(lcd_putc,"\f    AYARLAR\n   YUKLENIYOR");
   delay_ms(1000);printf(lcd_putc,"\f");
   ayar=0;}
}   
void main()
{  

   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   lcd_init();       //lcd yi hazırla
   rtc_init();       //saat entegresini hazırla
   delay_ms(5);
   printf(lcd_putc,"\fRECEP METE\nALACAM-SAMSUN");
   delay_ms(200);
   printf(lcd_putc,"\f");
   delay_ms(5);    
   
while(1)
{
      if(ayar==0){rtc_get_time(saat,dakika,saniye);rtc_get_date(gun,ay,yil,hafta);}
      sicaklik();
      lcd();
      ayaryap();
}
}

   



Takıldığın yerlerde yardımcı olurum.İyi çalışmalar.

printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

mechanicalengine

@semfero hocam desteğiniz için çok teşekkürler. Program eksiksiz çalışıyor. Acemiliğime sığınarak küçük bir sorum daha olacak.

Ana programa şu şekilde bir ekleme yaptım.

if(saat==8&&dakika==00&&saniye==00)
               {
               set_tris_b(0b00000001);
               output_b(0x00);
               output_high(pin_b2);
               ext_int_edge(H_TO_L);
               enable_interrupts(INT_EXT);
               enable_interrupts(GLOBAL);
               }


ve kesmeyi aşağıdaki gibi tanımladım.

int i=1;
#int_ext
void kesme(void)
//for(i=1;i<=8;i++)
{
   if (i==1){output_high(pin_b1);output_low(pin_b2);delay_ms(1000);output_low(pin_b1);output_high(pin_b2);}
   if (i==2){output_high(pin_b1);output_low(pin_b2);delay_ms(1000);output_low(pin_b1);output_high(pin_b2);}
   if (i==3){output_high(pin_b1);output_low(pin_b2);delay_ms(1000);output_low(pin_b1);output_high(pin_b2);}
   if (i==4){output_low(pin_b1);output_low(pin_b2);output_high(pin_b3);}
   if (i==5){output_low(pin_b1);output_low(pin_b2);output_high(pin_b3);}
   if (i==6){output_low(pin_b1);output_low(pin_b2);output_high(pin_b3);}
   if (i==7){output_low(pin_b1);output_low(pin_b2);output_low(pin_b3);}
   i++;
}


sorunum kesme döngüsü ilk başta eksiksiz çalışıyor fakat ertesi gün saat tekrar 8 olduğunda kesme sayısı 7'yi aştığı için i==1'den başlamıyor, dolayısıyla aynı döngüye girip kesmeler çalışmıyor.

for(i=1;i<=8;i++)


şeklinde döngüye girmesini istiyorum fakat başarılı olamıyorum. Rica etsem bu konu hakkında da yardımcı olma şansınız olabilir mi?

Şimdiden teşekkürler.