Lcd ekran için menu algoritması?

Endorfin35+

Kayıtsız Üye
Katılım
1 Mayıs 2020
Mesajlar
4,409
Daha önce birkaç defa menu kodu yazmıştım ama nispeten basit işlerdi. Şu an çok detaylı bir menu ile uğraşıyorum ve baya koda gömüldüm...

Ana menu de şu an 4 seçenek var. Her seçeneğin altında değişik sayılarda alt menuler var. Heralt menunun set değerleri yeni bir ekranda set ediliyor.

Örneğin,
Bağlantı ayarları (anamenu)
Rs232 hızı (altmenu)
9600 ( ayar ekranı)

Gibi bir yapım var. Ayar ekranında set ettirdiğim değerler çok değişken ondalıklı değerde var. Boolean değerlerde var.

Kontrol için 4 adet buton kullanıyorum. Aşağı,yukarı, ok ve iptal şeklinde...

Anamenude hangi seçenek seçildi bir değişkende saklıyorum. Alt menude hangi seçenek. En alt menude biraz daha kendine has şekilde. Velhasıl kodlama ile ilgili bir sıkıntı yok ama bir sürü if kodu yazdım.

Kodlamayı biraz daha düzgün hale getirebilmek için struck kullanmayı, gezinti için döngü kullanmayı düşündüm ama işin içinden çıkamadım. Bu konuda örnek veya fikir paylaşabilirmisiniz.
 
Nesneye yönelik programlamanın en bereketli olduğu konudur kullanıcı arayüzü yazılımları. Tabi bu mutlaka C++ kullanacaksın anlamına gelmiyor, C dilinde de nesneye yönelik programlama yapılabiliyor. Benim şu anda çalıştığım ve C de yazılmış firmware'de şöyle bir "class" yapısı var.

Aktif menu bir struct ve bunun adresini bir global'de saklıyorum. Ana döngüde buton gelirse process_button çağrılıyor, encoder dönerse process_encoder çağrılıyor. Bunlar da artık ilgili menüye göre doğru davranışı gerçekleştiriyor.

Bu yapı ile istediğin derinlikte, istediğin sayıda menu eklenebilir ve gelen buton ve enkoder olaylarına göre de menüler arasında geçiş yapılabilir.

C:
/**********************************************************************
 **********************************************************************/
static void menu_none_init(void)
{
    GUI_Clear();
}

/**********************************************************************
 **********************************************************************/
static void menu_none_cleanup(void)
{
}

/**********************************************************************
 **********************************************************************/
static void menu_none_redraw(void)
{
}

/**********************************************************************
 **********************************************************************/
static void menu_none_update(void)
{
}

/**********************************************************************
 **********************************************************************/
static void menu_none_process_button(unsigned char id, enum BUTTON_ACTIONS action)
{
    FSP_PARAMETER_NOT_USED (id);
    FSP_PARAMETER_NOT_USED (action);
}

/**********************************************************************
 **********************************************************************/
static void menu_none_process_encoder(unsigned char id, enum ENCODER_ACTIONS action)
{
    FSP_PARAMETER_NOT_USED (id);
    FSP_PARAMETER_NOT_USED (action);
}

/**********************************************************************
 **********************************************************************/
static void menu_none_timeslice(void)
{
}

/**********************************************************************
 **********************************************************************/
UI_MENU_INFO ui_menu_none =
{
    "none",
    menu_none_init,
    menu_none_cleanup,
    menu_none_redraw,
    menu_none_update,
    menu_none_process_button,
    menu_none_process_encoder,
    menu_none_timeslice,
};
 
Eğer C de yazıyorsanız OOP'yle başını ağrıtmanız çok gerekli değil bence çünkü 40 takla atmak gerekiyor bazı yerlerde. State machine yapısında bir kod yazarsanız hem okunurluğu hem performansı yüksek olur. İsterseniz yarın buton okumayla ilgili bir state machine yapısı paylaşırım şuanda pcnin derinliklerinde oldupundan uğraşmam lazım :D
 
python destekliyormu 3-5 satırda halledilir :popcorn1:
 
python destekliyormu 3-5 satırda halledilir :popcorn1:
burada gördüğün halkın büyük çoğunluğu "embedded c" yazıyor küçük bir azınlık uPy veya python ile sürekli çalışıyor.
Genelleme yapmak istemem ama genelde konularda geçen programlama dilinin c/c++ olduğunu otomatik olarak anlıyoruz.
 
menü için swtich case yapısının en optimal çözüm olduğuna karar verdim onu kullanırım hep
 
python destekliyormu 3-5 satırda halledilir :popcorn1:
Bence python bilgisayar tarafinda arayuz yaparken yada derleyici ile işgili otomasyonlar felan yazarken faydalı olabilir çünkü bilgisayarda kaynak bol ve bilgisayarı o işe adamıyoruz işimiz bitince kapatacağız o programı ama iş 50 centlik 1 dolarlık 2 dolarlık işlemcilere gelince donanımın suyunu sıkmak gerekiyor öyle ki hala c ile yazdıgı kodu sonra assemblyde düzenleyen veya bazı kritik fonksyonları assembly ile yazanlar var bol bol kullanırsak ne olur 1 dolar fazla verir üst işlemciye geçeriz sonra 10.000 tane sipariş gelir hem 10.000 doları çöpe atmış oluruz hem 10.000 dolar dovizi yurtdışına göndermiş oluruz hem de ihtiyacimizdan fazla elektronik atık üretmiş oluruz
 
Son düzenleme:
Bence python bilgisayar tarafinda arayuz yaparken yada derleyici ile işgili otomasyonlar felan yazarken faydalı olabilir çünkü bilgisayarda kaynak bol ve bilgisayarı o işe adamıyoruz işimiz bitince kapatacağız o programı ama iş 50 centlik 1 dolarlık 2 dolarlık işlemcilere gelince donanımın suyunu sıkmak gerekiyor öyle ki hala c ile yazdıgı kodu sonra assemblyde düzenleyen veya bazı kritik fonksyonları assembly ile yazanlar var bol bol kullanırsak ne olur 1 dolar fazla verir ıst işlemciye geçeriz sonra 10.000 tane sipariş gelir hem 10.000 doları çöpe atmış oluruz hem 10.000 dolar dovizi yurtdışına göndermiş oluruz hem de ihtiyacimizdan fazla elektronik atık üretmiş oluruz
Bu sebepten ötürü bence endüstride yerini kazanamıyor python
 
Benim gui hazırlamak için oluşturduğum bir html+css yazılımın var çok işime yarıyor karakter lcdler için isteyen olursa paylaşırım
 
Ben ilk menu uğraşımda akla zarar bir yol izlemiştim, daha kolay ve mantıklı yolları vardır ama bilmiyordum... Güzel çalışıyordu ama. Bütün menü öğelerinin özellikleri ve değerleri için tablo şeklinde arrayler kullanmıştım. Geri dönüp nasıl çalıştığını anlamak zor oldu. Koda yorum yazma alışkanlığını sonradan edindim.

menü değişkenler:
char*durum[]={"Beklemede","Mayşeleme","Kaynatma","Su Isıtma"};
    uint8_t durumbuff=0;
    //                {Öğeler,menü adı      ,     1. Öğe            ,   2. Öğe    , 3. Öğe    ,   4. Öğe            ,     5. Öğe    ,     6. Öğe  , 7. Öğe    , 8. Öğe }
char* metin_menu [][10] ={{5,"Ana Menu"     ,   "Mayşeleme"         ,"Kaynatma"   ,"Isıtma",     "Sistem"        ,    "  --"     ,     ""      ,     ""    ,  ""       },
/*Menü öğesi metin    */  {8,"Mayşeleme"    ,"Sıcaklık(""\xdf""C)"  ,"Maks Güç(%)","Süre(dk.)","Mash-Out(""\xdf""C)",   "Pompa PWM" ,   "Başlat"  , "Durdur"  ,   "  --"  },
                          {7,"Kaynatma"     ,    "Güç(%)"           ,"Maks Güç(%)","Süre(dk.)", "Alarm Listesi"     ,   "Başlat"    ,   "Durdur"  ,"  --"     ,   ""      },
                          {6,"Alarm listesi",     "1.Alarm"         ,"2.Alarm"    ,"3.Alarm"  ,    "4.Alarm"        ,   "5.Alarm"   ,   "  --"    ,     ""    ,   ""      },
                          {5,"Isıtma"       ,"Sıcaklık(""\xdf""C)"  ,   "Güç(%)"  ,   "Başlat",     "Durdur"        ,     "  --"    ,     ""      ,     ""    ,   ""      },
                          {7,"Kalibrasyon"  ,     "NTC1 < 30"       ,"NTC1 > 60"  ,"NTC2 < 30",   "NTC2 > 60"       ,   "Beta  "    ,    "  --"   ,     ""    ,   ""      }};

//   p_menu, yukarıdaki menü öğesinin türünü temsil eder,
//   parametreler 0:yeni menü adresi,  1:Değer değişkeni,  2:Menü başlığı, 3: Komut     
uint8_t p_menu  [][10]  ={{0,     0         ,       2               ,     2       ,     2     ,       2             ,       0       ,       0       ,   0     ,     0   },
/*Menü öğesi parametre*/  {0,     0         ,       1               ,     1       ,     1     ,       1             ,       1       ,       3       ,   3     ,     0   },
                          {0,     0         ,       1               ,     1       ,     1     ,       2             ,       3       ,       3       ,   0     ,     0   },
                          {0,     0         ,       1               ,     1       ,     1     ,       1             ,       1       ,       0       ,   0     ,     0   },
                          {0,     0         ,       1               ,     1       ,     3     ,       3             ,       0       ,       0       ,   0     ,     0   },
                          {0,     0         ,       3               ,     3       ,     3     ,       3             ,       3       ,       0       ,   0     ,     0   }};

// Tüm değerler 10'la çarpılmıştır. float yerine tamsayı değişken kullanarak 16 bitte 0.1 çözünürlük ve isabet sağlamak için
// Komutlar için makro
int16_t v_menu  [][10]  ={{0,     0         ,       1               ,     2       ,     4     ,       5             ,       0       ,       0      ,    0     ,     0   },
/*Menü öğesi değerleri*/  {0,     0         ,     650               ,    1000     ,   600     ,       770           ,      500       ,MAYSELEME_BASLAT ,ISITMA_DURDUR },
                          {0,     0         ,     250               ,    1000     ,   600     ,       3             ,KAYNAMA_BASLAT ,ISITMA_DURDUR},
                          {0,     0         ,     600               ,     400     ,   150     ,       50            ,       0       },
                          {0,     0         ,     720               ,    1000     , ISITMA_BASLAT , ISITMA_DURDUR   },
                          {0,     0         ,   NTC1_ALT            , NTC1_UST    ,NTC2_ALT   ,  NTC2_UST           ,       10      ,       ""   }};

// p_menu parametresi 1 olan öğeler için sırasıyla 2 adım(16bit) artarak epprom adresleri, tüm değişkenler başlangıçta eppromdan alınır.                         
uint8_t adres  [][7]    ={{0,     0         ,       1               ,     3       ,     5     ,       7             ,         9     },
/*dğerler eeprom adres*/  {0,     0         ,       11              ,     13      ,     15    ,       0             ,         0     },
                          {0,     0         ,       17              ,     19      ,     21    ,       23            ,         25    },
                          {0,     0         ,       70              ,     72      ,     0     ,       0             ,         0     }};

// değer değişkenleri için min ve maks değerler yine 10 ile çarpılmış olarak
uint16_t min_menu[][11] ={{0,     0         ,      0                ,     0       ,     0     ,       0             },
/*değerler minimum    */  {0,     0         ,     200               ,     0       ,     0     ,       0             ,       0       ,       0       ,   0   },
                          {0,     0         ,      0                ,     0       ,     0     ,       0             ,       0       ,       0       },
                          {0,     0         ,      0                ,     0       ,     0     ,       0             ,       0       },
                          {0,     0         ,      0                ,     0       ,     0     ,       0             ,       0       },
                          {0,     0         ,     200               ,    600      ,    200    ,      600            }};

uint16_t max_menu[][11] ={{0,     0         ,       0               ,     0       ,     0     ,       0             },
/*değerler maksimum   */  {0,     0         ,     1000              ,     1000    ,   1200    ,     1000            ,       0       ,       0        ,  0    },
                          {0,     0         ,     1000              ,     1000    ,   1200    ,       0             ,       0       ,       0        },
                          {0,     0         ,     1200              ,     1200    ,   1200    ,     1200            ,      1200    },
                          {0,     0         ,     1100              ,     1000    ,     0     ,       0             },
                          {0,     0         ,     300               ,     1000    ,   300     ,     1000            }};

// değer değişkenleri ayarlarken varsayılan birim artış/azalış miktarları, yani ayar çözünürlüğü (10'la çarpılmış olarak)
byte  artis_menu[][11]  ={{0,     0         ,     0                 ,     0       ,     0     ,       0             },
/*değerler artış/adım*/   {0,     0         ,     1                 ,     10      ,     10    ,       10            ,      10       ,       0         ,   0   },
                          {0,     0         ,     10                ,     10      ,     10    ,       0             ,       0       ,       0         },
                          {0,     0         ,     10                ,     10      ,     10    ,       10            ,      10       },
                          {0,     0         ,     10                ,     10      ,     0     ,       0             },
                          {0,     0         ,     1                 ,     1       ,     1     ,       1             }};

Döngüde de şöyleydi, sadece array indisleri üzerinden ekrana metin yazdırıp, değişkenleri de yine ilgili menü öğesi indisiyle aynı indisteki bir array de saklıyor. Menüye eklemeleri veya metin değişiklikleri için yukarıdaki array değişkenlerle oynuyordum sadece. Bunlar parametreleri ayarlamak içindi. bunun dışında if- else ile de bir state-machine olarak çalışıyordu.

döngü ve tuş kontrolü:
if(ekran==MENU)
  {
         m_l=metin_menu[m_i][0];
        if(DispOk)
        {
          //lcd.clear();
          lcd.setCursor(0,0);
              tire(2);lcd.print(metin_menu[m_i][1]);tire(2);bosluk(3);
              lcd.setCursor(18,0);lcd.print(((m_buff-2)%m_l)+1);
          //lcd.sil(2);
          lcd.setCursor(1,2);
              indis=((m_buff-1)%m_l)+2;
              lcd.print(metin_menu[m_i][indis]);bosluk(3);
              lcd.setCursor(15,2);
              if(p_menu[m_i][indis]==1)
              {
                if(v_menu[m_i][indis]<1000)bosluk(1);
                buff_f=v_menu[m_i][indis];
                if(artis_menu[m_i][indis]==1)lcd.print(buff_f/10,1);
                else lcd.print(buff_f/10,0);
              }
          //lcd.sil(3);
          lcd.setCursor(1,3);
              indis=((m_buff)%m_l)+2;
              lcd.print(metin_menu[m_i][indis]);bosluk(3);
              lcd.setCursor(15,3);
              if(p_menu[m_i][indis]==1)
              {
                if(v_menu[m_i][indis]<1000)bosluk(1);buff_f=v_menu[m_i][indis];
                if(artis_menu[m_i][indis]==1)lcd.print(buff_f/10,1);//0.1 artış
                else lcd.print(buff_f/10,0);//1.0 artış
              }
          //lcd.sil(1);
          lcd.setCursor(0,1);ok();
              indis=((m_buff-2)%m_l)+2;
              lcd.print(metin_menu[m_i][indis]);bosluk(3);
              if((p_menu[m_i][indis]==1)&&(buff_up==0))//değer görüntüleme
              {
                lcd.setCursor(15,1);
                if(v_menu[m_i][indis]<1000)bosluk(1);
                buff_f=v_menu[m_i][indis];
                if(artis_menu[m_i][indis]==1)lcd.print(buff_f/10,1);
                else lcd.print(buff_f/10,0);
              }
              else if(p_menu[m_i][indis]==1)  //değer değiştirme (buff_up=1) iken
              {
                lcd.setCursor(15,1);
                if(v_menu[m_i][indis]<100)bosluk(1);
                buff_f=intbuff;
                if(artis_menu[m_i][indis]==1)lcd.print(buff_f/10,1);
                else lcd.print(buff_f/10,0);
              }
          lcd.setCursor(19,1);
          DispDone;
        }
        if(b_up>0)    // p_menu[m_i][indis] v_menu[m_i][indis] min_menu[m_i][indis] max_menu[m_i][indis] artis_menu[m_i][indis]
        {
          switch(button)
          {
            case B_R      : if(buff_up==0){m_buff++;lcd.clear();}
                            else if(intbuff<=(max_menu[m_i][indis]-artis_menu[m_i][indis]))intbuff+=artis_menu[m_i][indis];
                            break;
            case B_R_sal  : break;
            case B_L      : if(buff_up==0){if(m_buff>2)m_buff--;lcd.clear();}
                            else if(intbuff>=artis_menu[m_i][indis])intbuff-=artis_menu[m_i][indis];
                            break;
            case B_L_sal  : break;
            case B_E_sal  : lcd.clear();
                            switch(p_menu[m_i][indis])
                            {
                              case 0  : break;
                              case 1  : if(buff_up==0)
                                        {
                                          buff_up=1;
                                          intbuff=v_menu[m_i][indis];
                                          lcd.blink();
                                        }
                                        else if(buff_up>0)
                                        {
                                          v_menu[m_i][indis]=intbuff;
                                          EEPROM.put(adres[m_i-1][indis],intbuff);
                                          buff_up=0;
                                          lcd.noBlink();
                                        }
                                        break;
                              case 2  : m_onceki=m_i;
                                        buff_onceki=indis;
                                        m_i=v_menu[m_i][indis];
                                        m_buff=2;
                                        break;
                              case 3  : ekran=KOMUT;
                                        m_onceki=m_i;
                                        buff_onceki=indis;
                                        komut=v_menu[m_i][indis];
                                        break;
                              default : break;
                            }
                            b_up=0;DispUp;break;
            
            case B_G:     if(buff_up>0){buff_up=0;lcd.noBlink();}
                          else
                          {
                            m_buff=2;
                            if(m_i==m_onceki)
                            {
                              ekran=ANA;
                              m_i=0;
                            }
                            else m_i=m_onceki;
                          }
                          lcd.clear();break;
            default: break;
          }
          b_up=0;DispUp;
      }
 
  }
 
Grafik lcd kullandım.
Ben ilk menu uğraşımda akla zarar bir yol izlemiştim, daha kolay ve mantıklı yolları vardır ama bilmiyordum... Güzel çalışıyordu ama. Bütün menü öğelerinin özellikleri ve değerleri için tablo şeklinde arrayler kullanmıştım. Geri dönüp nasıl çalıştığını anlamak zor oldu. Koda yorum yazma alışkanlığını sonradan edindim.

menü değişkenler:
char*durum[]={"Beklemede","Mayşeleme","Kaynatma","Su Isıtma"};
    uint8_t durumbuff=0;
    //                {Öğeler,menü adı      ,     1. Öğe            ,   2. Öğe    , 3. Öğe    ,   4. Öğe            ,     5. Öğe    ,     6. Öğe  , 7. Öğe    , 8. Öğe }
char* metin_menu [][10] ={{5,"Ana Menu"     ,   "Mayşeleme"         ,"Kaynatma"   ,"Isıtma",     "Sistem"        ,    "  --"     ,     ""      ,     ""    ,  ""       },
/*Menü öğesi metin    */  {8,"Mayşeleme"    ,"Sıcaklık(""\xdf""C)"  ,"Maks Güç(%)","Süre(dk.)","Mash-Out(""\xdf""C)",   "Pompa PWM" ,   "Başlat"  , "Durdur"  ,   "  --"  },
                          {7,"Kaynatma"     ,    "Güç(%)"           ,"Maks Güç(%)","Süre(dk.)", "Alarm Listesi"     ,   "Başlat"    ,   "Durdur"  ,"  --"     ,   ""      },
                          {6,"Alarm listesi",     "1.Alarm"         ,"2.Alarm"    ,"3.Alarm"  ,    "4.Alarm"        ,   "5.Alarm"   ,   "  --"    ,     ""    ,   ""      },
                          {5,"Isıtma"       ,"Sıcaklık(""\xdf""C)"  ,   "Güç(%)"  ,   "Başlat",     "Durdur"        ,     "  --"    ,     ""      ,     ""    ,   ""      },
                          {7,"Kalibrasyon"  ,     "NTC1 < 30"       ,"NTC1 > 60"  ,"NTC2 < 30",   "NTC2 > 60"       ,   "Beta  "    ,    "  --"   ,     ""    ,   ""      }};

//   p_menu, yukarıdaki menü öğesinin türünü temsil eder,
//   parametreler 0:yeni menü adresi,  1:Değer değişkeni,  2:Menü başlığı, 3: Komut    
uint8_t p_menu  [][10]  ={{0,     0         ,       2               ,     2       ,     2     ,       2             ,       0       ,       0       ,   0     ,     0   },
/*Menü öğesi parametre*/  {0,     0         ,       1               ,     1       ,     1     ,       1             ,       1       ,       3       ,   3     ,     0   },
                          {0,     0         ,       1               ,     1       ,     1     ,       2             ,       3       ,       3       ,   0     ,     0   },
                          {0,     0         ,       1               ,     1       ,     1     ,       1             ,       1       ,       0       ,   0     ,     0   },
                          {0,     0         ,       1               ,     1       ,     3     ,       3             ,       0       ,       0       ,   0     ,     0   },
                          {0,     0         ,       3               ,     3       ,     3     ,       3             ,       3       ,       0       ,   0     ,     0   }};

// Tüm değerler 10'la çarpılmıştır. float yerine tamsayı değişken kullanarak 16 bitte 0.1 çözünürlük ve isabet sağlamak için
// Komutlar için makro
int16_t v_menu  [][10]  ={{0,     0         ,       1               ,     2       ,     4     ,       5             ,       0       ,       0      ,    0     ,     0   },
/*Menü öğesi değerleri*/  {0,     0         ,     650               ,    1000     ,   600     ,       770           ,      500       ,MAYSELEME_BASLAT ,ISITMA_DURDUR },
                          {0,     0         ,     250               ,    1000     ,   600     ,       3             ,KAYNAMA_BASLAT ,ISITMA_DURDUR},
                          {0,     0         ,     600               ,     400     ,   150     ,       50            ,       0       },
                          {0,     0         ,     720               ,    1000     , ISITMA_BASLAT , ISITMA_DURDUR   },
                          {0,     0         ,   NTC1_ALT            , NTC1_UST    ,NTC2_ALT   ,  NTC2_UST           ,       10      ,       ""   }};

// p_menu parametresi 1 olan öğeler için sırasıyla 2 adım(16bit) artarak epprom adresleri, tüm değişkenler başlangıçta eppromdan alınır.                        
uint8_t adres  [][7]    ={{0,     0         ,       1               ,     3       ,     5     ,       7             ,         9     },
/*dğerler eeprom adres*/  {0,     0         ,       11              ,     13      ,     15    ,       0             ,         0     },
                          {0,     0         ,       17              ,     19      ,     21    ,       23            ,         25    },
                          {0,     0         ,       70              ,     72      ,     0     ,       0             ,         0     }};

// değer değişkenleri için min ve maks değerler yine 10 ile çarpılmış olarak
uint16_t min_menu[][11] ={{0,     0         ,      0                ,     0       ,     0     ,       0             },
/*değerler minimum    */  {0,     0         ,     200               ,     0       ,     0     ,       0             ,       0       ,       0       ,   0   },
                          {0,     0         ,      0                ,     0       ,     0     ,       0             ,       0       ,       0       },
                          {0,     0         ,      0                ,     0       ,     0     ,       0             ,       0       },
                          {0,     0         ,      0                ,     0       ,     0     ,       0             ,       0       },
                          {0,     0         ,     200               ,    600      ,    200    ,      600            }};

uint16_t max_menu[][11] ={{0,     0         ,       0               ,     0       ,     0     ,       0             },
/*değerler maksimum   */  {0,     0         ,     1000              ,     1000    ,   1200    ,     1000            ,       0       ,       0        ,  0    },
                          {0,     0         ,     1000              ,     1000    ,   1200    ,       0             ,       0       ,       0        },
                          {0,     0         ,     1200              ,     1200    ,   1200    ,     1200            ,      1200    },
                          {0,     0         ,     1100              ,     1000    ,     0     ,       0             },
                          {0,     0         ,     300               ,     1000    ,   300     ,     1000            }};

// değer değişkenleri ayarlarken varsayılan birim artış/azalış miktarları, yani ayar çözünürlüğü (10'la çarpılmış olarak)
byte  artis_menu[][11]  ={{0,     0         ,     0                 ,     0       ,     0     ,       0             },
/*değerler artış/adım*/   {0,     0         ,     1                 ,     10      ,     10    ,       10            ,      10       ,       0         ,   0   },
                          {0,     0         ,     10                ,     10      ,     10    ,       0             ,       0       ,       0         },
                          {0,     0         ,     10                ,     10      ,     10    ,       10            ,      10       },
                          {0,     0         ,     10                ,     10      ,     0     ,       0             },
                          {0,     0         ,     1                 ,     1       ,     1     ,       1             }};

Döngüde de şöyleydi, sadece array indisleri üzerinden ekrana metin yazdırıp, değişkenleri de yine ilgili menü öğesi indisiyle aynı indisteki bir array de saklıyor. Menüye eklemeleri veya metin değişiklikleri için yukarıdaki array değişkenlerle oynuyordum sadece. Bunlar parametreleri ayarlamak içindi. bunun dışında if- else ile de bir state-machine olarak çalışıyordu.

döngü ve tuş kontrolü:
if(ekran==MENU)
  {
         m_l=metin_menu[m_i][0];
        if(DispOk)
        {
          //lcd.clear();
          lcd.setCursor(0,0);
              tire(2);lcd.print(metin_menu[m_i][1]);tire(2);bosluk(3);
              lcd.setCursor(18,0);lcd.print(((m_buff-2)%m_l)+1);
          //lcd.sil(2);
          lcd.setCursor(1,2);
              indis=((m_buff-1)%m_l)+2;
              lcd.print(metin_menu[m_i][indis]);bosluk(3);
              lcd.setCursor(15,2);
              if(p_menu[m_i][indis]==1)
              {
                if(v_menu[m_i][indis]<1000)bosluk(1);
                buff_f=v_menu[m_i][indis];
                if(artis_menu[m_i][indis]==1)lcd.print(buff_f/10,1);
                else lcd.print(buff_f/10,0);
              }
          //lcd.sil(3);
          lcd.setCursor(1,3);
              indis=((m_buff)%m_l)+2;
              lcd.print(metin_menu[m_i][indis]);bosluk(3);
              lcd.setCursor(15,3);
              if(p_menu[m_i][indis]==1)
              {
                if(v_menu[m_i][indis]<1000)bosluk(1);buff_f=v_menu[m_i][indis];
                if(artis_menu[m_i][indis]==1)lcd.print(buff_f/10,1);//0.1 artış
                else lcd.print(buff_f/10,0);//1.0 artış
              }
          //lcd.sil(1);
          lcd.setCursor(0,1);ok();
              indis=((m_buff-2)%m_l)+2;
              lcd.print(metin_menu[m_i][indis]);bosluk(3);
              if((p_menu[m_i][indis]==1)&&(buff_up==0))//değer görüntüleme
              {
                lcd.setCursor(15,1);
                if(v_menu[m_i][indis]<1000)bosluk(1);
                buff_f=v_menu[m_i][indis];
                if(artis_menu[m_i][indis]==1)lcd.print(buff_f/10,1);
                else lcd.print(buff_f/10,0);
              }
              else if(p_menu[m_i][indis]==1)  //değer değiştirme (buff_up=1) iken
              {
                lcd.setCursor(15,1);
                if(v_menu[m_i][indis]<100)bosluk(1);
                buff_f=intbuff;
                if(artis_menu[m_i][indis]==1)lcd.print(buff_f/10,1);
                else lcd.print(buff_f/10,0);
              }
          lcd.setCursor(19,1);
          DispDone;
        }
        if(b_up>0)    // p_menu[m_i][indis] v_menu[m_i][indis] min_menu[m_i][indis] max_menu[m_i][indis] artis_menu[m_i][indis]
        {
          switch(button)
          {
            case B_R      : if(buff_up==0){m_buff++;lcd.clear();}
                            else if(intbuff<=(max_menu[m_i][indis]-artis_menu[m_i][indis]))intbuff+=artis_menu[m_i][indis];
                            break;
            case B_R_sal  : break;
            case B_L      : if(buff_up==0){if(m_buff>2)m_buff--;lcd.clear();}
                            else if(intbuff>=artis_menu[m_i][indis])intbuff-=artis_menu[m_i][indis];
                            break;
            case B_L_sal  : break;
            case B_E_sal  : lcd.clear();
                            switch(p_menu[m_i][indis])
                            {
                              case 0  : break;
                              case 1  : if(buff_up==0)
                                        {
                                          buff_up=1;
                                          intbuff=v_menu[m_i][indis];
                                          lcd.blink();
                                        }
                                        else if(buff_up>0)
                                        {
                                          v_menu[m_i][indis]=intbuff;
                                          EEPROM.put(adres[m_i-1][indis],intbuff);
                                          buff_up=0;
                                          lcd.noBlink();
                                        }
                                        break;
                              case 2  : m_onceki=m_i;
                                        buff_onceki=indis;
                                        m_i=v_menu[m_i][indis];
                                        m_buff=2;
                                        break;
                              case 3  : ekran=KOMUT;
                                        m_onceki=m_i;
                                        buff_onceki=indis;
                                        komut=v_menu[m_i][indis];
                                        break;
                              default : break;
                            }
                            b_up=0;DispUp;break;
           
            case B_G:     if(buff_up>0){buff_up=0;lcd.noBlink();}
                          else
                          {
                            m_buff=2;
                            if(m_i==m_onceki)
                            {
                              ekran=ANA;
                              m_i=0;
                            }
                            else m_i=m_onceki;
                          }
                          lcd.clear();break;
            default: break;
          }
          b_up=0;DispUp;
      }
 
  }

Senin kodlar yine derli toplu sen birde benim menuyu gör. Çarşaf gibi kod oldu. Ama sorunsuz çalışıyor. Grafik lcd bu konuda biraz daha uyuz.
 
Benim matrix buton tarama kadar berbat görünemez :katil2:
C:
//--------------K1-----------
  digitalWrite(row0, LOW);
  if (digitalRead(col0) == LOW && flag0 == 0) {
    key0(1, mode);
    flag0 = 1;
  }
  if (digitalRead(col0) == HIGH && flag0 == 1) {
    flag0 = 0;
    key0(0, mode);
  }
  digitalWrite(row0, HIGH);
  delayMicroseconds(wait);
  //--------------K1-----------

  //--------------K2-----------
  digitalWrite(row1, LOW);
  if (digitalRead(col0) == LOW && flag1 == 0) {
    key0(2, mode);
    flag1 = 1;
  }
  if (digitalRead(col0) == HIGH && flag1 == 1) {
    flag1 = 0;
    key0(0, mode);
  }
  digitalWrite(row1, HIGH);
  delayMicroseconds(wait);
  //--------------K2-----------

  //--------------K3-----------
  digitalWrite(row2, LOW);
  if (digitalRead(col0) == LOW && flag3 == 0) {
    key0(3, mode);
    flag3 = 1;
  }
  if (digitalRead(col0) == HIGH && flag3 == 1) {
    flag3 = 0;
    key0(0, mode);
  }
  digitalWrite(row2, HIGH);
  delayMicroseconds(wait);
  //--------------K3-----------
for döngüsünün var olduğunu unutmuştum bunu yazarken 12 tane böyle yazdım tarama için :katil2:
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,951
Mesajlar
118,753
Üyeler
2,824
Son üye
selocan32

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top