While döngüsünden çıkamama

Başlatan Sümeyra, 09 Ağustos 2017, 16:40:11

Sümeyra

Merhaba aşağıdaki kodlarda ayar butonuna basıldıkça saat menüsü içinde sırasıyla gün, ay, yil, saat, dakika ayarlarını yaptırmak istiyorum. ayar 1 kere sayıp gün ayarı menüsüne girdikten sonra çıkmıyor. Ekranda günü arttırıp azaltıyor ama ayar butonuna basınca diğer menüye geçmiyor,sadece geri butonuyla çıkış yapıyor. Bu "while "menülerini ekledikten sonra oldu . "while(saatmenu)" içine girdikten sonra ayar butonuna basılsa da ayar =2 olup ay menüsüne giriş yapmıyor. Bunu nasıl çözebilirim?
       while(saatmenu){                        
       
       if(input(alarm_ayar)==1)
    {
       ayar++;
       delay_ms(100);      
    }

    if(ayar==1)
    {
     gunayari=1;
     while(gunayari)
     {
      printf(lcd_putc,"\fGUN");
      printf(lcd_putc,"\n%02d",gun); //LCD'ye gün,ay,yıl bilgileri yazdırılıyor
      if(input(arttir)==1)
      {
         delay_ms(50);
         while(input(arttir)==1);   
         gun++;
         if(gun==32) gun=1;
      }
      if(input(azalt)==1)
      {
         delay_ms(50);
         while(input(azalt)==1);
         gun--;
         if(gun==0) gun=31;
      }
         ds1307_set_date_time(gun,ay,yil,haftanin_gunu,saat,dakika,saniye);
         if(input(geri)==1) { gunayari=0; }
    }
    }
    
   if(ayar==2)
    {
      ayayari=1;
      while(ayayari)
      {
      printf(lcd_putc,"\fAY");
      printf(lcd_putc,"\n%02d",ay); //LCD'ye gün,ay,yıl bilgileri yazdırılıyor
      if(input(arttir)==1)
      {
         delay_ms(50);
         while(input(arttir)==1);
         ay++;
         if(ay==13) ay=1;
      }
      if(input(azalt)==1)
      {
         delay_ms(50);
         while(input(azalt)==1);
         ay--;
         if(ay==0) ay=12;
      }
          ds1307_set_date_time(gun,ay,yil,haftanin_gunu,saat,dakika,saniye);
          if(input(geri)==1) { ayayari=0; }
      }
      }
    
    
   if(ayar==3)
    {
      yilayari=1;
      while(yilayari)
      {
      printf(lcd_putc,"\fYIL");
      printf(lcd_putc,"\n20%02d",yil); 
      if(input(arttir)==1)
      {
         delay_ms(50);
         while(input(arttir)==1);
         yil++;
         if(yil==2037) yil=2017;
      }
      if(input(azalt)==1)
      {
         delay_ms(50);
         while(input(azalt)==1);
         
         yil--;
         if(yil==2017) yil=2037;
      }
         ds1307_set_date_time(gun,ay,yil,haftanin_gunu,saat,dakika,saniye);
         if(input(geri)==1) { yilayari=0; }
      }
    }
    
   
                       
   if(ayar==4)
   {
      saatayar=1;
      while(saatayar)
      {
      printf(lcd_putc,"\fSAAT");
      printf(lcd_putc,"\n%02d",saat);
      if(input(arttir)==1)
      {
         delay_ms(50);
         while(input(arttir)==1);
         saat++;
         if(saat==24) saat=0;
      }
      if(input(azalt)==1)
      {
         delay_ms(50);
         while(input(azalt)==1);
         saat--;
         if(saat==-1) saat=23;
      }
         ds1307_set_date_time(gun,ay,yil,haftanin_gunu,saat,dakika,saniye);
         if(input(geri)==1) { saatayar=0; }
   }
   }
    
   if(ayar==5)
  {
      dakikaayar=1;
      while(dakikaayar)
      {
      printf(lcd_putc,"\fDAKIKA");
      printf(lcd_putc,"\n%02d",dakika);
      if(input(arttir)==1)
      {
         delay_ms(50);
         while(input(arttir)==1);
         dakika++;
         if(dakika==60) dakika=0;
      }
      if(input(azalt)==1)
      {
         delay_ms(50);
         while(input(azalt)==1);
         dakika--;
         if(dakika==-1) dakika=59;
      }
         ds1307_set_date_time(gun,ay,yil,haftanin_gunu,saat,dakika,saniye);
         if(input(geri)==1) { dakikaayar=0; }
    }
  }
   
   
   if(ayar==6||input(geri)==1)
   {
         ayar=0; saatmenu=0;
   }

   if(input(geri)==1)     {  ayar=0; anamenu=1; saatmenu=0; delay_ms(100);  }
        
          ds1307_get_time(saat,dakika,saniye);
          ds1307_get_date(gun,ay,yil,haftanin_gunu);     
          
        printf(lcd_putc,"\fTarih:%02d/%02d/20%02d ",gun,ay,yil); //LCD'ye gün,ay,yıl bilgileri yazdırılıyor
         
      switch(haftanin_gunu)  // DS1302'den sayısal olarak alınan haftanın günü bilgisine
        {                      // metin olarak karşılık atanıyor
         case 1: printf(lcd_putc,"\nPazar"); break; // Eğer "1" ise LCD'ye PAZ yaz
         case 2: printf(lcd_putc,"\nPazartesi"); break; // Eğer "2" ise LCD'ye PZT yaz
         case 3: printf(lcd_putc,"\nSali"); break; // Eğer "3" ise LCD'ye SAL yaz
         case 4: printf(lcd_putc,"\nCarsamba"); break; // Eğer "4" ise LCD'ye CRS yaz
         case 5: printf(lcd_putc,"\nPersembe"); break; // Eğer "5" ise LCD'ye PER yaz
         case 6: printf(lcd_putc,"\nCuma"); break; // Eğer "6" ise LCD'ye CUM yaz
         case 7: printf(lcd_putc,"\nCumartesi"); break; // Eğer "7" ise LCD'ye CTS yaz
      }
     
         printf(lcd_putc,"\nSaat:%02d:%02d:%02d",saat,dakika,saniye); // LCD'ye saat,dakika ve saniye değerlerini yaz
         delay_ms(200); // 1 sn gecikme veriliyor
        
       }       

en başta
int yilayari=0;
int ayayari=0;
int gunayari=0;
int saatayar=0;
int dakikaayar=0;
şeklinde tanımlı.

foseydon

while(saatmenu) döngüsü içerisine görmenizi sağlayan ne?

saatmenu değişkeninin "true" olması.

Peki while döngüsünün içerisinde saatmenu değişkenini "false" yapan bir ifade var mı? Yok.

Bu durumda, program o döngüden asla çıkamaz. Çözüm izin döngünün içerisinde o değişkeni bir noktada "false" yapmanız gerekiyor.

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Sümeyra

 4 buton kullanıyorum ayar(alarm_ayar olarak tanımladım), arttır, azalt ve geri butonları. günayarı menüsünden çıkmıyordu ona da "if(input(alarm_ayar)==1) gunayari=0;" kodunu ekledim .  ay, yil, saat, dakika ayar menülerine de uygun şekilde ekleyince ayar butonuna basıldıkça menüler arasında geziyor. Ama bu sefer de geçiş yaparken önce hızlıca tarih ve saat in olduğu ana ekranı gösteriyor daha sonra menülerin içine giriyor. sırasıyla geçiş işlemi resimde gösterdiğim gibidir. ana menüyü(2.görüntü) göstermeden direk geçiş yapmasını istiyorum onu nasıl yapabilirim.



apsis

Döngüden çıkmak istediğiniz yerde "break" ile döngüyü kırabilirsiniz.
"Makineye Beyin" MEKATRONİK

necati

int8 k=0;

k=1;//girmek icin

while(k==1){                       
//saatmenu

k=0;//cikmak icin veya k=2;

}                   
       
[email]entegreterbiyecisi@yahoo.com[/email]

Sümeyra

Teşekkür ederim herkese sorunu hallettim.