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ı.
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.
Kaç buton kullanıyorsunuz?
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.
(https://s28.postimg.cc/3ulr11hpl/ge_i_ler.png) (https://postimg.cc/image/3ulr11hpl/)
Döngüden çıkmak istediğiniz yerde "break" ile döngüyü kırabilirsiniz.
int8 k=0;
k=1;//girmek icin
while(k==1){
//saatmenu
k=0;//cikmak icin veya k=2;
}
Teşekkür ederim herkese sorunu hallettim.