Welcome, Ziyaretçi

Gönderen Konu: ROTARY ENCODER İLE GLCD MENU  (Okunma sayısı 7514 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

mc@ey

  • Er
  • İleti: 1
  • Teşekkür: 0
ROTARY ENCODER İLE GLCD MENU
« : 16 Aralık 2013, 13:25:00 »
Arkadaslar herkeze meraba.

Dogru yere yazip yazmadigimdan emin degilim buyüzden simdiden affiniza siginiyorum . :)

Internette GLCD leri arastiriken
ROTARY ENCODER İLE GLCD MENU .
isimli videoyu gördüm ve cok begendim. Bu videonun projesini ve codunu forumda bulabiliyormuyuz ben bulamadim.

Herkeze Selamlar


Uykusuz

  • Administrator
  • Yarbay
  • ******
  • İleti: 2599
  • Teşekkür: 207
  • while(heart_rate>0){work();}
Ynt: ROTARY ENCODER İLE GLCD MENU
« Yanıtla #1 : 16 Aralık 2013, 15:36:35 »
Merhaba

Öncelikle aramıza hoş geldiniz. Videosunu izlediğiniz cihazı bir firma için yaptığım için kodlarını yayımlayamıyorum maalesef. Fakat yayımlasam da kendi işinize göre entegre etmeniz oldukça zor olacak.

Üye Olmadan Linkleri Göremezsiniz. Üye Olun veya Giriş Yapın

Yakın zamanda bir işim için esnek bir menü algoritması yazacağım. O yazmış olduğum fonksiyonu burada yayımlarım. Böylece kendi işiniz için daha kolay kullanabilirsiniz.

Saygılar.
Projelerimiz için tıklayın Üye Olmadan Linkleri Göremezsiniz. Üye Olun veya Giriş Yapın
Sipariş ve Bilgi için satis@lugatek.com ile irtibata geçiniz.
Lütfen teknik sorularınızı forumda sorunuz özel mesaj göndermeyiniz

barbarosbaki

  • Er
  • İleti: 1
  • Teşekkür: 0
  • İyi ki Lugatek Üyesiyim :)
Ynt: ROTARY ENCODER İLE GLCD MENU
« Yanıtla #2 : 12 Mayıs 2016, 15:11:33 »
Merhaba . Bu sistemi kendi ürünlerimizde kullanmak istiyorum .
Bana yardımcı olabilir misiniz ?

Uykusuz

  • Administrator
  • Yarbay
  • ******
  • İleti: 2599
  • Teşekkür: 207
  • while(heart_rate>0){work();}
Ynt: ROTARY ENCODER İLE GLCD MENU
« Yanıtla #3 : 13 Mayıs 2016, 11:37:21 »
Merhaba,
Tam olarak takıldığınız nokta nedir, elimizden geleni yapmaya çalışalım hocam
Projelerimiz için tıklayın Üye Olmadan Linkleri Göremezsiniz. Üye Olun veya Giriş Yapın
Sipariş ve Bilgi için satis@lugatek.com ile irtibata geçiniz.
Lütfen teknik sorularınızı forumda sorunuz özel mesaj göndermeyiniz

M_B

  • Er
  • İleti: 4
  • Teşekkür: 0
  • İyi ki Lugatek Üyesiyim :)
Ynt: ROTARY ENCODER İLE GLCD MENU
« Yanıtla #4 : 27 Ekim 2016, 23:49:03 »
@uykusuz Hocam;
Sitenizi youtube de Glcd icin menu hazırlama videolarını seyrederken rastladım.
Ks0108 128x64 icin menu olusturmaya calısıyorum takıldıgım noktalar menuler arasında geçişler.
Hocam mantık ve ip ucu olarak tiyo ufak bir kod parçası yayınlayabilirmisiniz.


Teşekkürler
Mehmet

menu gecislerini tuslarla yapacam. rotary kullanmayacam.


Uykusuz

  • Administrator
  • Yarbay
  • ******
  • İleti: 2599
  • Teşekkür: 207
  • while(heart_rate>0){work();}
Ynt: ROTARY ENCODER İLE GLCD MENU
« Yanıtla #5 : 28 Ekim 2016, 21:16:43 »
Merhaba, öncelikle aramıza hoş geldiniz.

İlk olarak şunu söylemeliyim ki menü tasarımı ile LCD'de şekil çizme tarafı birbirinden farklı işlerdir. Biraz açıklayacak olursak; menüyü LCD'den bağımsız tasarlamalı, menünün amacı sadece global ya da extern edilmiş değişkenleri değiştirmek olmalıdır.

Değişkenlerin durumlarına göre donanımsal değişiklikler farklı bir fonksiyonda, değişkenlerin durumunu LCD'de gösterme işi de farklı bir fonksiyonda olmalıdır. Butonları okunmalı, ilgili değişkenler belli sınırlar dahilinde değiştirilmeli ve fonksiyondan çıkılmalıdır. Bunun haricinde bir işlem yapmamalısınız. Daha sonra LCD'yi değişkenlerin duruma göre yeniler donanımınızı kontrol edersiniz. Bu şekilde oldukça esnek, değiştirilmesi ve geliştirilmesi kolay bir yapı elde edersiniz. Benim genellikle yapım eğer bir işletim sistemi kullanmıyorsam şu şekilde oluyor.

while(){
butonları_oku();
menu_nav();
do_work();
lcd_yenile();
}

lcd_yenile'yi her seferine çağırmanıza da gerek yok zira LCD'nin saniyede 20 den fazla yenilenmesi gereksiz bir iştir. Bu kadar hızlı bir değişimi kullanıcı zaten göremez. Kendisi de bu kadar hızlı butonlara basamaz. Bu sebeple lcd_yenile fonksiyonunu arada bir çağırsanız yeterlidir hem böylece diğer işler için daha fazla zaman kalacaktır.

menu_nav fonksiyonu da menü işemlerinin yapıldığı fonksiyondur.
do_work de diğer işlemlerin yapıldığ fonksiyondur.

menu_nav fonksiyonu state machine yapısında çalışır. dizin ve parametre olarak genel değişkenler vardır. dizin 0 iken bir menü alt menüler, dizin 1 iken alt menüler ve parametreleri yer alır.

Örneğin ilk cihaz açıldı dizin=0 param=0 dır. Cihazınızın da 5 adet menüsü olsun. Menü tuşuna basıldığında dizin=1 yapılır ve param=0 olduğundan menüde ve ilk seçenek seçilir. Yukarı aşağı tuşuna basıldığında param 0 ile 4 arası gider gelir böylece istenilen menü seçilir. tekrar menü tuşuna basıldığında param hangi menü üzerindeyse dizin=2 olarak ilgili değişkenin yukarı aşağı ile sınırlar dahilinde değiştirilmesi sağlanır. tekrar menü tuşuna basılarak değişiklik onaylanır dizin=1 yapılarak ana menüye çıkılır. vs....

Bu yazdıklarım örnek bir çalışmadır. Kafanıza görede değişiklikler yapabilirsiniz. Burada ana mantık switch case yapısıdır ilgili değişken ayarlanır ve çıkılır başka bir işlem yapılması için beklenmez. Daha sonra tekrar menu_nav çağrıldığında ilgili değişiklik son kalınan yerden yapılır ve tekrar çıkılır.

Tüm bunları yaparken de isterseniz grafik LCD kullanırsınız isterseniz karakter. Artık LCD tarafı menüden bağımsızdır. LCD tarafı işi görselleştirme tarafıdır dolayısıyla da menüden bağımsızdır. Bunun sağladığı esneklikle bir tema gibi tasarımınıza farklı görünümler sağlayabilirsiniz. Farklı farklı temalar dahi oluşturabilirsiniz.

Bunun dışında çok daha farklı teknikler tabii ki mevcut şuan hızlı bir şekilde adapte olabileceğiniz bir teknik olduğunu düşünerek bunu anlatmaya çalıştıım. Zamanım kısıtlı olduğundan hızlı yazdım yazım hatalarım anlatım bozukluklarım olabilir kusuruma bakmayın.

İyi çalışmalar.
Projelerimiz için tıklayın Üye Olmadan Linkleri Göremezsiniz. Üye Olun veya Giriş Yapın
Sipariş ve Bilgi için satis@lugatek.com ile irtibata geçiniz.
Lütfen teknik sorularınızı forumda sorunuz özel mesaj göndermeyiniz

M_B

  • Er
  • İleti: 4
  • Teşekkür: 0
  • İyi ki Lugatek Üyesiyim :)
Ynt: ROTARY ENCODER İLE GLCD MENU
« Yanıtla #6 : 28 Ekim 2016, 21:57:50 »
Hoş bulduk Hocam;
uzunca acıklamanız için çok teşekkür ederim.
Kullanacagım GLCD Ks0108 128X64
Menu Yapim
---MENU--
Program
Manuel
Ayar
Cıkıs

--Program--
Program-1
Program-2
Program-3
Program-4
Program-5
GERI

bu sekılde devam ediyor.
Hocam once bir menu yapısını dallanmaları olusturayım takıldıgım yerde tekrar sorarım.
Tesekkurler.

M_B

  • Er
  • İleti: 4
  • Teşekkür: 0
  • İyi ki Lugatek Üyesiyim :)
Ynt: ROTARY ENCODER İLE GLCD MENU
« Yanıtla #7 : 29 Ekim 2016, 14:19:43 »
Merhaba Hocam;

Menu üzerinde calısmalarım suruyor. Son hali olarak ise videodaki gibidir.
Ekrndaki gecişleri daha hızlı nasıl yapabilirim.
Sizin videodaki gibi.
Kullandığım işlemci : PIC18F4620   Ekran : KS0108 128x64
dil: mikroC
Üye Olmadan Linkleri Göremezsiniz. Üye Olun veya Giriş Yapın

Uykusuz

  • Administrator
  • Yarbay
  • ******
  • İleti: 2599
  • Teşekkür: 207
  • while(heart_rate>0){work();}
Ynt: ROTARY ENCODER İLE GLCD MENU
« Yanıtla #8 : 29 Ekim 2016, 14:22:35 »
Merhaba hocam,
Kullanmış olduğunuz ks108 kütüphanesini paylaşabilir misiniz?
Sanki lcd de dortgen fill yapma işi yavaş gerçekleşiyor gibi.
Projelerimiz için tıklayın Üye Olmadan Linkleri Göremezsiniz. Üye Olun veya Giriş Yapın
Sipariş ve Bilgi için satis@lugatek.com ile irtibata geçiniz.
Lütfen teknik sorularınızı forumda sorunuz özel mesaj göndermeyiniz

M_B

  • Er
  • İleti: 4
  • Teşekkür: 0
  • İyi ki Lugatek Üyesiyim :)
Ynt: ROTARY ENCODER İLE GLCD MENU
« Yanıtla #9 : 29 Ekim 2016, 14:30:59 »
Hocam malesef kutuphane kapali :(
mikroC olduğu icin.
Eger xc8 icin kutuphane bulabilirsem onda deneyecem.

Kullandıgım kod:
Kod: Üye Olmadan Linkleri Göremezsiniz. Üye Olun veya Giriş Yapın
#include "hardware.h"


#define INVERT 2
#define CLEAR  0
#define BLACK  1
#define EkranSil Glcd_Fill(0x00)        // ekran temizlendi


sbit YUKARI at RA0_bit;
sbit ASAGI at  RA1_bit;
sbit SAG   at  RA2_bit;
sbit SOL   at  RA3_bit;
sbit ENTER at  RA4_bit;


const char  ctext[] = "mikroElektronika";

char *someText;

char Durum;
char Str1;
char Str2;


void Goster(char y,char x);
void ShowMenu(void);
void MenuCubugu(char x, char y);
void Cerceve(void);
void Line(char x, char renk);
void ShowPrgMenu(void);
void OkYonu(void);
void MainMenu(void);
void ProgramMenu(void);
void PrgPage(char page);
void SatirLariSil(void);




 char *Menu[]=
{
  "           MENU         ",
  "  PROGRAM               ",
  "  MANUEL                ",
  "  AYAR                  ",
  "  CIKIS                 ",
  "                        "
};


 char *PrgMenu[]=
{
  "        PROGRAM         ",  // 0
  "  PROGRAM -1            ",  // 1
  "  PROGRAM -2            ",  // 2
  "  PROGRAM -3            ",  // 3
  "  PROGRAM -4            ",  // 4
  "  PROGRAM -5            ",  // 5
  "  CIKIS                 ",  // 6
  "                        "   // 7
};



void main() {

  ADCON1 |= 0x0F;         // AN pinleri dijital giriş/çıkış
  CMCON  |= 7;            // komparatörler disable edildi
  TRISA=0x1F;
  Glcd_Init();            // KS108 GLCD yapılandırıldı
  Glcd_Fill(0x00);        // ekran temizlendi
  Glcd_Write_Text("    MENU UYGULAMA  ", 0, 0, 1);      // text ekrana
  Glcd_Write_Text("  Test . ver.1 ", 0, 3, 1);          // gönderiliyor
  Glcd_Write_Text("                      ", 0, 7, 1);      //
  Delay_ms(1000);
  Glcd_Fill(0);                 // Ekrani siliyor

 

  while(1) {
            MainMenu();
            Delay_ms(50);
           }
}

/*******************************************************************************
                       ANA MENU
*******************************************************************************/
void MainMenu(void)
{
char MenuCikis=1;
char MenuNo=1;
ShowMenu();
Cerceve();
MenuCubugu(1, INVERT);   // ilk acilista program secili
while(MenuCikis)
                {
                if(ASAGI){
                           MenuCubugu(MenuNo, INVERT);   // secili olan siliniyor
                           MenuNo++;
                          if(MenuNo==5){
                                        MenuNo=1;
                                        MenuCubugu(MenuNo, INVERT);        // Bir sonraki seciliyor
                                        }else
                                             {
                                             MenuCubugu(MenuNo, INVERT);   // Bir sonraki seciliyor
                                             }
                          while(ASAGI);
                          }
                /******************************************************/
               
                if(YUKARI){
                           MenuCubugu(MenuNo, INVERT);   //secili olan siliniyor
                           MenuNo--;
                         if(MenuNo==0){
                                        MenuNo=4;
                                        MenuCubugu(MenuNo, INVERT);        // Bir sonraki seciliyor
                                        }else
                                             {
                                             MenuCubugu(MenuNo, INVERT);   // Bir sonraki seciliyor
                                             }
                          while(YUKARI);
                          }
                 
                 /******************************************************/
                 if(ENTER){
                 

                           if(MenuNo==1)  // Program
                                          {
                                          ProgramMenu();
                                          Delay_ms(250);
                                          Delay_ms(250);
                                          Delay_ms(250);
                                          MenuCikis=0;
                                          }
                 
                           if(MenuNo==4)  // Cikis
                                          {
                                          Delay_ms(250);
                                          Delay_ms(250);
                                          Delay_ms(250);
                                          MenuCikis=0;
                                          }
                 

                 
                 
                          } // ENTER sonu.
                 


                }  // while MenuCikis end.

EkranSil;
Glcd_Write_Text(" MENU DEN CIKILDI  ", 0, 0, 1);      // text ekrana
Delay_ms(250);
Delay_ms(500);
EkranSil;

}


/******************************************************************************/
void MenuCubugu(char x, char renk)
{
  Glcd_Box(18, (x*13),100, ((x*13)+9), renk);               // dikdortgen.
}

/******************************************************************************/
void ShowMenu(void)
{
char i;
char x;
char y;
x=0;
y=0;
for(i=0;i<5;i++)
                {
                Glcd_Write_Text_Adv(Menu[i], 22, x);  // Yazi
                x=x+13;
                }
}

/******************************************************************************/
 void Cerceve(void){
  Glcd_Box(0, 0,126, 9, 2);               // dikdortgen. 18->0 oldu
  Glcd_Box(0, 11, 126, 11, 2);           // ince cizgi   100->126  oldu
}

« Son Düzenleme: 29 Ekim 2016, 14:33:25 Gönderen: M_B »

Uykusuz

  • Administrator
  • Yarbay
  • ******
  • İleti: 2599
  • Teşekkür: 207
  • while(heart_rate>0){work();}
Ynt: ROTARY ENCODER İLE GLCD MENU
« Yanıtla #10 : 30 Ekim 2016, 14:37:39 »
Merhaba
Hocam ben farklı ve hızlı bir kütüphane kullanıyorum.
Üye Olmadan Linkleri Göremezsiniz. Üye Olun veya Giriş Yapın

Burada görüntü ilk etapta MCU'unun raminde oluşturuluyor. Tüm işlemler bittikten sonra LCD update edilerek ramdeki görüntü LCD'ye basılıyor. Sizinkinde ise tek tek bir ünceki siliniyor üzerine başka çizimler ekleniyor ve bunlar yapılırken kullanıcı tüm olan biteni an an görebiliyor. Bu tarz çalışma biraz karmaşık ve zor oluyor. Linkini verdiğim kütüphaneyi kullanmanızı tavsiye ederim.
Projelerimiz için tıklayın Üye Olmadan Linkleri Göremezsiniz. Üye Olun veya Giriş Yapın
Sipariş ve Bilgi için satis@lugatek.com ile irtibata geçiniz.
Lütfen teknik sorularınızı forumda sorunuz özel mesaj göndermeyiniz