PIC16f877de menü oluşturma

Başlatan CoşkuN, 26 Şubat 2006, 21:56:15

CoşkuN

Menü oluşturmak hakkında fazla bir kaynak bulamadım ve kendim el yordamıyla birşeyler yaptım.Similasyonda gayet güzel çalışıyor ama gerçek devrede sapıtıyor.Butonlara belli bir kere üst üste basınca alıp başını gidiyor ya da kitleniyor.
Yaptığım şey 4 bölümlü bir menü.Bir butonla menüler geziliyor,diğer iki butonda her menüye ait parametreyi artırıp azaltıyor.
Sorun neden kaynaklanıyor olabilir?
Ya da menü tasarımı için başka önerisi olan var mı?
#include <pic.h>
#include "delay.h"
#include "lcd.h"


void menu1(void);
void menu2(void);
void menu3(void);
void menu4(void);
unsigned char menu_deger1,menu_deger2,menu_deger3,menu_deger4,menu;
const char bas1[]={"MOTOR KONTROL"};
const char bas2[]={"***************"};
const char m1[]={"*****PWM******"};
const char m2[]={"*****MENU-2*****"};
const char m3[]={"*****MENU-3*****"};
const char m4[]={"*****MENU-4*****"};
const char a[]={"<-AZALT  ARTIR->"};
void main(void)

{
	TRISA=0x00;
	TRISB=0x00;
	TRISD=0x00;
	TRISC=0x00;

	PR2=0XFF; //PWM periyodu
	CCPR1L=0XFF;// PWM duty cycle
	CCP1CON=0X1C;
	T2CON=0X05;
	menu=0;
lcd_init(); //LCD'yi hazırla
lcd_puts(bas1);
lcd_goto(64);
lcd_puts(bas2);
DelayMs(255);
DelayMs(255);


lcd_clear();
//Sonsuz döngü
while(1){
if(menu==1) menu1();	
if(menu==2) menu2();	
if(menu==3) menu3();	
if(menu==4) menu4();	
if(RD4==0) 
	{
	DelayMs(200);
	menu++;
	}


/*	if(RD1==0)
	{
	DelayMs(200);
	CCPR1L=	CCPR1L+1;
	}
	if(RD0==0)
	{
	DelayMs(200);
	CCPR1L=	CCPR1L-1;
/	}
lcd_goto(4);
lcd_dec_byte(CCPR1L);
lcd_goto(69);
lcd_dec_byte(CCPR1H);


	}*/

}
}


void menu1(void){
lcd_clear();
lcd_puts(m1);
lcd_goto(64);
lcd_puts(a);

while(1)	{ //menü sonsuz döngüsü


	if(RD0==0){ //azalt
		while(RD0==0);
			DelayMs(100);
			if(menu_deger1!=0)//sıfıra geldiyse
//			CCPR1L--;
			menu_deger1--;
		lcd_goto(64);
		lcd_dec_byte(menu_deger1);
				}

	if(RD1==0){ //artır
			while(RD1==0);
			DelayMs(100);
			if(menu_deger1!=255)//sınıra geldiyse
//		CCPR1L++;
		menu_deger1++;
		lcd_clear();

		lcd_puts(m1);
		lcd_goto(64);
		lcd_dec_byte(menu_deger1);
				}

	if(RD4==0){ //menu atla
 	while(RD4==0);
		DelayMs(100);
		menu=2;
		break;
		}
}
//end while
return;
}//end menu1


void menu2(void){
lcd_clear();
lcd_puts(m2);
lcd_goto(64);
lcd_puts(a);

			while(1){ //menü sonsuz döngüsü
					
	if(RD0==0){ //azalt
				while(RD0==0);
				DelayMs(100);
				if(menu_deger2!=0)//sıfıra geldiyse
				menu_deger2--;
				lcd_puts(m2);
				lcd_goto(64);
				lcd_dec_byte(menu_deger2);
				}
	if(RD1==0){ //artır
			while(RD1==0);
			DelayMs(100);
				if(menu_deger2!=255)//sınıra geldiyse
				menu_deger2++;
				lcd_puts(m2);
				lcd_goto(64);
				lcd_dec_byte(menu_deger2);
				}
	if(RD4==0){ //menu atla
			while(RD4==0);
			DelayMs(100);
			menu=3;
			break;
			}

}
//while son
return;
}//menu2 sonu

void menu3(void){
lcd_clear();
lcd_puts(m3);
lcd_goto(64);
lcd_puts(a);

			while(1){ //menü sonsuz döngüsü
	if(RD0==0){ //azalt
	while(RD0==0);
			DelayMs(100);
			if((--menu_deger3)==0)//sıfıra geldiyse
			menu_deger3=0;
			lcd_puts(m3);
			lcd_goto(64);
			lcd_dec_byte(menu_deger3);
	}

	if(RD1==0){ //artır
		while(RD1==0);
		DelayMs(100);
			if((--menu_deger3)==255)//sınıra geldiyse
			menu_deger3=255;
			lcd_puts(m3);	
			lcd_goto(64);
			lcd_dec_byte(menu_deger3);
		}

	if(RD4==0){ //menu atla
		while(RD4==0);
			DelayMs(100);
			menu=4;
			break;
		}

}
//end while
return;
}//menu3 sonu

void menu4(void){
lcd_clear();
lcd_puts(m4);
lcd_goto(64);
lcd_puts(a);
			
			while(1){ //menü sonsuz döngüsü
			if(RD0==0){ //azalt
			while(RD0==0);
		DelayMs(100);
		if((--menu_deger4)==0)//sıfıra geldiyse
menu_deger4=0;
lcd_puts(m4);
lcd_goto(64);
lcd_dec_byte(menu_deger4);
}
if(RD1==0){ //artır
			while(RD1==0);
			DelayMs(100);
if((++menu_deger4)==255)//sınıra geldiyse
menu_deger4=255;
lcd_puts(m4);
lcd_goto(64);
lcd_dec_byte(menu_deger4);
}
if(RD4==0){ //menu atla
	while(RD4==0);
DelayMs(100);
menu=0;
lcd_clear();
break;
}
}
//end while
return;
}//menu4 sonu

CoşkuN

Butonlara belirli bir aralıkta bastım mı sorun yok ama biraz hızlı ard-arda bastım mı kitleniyor? Butonların basılma anlarına bekleme de koyduğum halde bu neden olabilir?

CoşkuN

Bu konuda yorumu olan yok mu acaba?

CoşkuN

Acaba artık C'de kod yazan kalmadı mı diye düşünmeye başlıyorum  :roll:

Göktuğ

Yazılımsal olarak değilde donanımsal olarak yardım etmeye calısayım . Butonlara cap ekledinmi? Eger yoksa capasitor ekleyerek denermisin?

CoşkuN

Şu sıralar pek uğraşamadım ama kaçlık caps ekleyeyim mesala?

CoşkuN

Pointer kullanarak programı daha da basitleştirdim.
Menü tasarımı hakkında konuşmak isteyen yok mu?

3ddark

Arkadaslar ben bir tane menu yaptım ama ne kadar isinize yarar bilmem gayet güzel ama daha cok gelistirilmesi lazım o kodun zaman bulup bakamıyorum. CCS C ile yazdım ben size
Yapılacak çok şey var

3ddark

http://www.hemenpaylas.com/download/547672/lcd_menu.rar.html

dosya yukarıdaki adreste ben upload ettim ama kaynak kodu yok orda sadece proteus ve hex dosyası vardır
Yapılacak çok şey var

bluesea2005

Alıntı yapılan: "CoşkuN"Menü oluşturmak hakkında fazla bir kaynak bulamadım ve kendim el yordamıyla birşeyler yaptım.Similasyonda gayet güzel çalışıyor ama gerçek devrede sapıtıyor.Butonlara belli bir kere üst üste basınca alıp başını gidiyor ya da kitleniyor.
Yaptığım şey 4 bölümlü bir menü.Bir butonla menüler geziliyor,diğer iki butonda her menüye ait parametreyi artırıp azaltıyor.
Sorun neden kaynaklanıyor olabilir?
Ya da menü tasarımı için başka önerisi olan var mı?
#include <pic.h>
#include "delay.h"
#include "lcd.h"


void menu1(void);
void menu2(void);
void menu3(void);
void menu4(void);
unsigned char menu_deger1,menu_deger2,menu_deger3,menu_deger4,menu;
const char bas1[]={"MOTOR KONTROL"};
const char bas2[]={"COSKUN TASDEMiR"};
const char m1[]={"*****PWM******"};
const char m2[]={"*****MENU-2*****"};
const char m3[]={"*****MENU-3*****"};
const char m4[]={"*****MENU-4*****"};
const char a[]={"<-AZALT  ARTIR->"};
void main(void)

{
	TRISA=0x00;
	TRISB=0x00;
	TRISD=0x00;
	TRISC=0x00;

	PR2=0XFF; //PWM periyodu
	CCPR1L=0XFF;// PWM duty cycle
	CCP1CON=0X1C;
	T2CON=0X05;
	menu=0;
lcd_init(); //LCD'yi hazırla
lcd_puts(bas1);
lcd_goto(64);
lcd_puts(bas2);
DelayMs(255);
DelayMs(255);


lcd_clear();
//Sonsuz döngü
while(1){
if(menu==1) menu1();	
if(menu==2) menu2();	
if(menu==3) menu3();	
if(menu==4) menu4();	
if(RD4==0) 
	{
	DelayMs(200);
	menu++;
	}


/*	if(RD1==0)
	{
	DelayMs(200);
	CCPR1L=	CCPR1L+1;
	}
	if(RD0==0)
	{
	DelayMs(200);
	CCPR1L=	CCPR1L-1;
/	}
lcd_goto(4);
lcd_dec_byte(CCPR1L);
lcd_goto(69);
lcd_dec_byte(CCPR1H);


	}*/

}
}


void menu1(void){
lcd_clear();
lcd_puts(m1);
lcd_goto(64);
lcd_puts(a);

while(1)	{ //menü sonsuz döngüsü


	if(RD0==0){ //azalt
		while(RD0==0);
			DelayMs(100);
			if(menu_deger1!=0)//sıfıra geldiyse
//			CCPR1L--;
			menu_deger1--;
		lcd_goto(64);
		lcd_dec_byte(menu_deger1);
				}

	if(RD1==0){ //artır
			while(RD1==0);
			DelayMs(100);
			if(menu_deger1!=255)//sınıra geldiyse
//		CCPR1L++;
		menu_deger1++;
		lcd_clear();

		lcd_puts(m1);
		lcd_goto(64);
		lcd_dec_byte(menu_deger1);
				}

	if(RD4==0){ //menu atla
 	while(RD4==0);
		DelayMs(100);
		menu=2;
		break;
		}
}
//end while
return;
}//end menu1


void menu2(void){
lcd_clear();
lcd_puts(m2);
lcd_goto(64);
lcd_puts(a);

			while(1){ //menü sonsuz döngüsü
					
	if(RD0==0){ //azalt
				while(RD0==0);
				DelayMs(100);
				if(menu_deger2!=0)//sıfıra geldiyse
				menu_deger2--;
				lcd_puts(m2);
				lcd_goto(64);
				lcd_dec_byte(menu_deger2);
				}
	if(RD1==0){ //artır
			while(RD1==0);
			DelayMs(100);
				if(menu_deger2!=255)//sınıra geldiyse
				menu_deger2++;
				lcd_puts(m2);
				lcd_goto(64);
				lcd_dec_byte(menu_deger2);
				}
	if(RD4==0){ //menu atla
			while(RD4==0);
			DelayMs(100);
			menu=3;
			break;
			}

}
//while son
return;
}//menu2 sonu

void menu3(void){
lcd_clear();
lcd_puts(m3);
lcd_goto(64);
lcd_puts(a);

			while(1){ //menü sonsuz döngüsü
	if(RD0==0){ //azalt
	while(RD0==0);
			DelayMs(100);
			if((--menu_deger3)==0)//sıfıra geldiyse
			menu_deger3=0;
			lcd_puts(m3);
			lcd_goto(64);
			lcd_dec_byte(menu_deger3);
	}

	if(RD1==0){ //artır
		while(RD1==0);
		DelayMs(100);
			if((--menu_deger3)==255)//sınıra geldiyse
			menu_deger3=255;
			lcd_puts(m3);	
			lcd_goto(64);
			lcd_dec_byte(menu_deger3);
		}

	if(RD4==0){ //menu atla
		while(RD4==0);
			DelayMs(100);
			menu=4;
			break;
		}

}
//end while
return;
}//menu3 sonu

void menu4(void){
lcd_clear();
lcd_puts(m4);
lcd_goto(64);
lcd_puts(a);
			
			while(1){ //menü sonsuz döngüsü
			if(RD0==0){ //azalt
			while(RD0==0);
		DelayMs(100);
		if((--menu_deger4)==0)//sıfıra geldiyse
menu_deger4=0;
lcd_puts(m4);
lcd_goto(64);
lcd_dec_byte(menu_deger4);
}
if(RD1==0){ //artır
			while(RD1==0);
			DelayMs(100);
if((++menu_deger4)==255)//sınıra geldiyse
menu_deger4=255;
lcd_puts(m4);
lcd_goto(64);
lcd_dec_byte(menu_deger4);
}
if(RD4==0){ //menu atla
	while(RD4==0);
DelayMs(100);
menu=0;
lcd_clear();
break;
}
}
//end while
return;
}//menu4 sonu

arkadasım verdigin kod hi-tide picc 9.5 de derlenmiyor hata veriyor sanırım lcd_dec_byte(..) komutundan kaynaklanıyor....

birde bir degiskenin icerigini rakam olarak (h-tech picc 9.5 kullanıyorum) lcd ye nasıl gönderebilirim yardımcı olabilirseniz sevinirim.

(lcd.h lcd.c dosyalarını include dosyasına attım)

3ddark

İstersen birde donanımdan meseleyi çözmeyi dene senin koda bakacak zamanım yok ama butonlara parazit önleyici kondansatör koy 330 pf koy öyle dene eger kodun dogru ise sorun olmaması lazım kond yoksa butonlarda her basmada parazit oluşur ve birden çok kez başmış olacak algılar. Benim verdigim kod çalışıyor simülasyonda ve uygulamadada çalışıyor.
Yapılacak çok şey var

bluesea2005

Alıntı yapılan: "3ddark"İstersen birde donanımdan meseleyi çözmeyi dene senin koda bakacak zamanım yok ama butonlara parazit önleyici kondansatör koy 330 pf koy öyle dene eger kodun dogru ise sorun olmaması lazım kond yoksa butonlarda her basmada parazit oluşur ve birden çok kez başmış olacak algılar. Benim verdigim kod çalışıyor simülasyonda ve uygulamadada çalışıyor.

arkadasım ilgilendigin icin tsk ederim ama ben sorum kodun ustunde deıl altında yazmısdım senın okudugun kısım alıntı kısmı...

birde upload ettigin link hemenpaylasdan silinmis tekrar upload edebilirmisin?

tskler..

deserteagle

Alıntı yapılan: "3ddark"İstersen birde donanımdan meseleyi çözmeyi dene senin koda bakacak zamanım yok ama butonlara parazit önleyici kondansatör koy 330 pf koy öyle dene eger kodun dogru ise sorun olmaması lazım kond yoksa butonlarda her basmada parazit oluşur ve birden çok kez başmış olacak algılar. Benim verdigim kod çalışıyor simülasyonda ve uygulamadada çalışıyor.

sayın coşkun  hocam gibi  bende bu şekilde bir menü oluşturmuştum ama simülasyonda çalışıyor fakat devrede çalışmıyor.mesela elektriğini verince bir çalışıyor bir hiç görüntü gelmiyor ve butonlarda senin dediğin gibi aksaklıklar oluşuyor.sayın hocalarım acaba bu tuşa kondansatör serimi yoksa paralelmi bglanacak. bir soruyum dedim çünkü daha önce hiç bu şekilde bir uygulamayla karşılaşmadım acemilik işte.birde bu elektrik verince bazen devre hiç çalımıyor reset botonu ekledim o bile pice reset leyemyor.acaba nedendir.
saygılarımla

3ddark

Arkadaşlar kusura bakmayın çalıştıgım için pek zamanım olmuyor ama en kısa zamanda bir ufak menü uygulamasının css için yazılmış kodunu ve şemasının linki koyacagım buraya. Bu arada kond paralel baglanır butona.
Kolay gelsin herkeze
Yapılacak çok şey var

3ddark

Eskinden yazdıgım kodu buldum nereye upload edeyim ufak bir dosya

http://www.fupload.com/download.php?file_id=hvw025xmt3d8yjrq4csg

buraya upload ettim isteyen bakabilir kodları biraz karısık yazdım yani düzenlenmesi lazım ama çalışıyor su hali ile
Yapılacak çok şey var