2x16 lcd de menu hazirlama algoritmalari

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

Karamel

21 Ağustos 2014, 20:04:23 Son düzenlenme: 21 Ağustos 2014, 20:11:32 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 == 0Ana_Menu();
      if(
MenuID == 1Ayarlar_Menu();
      if(
MenuID == 2Cart_Menu();
      if(
MenuID == 3Curt_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, 20: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.

Yasal Uyarı: Picproje.org sitemizde 5651 sayılı kanunun 8. maddesine ve T.C.Knın 125. maddesine göre tüm üyelerimiz yaptıkları paylaşımlardan kendileri sorumludur. Picproje.org hakkında yapılacak tüm hukuksal şikayetleri İletişim sayfamızdan bize bildirdikten en geç 3 (üç) iş günü içerisinde ilgili kanunlar ve yönetmelikler çerçevesinde tarafımızca incelenerek gereken işlemler yapılacak ve site yöneticilerimiz tarafından bilgi verilecektir.