Keypad___C__ve PIC

Başlatan Cetinal, 14 Kasım 2006, 19:39:38

Cetinal

slm arkadaşlar
aşagıdaki resimdeki buton takımını pic ile kontrolü naslı yapılabilir
mesela bu buton takımından 7 segment display,,lcd  v.b. kontrol edecegiz
C ile nasıl yapabiliriz Bana bunun mantıgı lazım

XX_CİHAN_XX

Mantığını anlatmaya çalışayım arkadaşım.
sutunlardan tarama yaparak satırlardan verı okuyabılırsın.
ornegın sutunlar b1,b2,b3 e baglansın.
satırlar ıse b4,b5,b6,b7 ye baglansın.
b1,b2,b3 cıkıs, b4---b7 giriş şeklinde programını açmalısın ve yazılımsal olarak pull up aktıf edılmelıdır(yada donanımsal olarak)
port_b_pullups(TRUE);

bu noktadan sonrası tara ve oku mantıgı olacak.okumayı manuel yapabılecegın gıbı b4----b7 yı kullandıgın taktırde portb change kesmesı ılede bır tusa basıldıgında anında ınterruptla otomatık okuma da yaptırabılırsın.tus okumanın temel mantıgı b1,b2,b3 normalde lojık 1 de tutulacak.hızlı bır sekılde tarama yaparak sıra ıle okuyacagın stunu lojık 0 a cekeceksın.ornegın b1 butonunu algılayabılmen ıcın portb1 lojık 0 (b2,b3 lojık 1de)yaptıgında b1 butonuna basılırsa portb,4 lojık 0 dıgerlerı lojık 1 olucaktır.bu sekılde b1 e basıldıgı anlasılır.eger rb4 degılde rb5 lojık 0 a dusseydı bu durumda 1. buton degıl 4. butona basılmıs olur.Bu sekılde hangı butona basıldıgı tespıt edılır.ve tarama -sorgu dongusu sureklı olusturulmalıdır.Her seferınde gırıslerı tek tek sormak yerıne rb change kesmesını kullanarak taramadan sonrakı herhangı bır gırıs "0"a dustu mu dıye devam lı sormana gerek kalmaz (cunku sıfıra dustugu anda kesme otomatık olusacaktır)kesmesız kullanacaksanda dedıgım gıbı devamlı stunlardan tarayıp satırlardan da gırıslerı sorarak hangı butna basıldıgını tespıt edıceksın.
Kolay gelsın...
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Cetinal

ilgin için sağol dostum da bu verdigin kod basic kodumu C kodumu
kolay gelsin

XX_CİHAN_XX

Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

arslan74

Merhaba,

Sana kendi yazdığım kodu veriyorum bu kod sorunsuz çalışıyor. Ayrıca her tuşa basmada tuş sesi veriyor. Arkadaşın dediği gibi, okuma portlarında pullup olmalı, ayrıca bilgi gönderme portlarını direkt bağlama, emniyet için araya 100ohm direnc bağla. RB4-RB7 arası okuma yapiyor. RB0-RB3 bilgi önderiyor.

Selamlar.


#define	BOS 	20
#define	BASIK 	21


enum DUS_DURUM { Tus1=10,Tus2=0,Tus3=11,Tus4=12,Tus5=7,Tus6=8,Tus7=9,Tus8=13, Tus9=4,
				 Tus10=5,Tus11=6,Tus12=14,Tus13=1,Tus14=2,Tus15=3,Tus16=15 };

static unsigned char set, read;


unsigned char 
tus_kontrol(void){
	
	PORTB = 0b11111110;
	
		if (!ROW1 && set){		//
			buzzer_beep();
			return Tus1;
		}
		if (!ROW2 && set){		//
			buzzer_beep();
			return Tus2;
		}
		if (!ROW3 && set){		//
			buzzer_beep();
			return Tus3;
		}
		if (!ROW4 && set){	
			buzzer_beep();
			return Tus4;
		}
					
	PORTB = 0b11111101;
	
		if (!ROW1 && set){	
			buzzer_beep();
			return Tus5;
		}
		if (!ROW2 && set){	
			buzzer_beep();
			return Tus6;
		}
		if (!ROW3 && set){	
			buzzer_beep();
			return Tus7;
		}
		if (!ROW4 && set){	
			buzzer_beep();
			return Tus8;
		}
					
	PORTB = 0b11111011;
	
		if (!ROW1 && set){	
			buzzer_beep();
			return Tus9;
		}
		if (!ROW2 && set){	
			buzzer_beep();
			return Tus10;
		}
		if (!ROW3 && set){	
			buzzer_beep();
			return Tus11;
		}
		if (!ROW4 && set){	
			buzzer_beep();
			return Tus12;
		}
					
	PORTB = 0b11110111;
	
		if (!ROW1 && set){	
			buzzer_beep();
			return Tus13;
		}
		if (!ROW2 && set){	
			buzzer_beep();
			return Tus14;
		}
		if (!ROW3 && set){	
			buzzer_beep();
			return Tus15;
		}
		if (!ROW4 && set){	
			buzzer_beep();
			return Tus16;
		}
		
	PORTB = 0b11110000;
	read = ~PORTB;
	read >>= 4;
	read &= 0b00001111;

		if(!read){
			DelayMs(20);
			set = 1;
			return BASIK;
		}
		else
			return BOS;
}



void buzzer_beep (void){
	
	set=0;	// tusa basılmış.

	BUZZER = 0;	// ac
	DelayMs(20);
	BUZZER = 1;	// kapa
}

Cetinal

yardımlarınız için teşekkürler dostlarım
verdiginiz bilgileri kullanmayı deniyeyim
kolay gelsin
iyi çalışmalar :roll: