Hazır lcd menü fonksiyonu

Başlatan sigmoid, 20 Kasım 2010, 22:48:33

sigmoid

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ı:


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.  :-[