Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Picproje Kütüphane (Library) => Konuyu başlatan: sigmoid - 20 Kasım 2010, 22:48:33

Başlık: Hazır lcd menü fonksiyonu
Gönderen: sigmoid - 20 Kasım 2010, 22:48:33
Bir çok projemizde lcd ekrana menü yapma ihtiyacımız olmuştur. Bende projemde kullandığım kendi yazdığım fonksiyonu burada sizlere sunuyorum. Herkese faydalı olması dileğiyle. Kullanımı çok kolay. bir include işlemi ve string dizi oluşturmaktan ibaret.

Ben hitech 9.60PL2 versiyonunu kullanıyorum. Build options tan use OSCCAL ı pasif yapmanız gerekiyor. Yoksa string diziyi okuyamıyor, ufak bir saçmalama oluyor. menu fonksiyonumda kullandığım buton fonksiyonu bir önceki mesajımda gönderdim. O mesajı inceleyebilirsiniz. Lcd.h ve bekle.h dosyalarını göndermiyorum. Benden istemeyinde, ısrarcıda olmayın. Sadece her yerde bulunan lcd ve delay fonksiyonlarını kendime göre türkçe isimlendirdim.

Artık hayal gücünüze göre bu fonksiyonu grafik lcd veya diğer lcdler için gerekli değişiklikleri yaparsınız.

Örnek Programın çıktısı:
(http://i1011.hizliresim.com/2010/11/20/7099.jpg)

menu.h dosyası


//buton ayarları..
#define butonsol butonoku((unsigned char*)&PORTA,0)
#define butonsag butonoku((unsigned char*)&PORTA,1)
#define butontamam  butonoku((unsigned char*)&PORTA,2)
#define butoniptal butonoku((unsigned char*)&PORTA,3)

unsigned char menuciz(const char * baslik,char basliksutunu, const char * menuler[],unsigned char menuadeti,unsigned char ilkmenu);


menu.c dosyası

#include <htc.h>
#include "buton.h"
#include "menu.h"
#include "lcd4bit.h"


unsigned char menuciz(const char * baslik,char basliksutunu, const char * menuler[],unsigned char menuadeti,unsigned char ilkmenu)
{
unsigned char menugoster,eskimenugoster=-1; //ekranda gösterilecek menü
menugoster=ilkmenu-1;

while(1)
{
//Menüde değişiklik olduysa ekranı yeniden çiz.
if(menugoster!=eskimenugoster)
{
lcd_sil();
lcd_mesajyaz(1,basliksutunu,baslik);
lcd_mesajyaz(2,1,"<");
lcd_mesajyaz(2,16,">");
//menüyü yaz.
lcd_mesajyaz(2,2,menuler[menugoster]);

eskimenugoster=menugoster;
}


//sağ tuşunamı basıldı?
if(butonsag)
{
menugoster++;
if(menugoster>(menuadeti-1))
menugoster=0;
while(butonsag); //butonun bırakılmasını bekle..
}

//sol tuşamı basıldı?
if(butonsol)
{
menugoster--;
if(menugoster==0xff)
menugoster=menuadeti-1;
while(butonsol); //butonun bırakılmasını bekle..
}

//tamam tuşunamı basıldı
if(butontamam)
{
while(butontamam);
return (menugoster+1);
}

if(butoniptal)
{
while(butoniptal);
return 0;
}

}
return 0;
}




main.c, Örnek program çalışması.

// Lcd menü test

#include <htc.h>
#include "menu.h"
#include "buton.h"
#include "lcd4bit.h"
#include "bekle.h"

__CONFIG(XT & WDTDIS & PWRTEN & BORDIS & LVPDIS & DUNPROT & WRTEN& DEBUGDIS & UNPROTECT);

//menüleri listeliyoruz.
const char * menuliste[]={" Role Kontrol",
"Lamba Kontrol",
"Motor Kontrol",
"  Saat Ayari",
"    Sistem"};

void main(void)
{
unsigned char secilen;
ADCON1=0x06;
PORTA=0;
PORTC=0;
PORTD=0;
TRISA=0x0F;
TRISC=0x00;
TRISD=0x00;

lcd_baslat();
lcd_sil();

secilen=menuciz("ANA MENU",5,menuliste,5,1);

switch(secilen)
{
case 0: //iptal tuşuna basıldı
break;
case 1: // role kontrol menüsü seçildi.
break;
case 2: // lamba kontrol menüsü secildi.
break;
case 3: //Motor kontrol menüsü seçildi.
break;
case 4: //Saat kontrol menüsü seçildi
break;
case 5: //Sistem bilgisi menüsü seçildi.
break;
}

while(1);
}



Kullanımı :

const char * menuliste[] ile bir liste oluşturuyoruz. Pointerları rame yazdığından birden fazla menü kullanıyorsanız ram şişiyor. Eğer Bank0 dolarsa
const char * bank1 menuliste[]  şeklinde bank1 i kullanmaya başlayabilirsiniz. Nedense bank2 ve bank3 te çalışılmıyor. Herhalde benim kullandığım versiyonun bir bugı. Menüdeki yazıları ekranda ortalamak için boşluk kullanıyoruz.

menüyü çağırmak istediğimizde
secilen=menuciz("ANA MENU",5,menuliste,5,1);

şeklinde çağırabiliriz. "ANA MENU" lcd ekranın ilk satırında gözükmesi gereken yazı. Yukarıda const olarak tanıttığımız menü içeriği 2. satırda gözüküyor. Sağ ve sol butonları ile menü içinde gezebiliyoruz. iptal butonuna basınca 0 değeri geri dönüyor. Eğer menülerden biri seçiliyken tamam butonuna basılırsa listede kacıncı sıradaysa onun  numarası dönüyor.

ikinci parametre yani 5, ilk satırdaki ANA MENU başlığının ekranda kaçıncı sutünda bulunması gerektiğini gösteriyor.
3. parametre menudizisinin adı,
4. parametre menunun kaç elemanı olduğunu giriyoruz
son parametrede ise ilk olarak hangi menünün ekranda seçili olarak gözükeceği.

lcd_mesajyaz(); fonksiyonunda ilk parametre satır, ikinci parametre sutün, son parametrede mesajdır. Yukarıda yazdığım gibi heryerde bulunan lcd fonksiyonlarının kendime göre isimlendirmiş halidir. Armut piş ağzıma düş diyen hazırcı arkadaşlar için kendi yazdığım bu basit fonksiyonu vermiyorum.

Düzeltme: Mesajın tamamını gönderemeden yanlışlıkla kaydete basmışım.  :-[