3 buton ile lcd menü yapmaya çalışıyorum küçük bir sorunum var (Çözüldü)

Başlatan qnur07, 05 Nisan 2016, 22:12:48

qnur07

Merhaba arkadaşlar, CCS C dilinde biraz acemiyim 4x20 lcd ekranda 3 buton ile menü yapmaya çalışıyorum. Sitede biraz araştırdım yapan arkadaşlardan fikir alarak biraz yol kat ettim fakat hepsi 4 buton ile yapılmış ben 3 buton ile yapmaya çalışıyorum. Sorunum ise şöyle ENTER, YUKARI, AŞAĞI adında 3 ayrı butonum var, ana ekranda ENTER tuşuna basınca menüler geliyor YUKARI AŞAĞI ile menüler arasında gezinebiliyor hatta menüden çıkış sekmesinde tekrar ENTER tuşuna basarak menüden çıkıp ana ekrana dönebiliyorum. Fakat menü1 de iken tekrar ENTER tuşuna basıp alt menüye geçicem ayarlama yaparak tekrar ENTER tuşuna basarak menüye geri döneceğim fakat bir türlü yapamadım :( 2 3 gündür araştırıyorum kayda değer birşey yapamadım belki çok küçük bir ayrıntı ile kaçırıyorum ama 3 gündür kafam sersemledi uğraşmaktan. Yardımcı olabilecek veya bir fikir yardımında bulunan herkese dualarımı iletirim :) Kodlarımı aşağıya yazıyorum.
/* TUŞ TANIMLAMALARI */
#define ENTER PIN_E0
#define YUKARI PIN_E1
#define ASAGI PIN_E2

/* DEĞİŞKENLER */
int menu_durum=0, menu_konum=0, menu_alt=0, menu=0;

/* ANA EKRAN */
void ana_ekran()
{
   lcd_gotoxy(1,2);
   lcd_putc("LCD MENU UYGULAMASI");
   lcd_gotoxy(6,3);
   lcd_putc("ANA EKRAN");
}

//ANA MENÜYE GİRİŞ 
void ana_menu()
{
    if(input(ENTER) && menu_durum==0 && menu_alt==0) // eğer menu durumu 0 ise ve menu tuşuna basılmış ise menüye gir
    {   
     printf(lcd_putc,"\f");
     menu_durum=1;
     menu_konum=1;
    }      
     if(menu_durum==1 && menu_alt==0)
     {
      switch(menu_konum)
      {            
            case 1:
            lcd_putc("\f");
            lcd_gotoxy(7,2);
            lcd_putc("MENU 1");
            delay_ms(50);
            if(input(ENTER)&& menu_durum==1 && menu==1){menu=1; menu_alt=1; break;}
            break;
                     
            case 2:
            lcd_putc("\f");
            lcd_gotoxy(7,2);
            lcd_putc("MENU 2");
          //if(input(ENTER)){menu_alt++; lcd_putc("\f"); break;}
            delay_ms(50);
            break;
            
            case 3:
            lcd_putc("\f");
            lcd_gotoxy(7,2);
            lcd_putc("MENU 3");
          //if(input(ENTER)){menu_alt++; lcd_putc("\f"); break;}
            delay_ms(50);
            break;
            
            case 4:
            lcd_putc("\f");
            lcd_gotoxy(3,2);
            lcd_putc("MENUDEN CIKIS..");
          //if(input(ENTER)){menu_alt++; lcd_putc("\f"); break;}
            delay_ms(50);
            break;
        }            
     }     
}


void main()
{   
   set_tris_e(0xFF);
   output_e(0x00); 
   lcd_init();
   
while(1)
   { 
      if(menu_durum==0){ana_ekran();} // eğer menu_durum 0 a eşitse ana ekranı göster
      ana_menu();
     
      if(input(ENTER) && menu_durum==1 && menu==1)
      {
         menu=0;
         menu_alt=1;
         lcd_putc("\f");
      }
      
      if(menu_durum==1 && menu_alt==1)
      {
         switch(menu_konum)
         {
            case 1:
            lcd_gotoxy(2,2);
            lcd_putc("MENU 1 AYARLAR");
            break;

            case 2:
            lcd_gotoxy(2,2);
            lcd_putc("MENU 2 AYARLAR");
            break;
      
            case 3:
            lcd_gotoxy(2,2);
            lcd_putc("MENU 3 AYARLAR");
            break;
         }
      }
       
         // BUTON ASAGI
       if(input(ASAGI) && menu_durum==1)
       {
         while(input(ASAGI));// asagı butondan el çekilinceye kadar bekle
         menu_konum--;
         if(menu_konum<1){menu_konum=4;}
       }
         // BUTON YUKARI
       if(input(YUKARI) && menu_durum==1)
       {
         while(input(YUKARI));
         menu_konum++;
         if(menu_konum>4){menu_konum=1;}
       }     
         //MENÜDEN ÇIKIŞ         
       if(input(ENTER) && menu_konum==4)
       {       
         while(input(ENTER));
         lcd_putc("\f");
         lcd_gotoxy(1,2);
         lcd_putc("AYARLAR KAYDEDILDI..");
         delay_ms(700);
         menu_durum=0;
         lcd_putc("\f");
       }
   
    /* MENU SAYAÇ
       if(input(ENTER)&&menu_durum==1)
       {
         while(input(ENTER));
         menu++;
      }
    */
   }
}

qnur07


dursuncemal

herhangi bir durum icin  2 tusa ayni anda basabilirsin. her menude kac adet degiskenin var?gordugum kadari ile herbir menunun tane ayari var yanlismi anliyorum.
birde bu denemeleri nerde yapiyorsunuz.
:=

ankyra

birkaç gün önce başka bir soruya bu kodları yollamıştım sana da yolluyorum...
b1 butonunun yanına senin için enter açıklaması ekledim. çok fazla alt menün var ise sana uygun olmayabilir...
ccs c de giriş aşamasındayım. alttaki program çalışıyor. bu kodlar programın ilgili bölümü.

void menu()
{
  while(input(B1)==1); //B1(ENTER) butonuna ilk kez basıldığında bu döngüye girer basıldığı sürece döngüde kalır
while (input(B1)==0)  //B1 (ENTER) bırakıldığında bu döngüdeki işlemleri yapar. tekrar b1 e basılana kadar
{

  lcd_putc("\f     cevre?\n");
  printf(lcd_putc,"%f",cx);
//!
if (input(B2)==1)   //SENSÖR KONTROL
    {
    while(input(B2)==1);

    cx=cx-1;
    }
    if (input(B3)==1)   //SENSÖR KONTROL
    {
    while(input(B3)==1);

    cx=cx+1;
    }
delay_ms(10);
}
                  if (input(B1)==1)   
                      {
                      while(input(B1)==1); //B1 (ENTER) butonuna ikinci kez basıldığında bu döngüye girer basıldığı sürece döngüde kalır
                      }
                     while (input(B1)==0) //B1 (ENTER) bırakıldığında bu döngüdeki işlemleri yapar. tekrar b1 e basılana kadar
                     {
                     
                       lcd_putc("\fKac Sensor Var??\n");
                       printf(lcd_putc,"%d",sensor);
                     //!
                     if (input(B2)==1)   //SENSÖR KONTROL
                         {
                         while(input(B2)==1);
                     
                         sensor=sensor-1;
                         }
                         if (input(B3)==1)   //SENSÖR KONTROL
                         {
                         while(input(B3)==1);
                     
                         sensor=sensor+1;
                         }
                     delay_ms(10);
                     
}
return;
}

ahmet_zxc


qnur07

Alıntı yapılan: dursuncemal - 09 Nisan 2016, 19:27:36
herhangi bir durum icin  2 tusa ayni anda basabilirsin. her menude kac adet degiskenin var?gordugum kadari ile herbir menunun tane ayari var yanlismi anliyorum.
birde bu denemeleri nerde yapiyorsunuz.

Her menüde genel olarak bir adet değişken var yalnız rtc koyup saat tarih ayarı yapacağım zaman haliyle birden fazla değişkenim olacak .s hem proteusta deniyorum hemde board üzerinde deniyorum

dursuncemal

cogunluk olarak tek degisken var ise rtc ninkilerini de tek tek gostererek ayarlarsin.en azindan ilk baslangic icin
eger c bilgin iyi ise menu yazilimi icin  2 boyutlu dizi kullanmani oneririrm.iyi değilse birazcik dizilere calis en kolayi dizi kullanmak. sikinti olursa yardim etmeye calisirim
genel mantik olsun diye zamaninda bir paylasimim olmustu bir incelersen menu konusuna farkli bir yaklasimin olabilir.
https://www.picproje.org/index.php/topic,61979.0.html
burdaki tabloda 18 ayri menu var  herbirinin max 3 degiskeni var tabi bunun siniri yok istersen 10 olsun butun degiskenlerin ayalari ve lcdye yazdirilmalari toplam 5 satir gibi birsey tutuyor.

:=

qnur07

Alıntı yapılan: ankyra - 10 Nisan 2016, 08:03:35
birkaç gün önce başka bir soruya bu kodları yollamıştım sana da yolluyorum...
b1 butonunun yanına senin için enter açıklaması ekledim. çok fazla alt menün var ise sana uygun olmayabilir...
ccs c de giriş aşamasındayım. alttaki program çalışıyor. bu kodlar programın ilgili bölümü.

void menu()
{
  while(input(B1)==1); //B1(ENTER) butonuna ilk kez basıldığında bu döngüye girer basıldığı sürece döngüde kalır
while (input(B1)==0)  //B1 (ENTER) bırakıldığında bu döngüdeki işlemleri yapar. tekrar b1 e basılana kadar
{

  lcd_putc("\f     cevre?\n");
  printf(lcd_putc,"%f",cx);
//!
if (input(B2)==1)   //SENSÖR KONTROL
    {
    while(input(B2)==1);

    cx=cx-1;
    }
    if (input(B3)==1)   //SENSÖR KONTROL
    {
    while(input(B3)==1);

    cx=cx+1;
    }
delay_ms(10);
}
                  if (input(B1)==1)   
                      {
                      while(input(B1)==1); //B1 (ENTER) butonuna ikinci kez basıldığında bu döngüye girer basıldığı sürece döngüde kalır
                      }
                     while (input(B1)==0) //B1 (ENTER) bırakıldığında bu döngüdeki işlemleri yapar. tekrar b1 e basılana kadar
                     {
                     
                       lcd_putc("\fKac Sensor Var??\n");
                       printf(lcd_putc,"%d",sensor);
                     //!
                     if (input(B2)==1)   //SENSÖR KONTROL
                         {
                         while(input(B2)==1);
                     
                         sensor=sensor-1;
                         }
                         if (input(B3)==1)   //SENSÖR KONTROL
                         {
                         while(input(B3)==1);
                     
                         sensor=sensor+1;
                         }
                     delay_ms(10);
                     
}
return;
}


Şimdilik 3 adet menü 3 adette alt menüm var ama tabi 5 - 6 tanede olabilir. O zaman işler değişecek işte.s aslında mucit23 kardeşimizin yaptığı uygulamalarda sıkça görüyorum bu menü örneğini 3 tuş ile hatta otomatik kuluçka makinasında falan var kodlarınıda vermiş ama PicBasic bilmediğim için yapıyı çözemedim.

http://arectron.com/microchip/16f877-kontrollu-kulucka-makinesi.html

qnur07

Alıntı yapılan: dursuncemal - 11 Nisan 2016, 00:15:25
cogunluk olarak tek degisken var ise rtc ninkilerini de tek tek gostererek ayarlarsin.en azindan ilk baslangic icin
eger c bilgin iyi ise menu yazilimi icin  2 boyutlu dizi kullanmani oneririrm.iyi değilse birazcik dizilere calis en kolayi dizi kullanmak. sikinti olursa yardim etmeye calisirim
genel mantik olsun diye zamaninda bir paylasimim olmustu bir incelersen menu konusuna farkli bir yaklasimin olabilir.
https://www.picproje.org/index.php/topic,61979.0.html
burdaki tabloda 18 ayri menu var  herbirinin max 3 degiskeni var tabi bunun siniri yok istersen 10 olsun butun degiskenlerin ayalari ve lcdye yazdirilmalari toplam 5 satir gibi birsey tutuyor.
Eyvallah kardeşim önerin için vermiş olduğun örneği bir inceliyim. Diğer programlama dillerinden diziler ve 2 boyutlu dizilere az çok hakimim yalnız menüdeki kullanım şeklini bir incelemem lazım :)

qnur07

Merhaba arkadaşlar sonunda istediğim menüyü yaptım :) Üç tuş ile menü ve alt menülere girip çıkabiliyorum. Yalnız birkaç sorum var sizce bu şekliyle uygun mudur yani sorun olur mu switch case icerisinde while ve if kullanmak. Birde sadece menü için biraz ağır gibi geldi kodlar programı yoruyor çünkü daha ekleyeceğim donanımlar var bu hali ile %21 ROM gitti sizce biraz daha sadeleştirip hafifletebilir miyiz acaba ?
Kodları aşağıya koyuyorum hatta dosyaları da koyayım belki benim gibi acemi olup ta yapmak isteyen arkadaşlar faydalanabilir:)

http://s8.dosya.tc/server2/0619g5/4x20_menu.rar.html

/* TUŞ TANIMLAMALARI */
#define ENTER PIN_E0
#define YUKARI PIN_E1
#define ASAGI PIN_E2

#define LED1 PIN_A0
#define LED2 PIN_A1
#define LED3 PIN_A2

/* DEĞİŞKENLER */
int menu_durum=0, menu_konum=0, menu_alt=0, menu=0;
byte saniye,dakika,saat,gun,ay,yil,haftanin_gunu; // byte cinsinden değişken atanıyor

/* ANA EKRAN */
void ana_ekran()
{
   lcd_gotoxy(1,1);
   lcd_putc("LCD MENU UYGULAMASI");
   lcd_gotoxy(1,3);
   printf(lcd_putc,"Trh: %02d/%02d/20%02d ",gun,ay,yil); // LCD ye gün ay yıl bilgileri yazdırılıyor
   lcd_gotoxy(1,4);
   printf(lcd_putc,"Saat: %02d:%02d:%02d ",saat,dakika,saniye); // LCD ye saat dakika saniye bilgileri yazdırılıyor
}

//ANA MENÜYE GİRİŞ 
void ana_menu()
{     
     if(menu_durum==1 && menu_alt==0)
     {
    // if(input(ENTER) && menu_konum==1){while(input(ENTER));menu+=1; if(menu==3){menu=0;} delay_ms(50);}
     if(input(ENTER)){while(input(ENTER));menu++;}
     
      switch(menu_konum)
      {            
            case 1:
            while(menu_konum==1 && menu==2){
            lcd_putc("\f");
            lcd_gotoxy(8,1); lcd_putc("Led");
            lcd_gotoxy(3,2); lcd_putc("Ayarlarındasınız");
            if(input(YUKARI)){output_high(LED1);}else{output_low(LED1);}
            delay_ms(50);
            if(input(ENTER)&&menu_konum==1){while(input(ENTER));menu++;if(menu==3)menu=1;break;}}                       
            lcd_putc("\f");
            lcd_gotoxy(4,2);
            lcd_putc("LED AYARLARI");
            delay_ms(50);           
            break;
                     
            case 2:
            while(menu_konum==2 && menu==2){
            lcd_putc("\f");
            lcd_gotoxy(8,1); lcd_putc("SAAT");
            lcd_gotoxy(3,2); lcd_putc("Ayarlarındasınız");
            if(input(YUKARI)){output_high(LED2);}else{output_low(LED2);}
            delay_ms(50);
            if(input(ENTER)&&menu_konum==2){while(input(ENTER));menu++;if(menu==3)menu=1;break;}}            
            lcd_putc("\f");
            lcd_gotoxy(2,2);
            lcd_putc("SAAT - TARIH AYARI");
            delay_ms(50);
            break;
            
            case 3:
            while(menu_konum==3 && menu==2){
            lcd_putc("\f");
            lcd_gotoxy(5,1); lcd_putc("ISITICI");
            lcd_gotoxy(3,2); lcd_putc("Ayarlarındasınız");
            if(input(YUKARI)){output_high(LED3);}else{output_low(LED3);}
            delay_ms(50);
            if(input(ENTER)&&menu_konum==3){while(input(ENTER));menu++;if(menu==3)menu=1;break;}}            
            lcd_putc("\f");
            lcd_gotoxy(3,2);
            lcd_putc("ISITICI AYARLARI");
            delay_ms(50);
            break;
            
            case 4:
            lcd_putc("\f");
            lcd_gotoxy(3,2);
            lcd_putc("MENUDEN CIKIS..");
            delay_ms(50);
            break;
        }            
     }     
}


void main()
{   
   set_tris_a(0x00);
   output_a(0x00);
   set_tris_e(0xFF);
   output_e(0x00); 
   lcd_init();
   
   rtc_init();
   
while(1)
   { 
   
   rtc_get_time(saat,dakika,saniye); // DS1302 den saat dakika ve saniye bilgileri alınıyor
   rtc_get_date(gun,ay,yil,haftanin_gunu); // DS1302 den gün ay yıl ve haftanın günü bilgileri alınıyor
   
      if(menu_durum==0){ana_ekran();menu=0;} // eğer menu_durum 0 a eşitse ana ekranı göster
      ana_menu();
     
    if(input(ENTER) && menu_durum==0 && menu_alt==0) // eğer menu durumu 0 ise ve menu tuşuna basılmış ise menüye gir
    {   
     printf(lcd_putc,"\f");
     menu_durum=1;
     menu_konum=1;
    } 
    
         // BUTON ASAGI
       if(input(ASAGI) && menu_durum==1)
       {
         while(input(ASAGI));// asagı butondan el çekilinceye kadar bekle
         menu_konum--;
         if(menu_konum<1){menu_konum=4;}
       }
         // BUTON YUKARI
       if(input(YUKARI) && menu_durum==1)
       {
         while(input(YUKARI));
         menu_konum++;
         if(menu_konum>4){menu_konum=1;}
       }     
         //MENÜDEN ÇIKIŞ         
       if(input(ENTER) && menu_konum==4)
       {       
         while(input(ENTER));
         lcd_putc("\f");
         lcd_gotoxy(1,2);
         lcd_putc("AYARLAR KAYDEDILDI..");
         delay_ms(700);
         menu_durum=0;
         lcd_putc("\f");
       }
   }
}