2x16 lcd de menu hazirlama algoritmalari

Başlatan Karamel, 21 Ağustos 2014, 17:04:23

Karamel

merhaba. suan 2x16 lcd li kartima program yaziyorum. 2x16 lcd ye menu yapiyorum. bu konu uzerine biraz dusununce onumde birkac yol olacegini kesfettim.

unsigned char MenuID;

main icersinde,

while(1)
{
      if(MenuID == 0) Ana_Menu();
      if(MenuID == 1) Ayarlar_Menu();
      if(MenuID == 2) Cart_Menu();
      if(MenuID == 3) Curt_Menu();
       .
       .
       .

}


seklinde yapabilirim. eger boyle yaparsam her menu yu farkli fonksiyonlar icersinde yazarim. birde soyle bir yontem geldi aklima.

yine main icersinde,


while(1)
{
      while(MenuID == 0)
       {
            // ana menu kismi


       }
      while(MenuID == 1) 
      {
           //ayarlar menusu kismi

          while(MenuID == 2)
          {
               cart menu kismi
           }

      }

}




ikinci ornegim biraz karisik gibi oluyor ve alt menuler ana menulerin icersine geciyor. digerinde hepsini tek listede gorebiliyoruz. siz menu yapmak icin nasil algoritmalar kullaniyorsunuz? yukaridaki mantigim cok mu kotu? yoksa mantiklimi?

Kabil ATICI

Burada alt menüler için farklı bir menü tanımı kullanılabilir. Böylece çok fazla dallanma olan menü ve alt menülerde birbirine karışmayı engeller.
örneğin
menu_id
ve
alt_menu_id
gibi...
ambar7

musti463

Menu için switch komutunun kullanıldığını duymuştum
Mustafa Emir SADE

muuzoo

Siz yazınca şimdi aklıma geldi, yıllar  önce 16F877 için böyle dallanıp budaklanan bir menü yapmıştım. Ama tek bir sorun vardı, belli bir seviyeden sonra menü geri dönmüyordu. Acemilik işte stack limitini dikkate almamıştım (16F877 için stack boyutu 8 ) fazla derinlere gidince stack overflow oluyor ve geri dönmeye kalkınca saçmalıyordu. Hangi mcu için yazacaksınız bilmiyorum ama kullandığınız denetleyicinin limitlerine dikkat edin.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

KONYALI

@Karamel

Her iki yöntemde de onlarca if-else, while yada switch kullanman gerekecek. Ayrıca her ekran için printf kullanacağın için çok az menü seçeneği için çok fazla bellek tüketeceksin. Bende uzun süre projelerim de bu yapıyı kullandım. Ama menü seçeneği arttıkça içinden çıkılmaz bir hal aldığını gördüm. Şimdi farklı bir yöntem kullanıyorum. Menü metinlerini tek bir dizide tanımlıyorum örneğin;

const char MenuBasliklar[20][16]={"Menu Secenek1   ",
                                  "Menu Secenek2   ",
                                  .............................   }


Burada tanımlanan metinler LCD ekranın üst satırında yazıyor. Menü fonksiyonu içinde şu şekilde kullanıyorum;

lcd_gotoxy(1,1);
printf(lcd_putc,"%s",MenuBasliklar[MenuID]);


İki satır kodla tablo içinde ki tüm menüleri sırayla gösterebilir, aralarında gezebiliriz.

LCD ikinci satırı içinde sayısal değerler ayarlanıyorsa MenuID değeri ile ilişkili bir değer tablosu tanımlıyorum;

int8 Degerler[20]={0,6,77,84,121.........}



lcd_gotoxy(1,2);
printf(lcd_putc,"%d",Degerler[MenuID]);


Bu şekilde yapınca kodun hem okunabilirliği artıyor hem de bellekte kapladığı alan çok çok azalıyor. Ayrıca sayısal parametreler için alt limit, üst limit tanımlaması tablolar kullanılarak yapılırsa ilerde yapılacak değişiklikler daha kolay oluyor.

baran123

Bir ara saat,tarih,alarm lı bir devre yapmıstım ayar menulerı falan vardı omrumu yemıstı cok fazla ıf else ve goto kullanarak yapmıstım boyle ugrasma fonksiyonel bir şeyler yazmaya çalış hem daha çok geliştirirsin kendini.

Karamel

Alıntı yapılan: KONYALI - 21 Ağustos 2014, 17:40:41
@Karamel

Her iki yöntemde de onlarca if-else, while yada switch kullanman gerekecek. Ayrıca her ekran için printf kullanacağın için çok az menü seçeneği için çok fazla bellek tüketeceksin. Bende uzun süre projelerim de bu yapıyı kullandım. Ama menü seçeneği arttıkça içinden çıkılmaz bir hal aldığını gördüm. Şimdi farklı bir yöntem kullanıyorum. Menü metinlerini tek bir dizide tanımlıyorum örneğin;

const char MenuBasliklar[20][16]={"Menu Secenek1   ",
                                  "Menu Secenek2   ",
                                  .............................   }


Burada tanımlanan metinler LCD ekranın üst satırında yazıyor. Menü fonksiyonu içinde şu şekilde kullanıyorum;

lcd_gotoxy(1,1);
printf(lcd_putc,"%s",MenuBasliklar[MenuID]);


İki satır kodla tablo içinde ki tüm menüleri sırayla gösterebilir, aralarında gezebiliriz.

LCD ikinci satırı içinde sayısal değerler ayarlanıyorsa MenuID değeri ile ilişkili bir değer tablosu tanımlıyorum;

int8 Degerler[20]={0,6,77,84,121.........}



lcd_gotoxy(1,2);
printf(lcd_putc,"%d",Degerler[MenuID]);


Bu şekilde yapınca kodun hem okunabilirliği artıyor hem de bellekte kapladığı alan çok çok azalıyor. Ayrıca sayısal parametreler için alt limit, üst limit tanımlaması tablolar kullanılarak yapılırsa ilerde yapılacak değişiklikler daha kolay oluyor.

hocam simdiye kadar karsilastigim en mantikli algoritma sizinki imis. sizin algoritmanizi kullandim. tesekkur ederim.