1 Star2 Stars3 Stars4 Stars5 Stars (1 votes, average: 5 out of 5)
Loading ... Loading ...
Tem
23rd

CCS C Dersleri Keypad Kullanımı

sckp1.JPG

Keypad ile ilgili tanımlamalar buradan Serdar Çiçek’in kitabından alıntıdır.

TUŞ TAKIMI (KEYPAD) HAKKINDA BİLGİ

Kontrol sistemlerinde dış dünyadan insanlar tarafından veri girişleri genellikle tuş takımı (keypad-klavye) ile yapılır. Tuş takımı butonlarla gerçekleştirilebileceği gibi çeşitli hazır tuş takımları piyasada bulunmaktadır. Tuş takımı isimlendirmelerinde ilk sayı sütun, ikinci sayı ise satır sayısını belirtir. Örneğin 4×3’lük bir keypad, 4 sütun ve 3 satırdır.

sckp2.JPG

Tuş takımında hangi tuşa basıldığını bulmak için çeşitli yöntemler kullanılabilir. Bu yöntemlerden biri tarama yöntemidir. Şekil-12.3.’de butonlarla yapılmış 4×4 tuş takımı görülmektedir. Butonların bir ucu satır kısmına, bir ucu da sütun kısmına bağlıdır. Denetleyici ile tarama yapılırken satırlar çıkış, sütunlar ise giriş olarak tanımlanır.

 

Sütunlarda hep lojik-0 (GND-şase) vardır. Hangi tuşa basıldığını anlamak için önce satırlardan biri lojik-1 diğerleri lojik-0 yapılır. Sonra sütunlar okunur, hangi giriş lojik-1 ise o satıra ait sütundaki tuşa basılmış demektir. İstenen tuşa hangi değerin verileceği programcıya aittir. Şekil-12.3’teki bağlantıda 1. satır lojik-1 diğer satırlar lojik-0 iken, 1.satırda 3 nolu tuşa basıldığında 3.sütunda lojik-1 bilgisi okunur. Böylece basılan tuş bulunabilir. Tabi ki 1.satırda değil de diğer satırlardaki tuşlara basılmışsa algılama yapılamaz. Bu nedenle 1.satırdan sonra sıra ile bir satır lojik-1, diğer satırlar lojik-0 yapılarak tüm sütunlar okunur. Bahsedilen tarama işlemi bu şekilde yapılmaktadır. Tablo-12.1’de, Şekil-12.3’teki tuş takımına göre uyarlanmış tarama bilgileri verilmiştir.

sckp4.JPG

Butona basıldığında ve bırakıldığında bir ark (parazit) meydana gelir. Buna tuş sıçraması da (key debounce) denilir. Şekil-12.4’te örnek bir tuş sıçraması görülmektedir. Bu sıçramayı önlemek için programda gerekli önlemler alınmalıdır. Tedbir olarak butona basıldıktan sonra 15-20 msn gecikme verilmesi gerekir veya butondan el çekilene kadar içinden çıkılmayacak bir döngü kurulmalıdır. Ayrıca tuş takımında aynı anda iki tuşa birden basılabilir. Bu gibi durumlarda hangi tuşun geçerli olacağı programla belirtilerek istenmeyen durumlar önlenmelidir.

sckp3.JPG

TUŞ TAKIMI UYGULAMASI-1

Bu uygulamada butonlarla yapılmış 4×4 bir tuş takımı uygulaması yapılmıştır. Tuş takımı D port’una bağlanmıştır. B port’unda RB0, RB1, RB2 ve RB3 pin’lerine LED bağlanmıştır. Tuş takımından basılan tuşların ikili karşılıkları LED’lerde gösterilmektedir. Tuş takımı için programda bir fonksiyon yazılmıştır. Programda tuş takımında bir tuşa basıldıktan sonra tuşun değeri B port’una bağlı LED’lerde görünecektir.

Programda her satır sırayla lojik-1 yapılmış ve ardından sütun girişleri kontrol edilmiştir. Hangi sütun lojik-1 ise o sütundaki butona basılmış demektir. Örneğin 2. satır lojik-1 yapıldığında, 2. sütun girişi lojik-1 ise demek ki 5 tuşuna basılmış demektir. Programda yapılan fonksiyonda tarama sonucu basılan tuş değeri “tus” değişkenine aktarılmıştır. “tus” değişkeni kullanılarak elde edilen sonuç istenen şekilde kullanılır. Tuş takımında birden fazla tuşa basılması için gerekli önlem alınmamıştır. İstenirse bu gibi durumlarda basılan en son tuşun geçerli olması veya ilk basılan tuştan el kalkana kadar, diğer basılan tuşların geçerli olmaması sağlanabilir. İstenen amaca göre program değiştirilebilir.

sckp5.JPG

/******************************************************
PIC16F877 ile Tuş Takımı Uygulaması-1
PIC PROG/DEKA     : Port B jumper'ı LED konumunda olmalı
*******************************************************/
#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(b) //Port yönlendirme komutları B portu için geçerli
#use fast_io(d) //Port yönlendirme komutları C portu için geçerli

#byte   portb=0×06   // B portu “tus” ismine eşitleniyor.

#define sut1   pin_d0 // sut1 ifadesi pin_d0 ifadesine eşitleniyor
#define sut2   pin_d1 // sut2 ifadesi pin_d1 ifadesine eşitleniyor
#define sut3   pin_d2 // sut3 ifadesi pin_d2 ifadesine eşitleniyor
#define sut4   pin_d3 // sut3 ifadesi pin_d2 ifadesine eşitleniyor

#define sat1   pin_d4 // sat1 ifadesi pin_d4 ifadesine eşitleniyor
#define sat2   pin_d5 // sat2 ifadesi pin_d5 ifadesine eşitleniyor
#define sat3   pin_d6 // sat3 ifadesi pin_d6 ifadesine eşitleniyor
#define sat4   pin_d7 // sat4 ifadesi pin_d7 ifadesine eşitleniyor

char tus=0; // karakter tipinde değişken tanımlanıyor

//*********** Keypad Tarama Fonksiyonu *********
char keypad_oku() // Fonksiyon ismi
{
output_d(0×00); // D portu çıkışı sıfırlanıyor

output_high(sat1); // 1. satır lojik-1 yapılıyor
if (input(sut1))   // 1. sütun okunuyor
{ delay_ms(20); tus=1; }
if (input(sut2))   // 2. sütun okunuyor
{ delay_ms(20); tus=2; }
if (input(sut3))   // 3. sütun okunuyor
{ delay_ms(20); tus=3; }
if (input(sut4))   // 4. sütun okunuyor
{ delay_ms(20); tus=0xA; }
output_low(sat1); // 1. satır lojik-0 yapılıyor

output_high(sat2); // 2. satır lojik-1 yapılıyor
if (input(sut1))   // 1. sütun okunuyor
{ delay_ms(20); tus=4; }
if (input(sut2))   // 2. sütun okunuyor
{ delay_ms(20); tus=5; }
if (input(sut3))   // 3. sütun okunuyor
{ delay_ms(20); tus=6; }
if (input(sut4))   // 4. sütun okunuyor
{ delay_ms(20); tus=0xB; }
output_low(sat2); // 2. satır lojik-0 yapılıyor

output_high(sat3); // 3. satır lojik-1 yapılıyor
if (input(sut1))   // 1. sütun okunuyor
{ delay_ms(20); tus=7; }
if (input(sut2))   // 2. sütun okunuyor
{ delay_ms(20); tus=8; }
if (input(sut3))   // 3. sütun okunuyor
{ delay_ms(20); tus=9; }
if (input(sut4))   // 4. sütun okunuyor
{delay_ms(20); tus=0×0C; }
output_low(sat3); // 3. satır lojik-0 yapılıyor

output_high(sat4); // 3. satır lojik-1 yapılıyor
if (input(sut1))   // 1. sütun okunuyor
{ delay_ms(20); tus=0xE; }
if (input(sut2))   // 2. sütun okunuyor
{ delay_ms(20); tus=0; }
if (input(sut3))   // 3. sütun okunuyor
{ delay_ms(20); tus=0xF; }
if (input(sut4))   // 4. sütun okunuyor
{delay_ms(20); tus=0xD; }
output_low(sat4); // 3. satır lojik-0 yapılıyor

return tus; // Fonksiyon “tus” değeri ile geri döner
}

/********* ANA PROGRAM FONKSİYONU********/

void main ( )
{
setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
setup_adc(ADC_OFF);             // ADC birimi devre dışı

set_tris_b(0×00);   // B portu komple çıkış
set_tris_d(0×0F);   // Yüksek değerlikli 4 bit çıkış, düşük değerlikli 4 bit giriş

output_b(0×00); // İlk anda B portu çıkışı sıfırlanıyor

while(1)  // Sonsuz döngü
{
portb=keypad_oku();  // Basılan tuş değerini B portuna aktar
}
}

Programda #byte portb=0×06 komutu ile B port’unun adresi (0×06) “portb” ifadesine eşitlenmiştir. Yani bu komuttan sonra artık “portb” ifadesi direkt olarak B port’u değerini temsil etmektedir. Programda #define sut1 pin_d0 komutu ile “sut1” ifadesi pin_d0’a yani RD0 pin’ine eşitlenmiştir. Diğer sütun ve satır ifadeleri de D port’unun ilgili pin’lerine aynı şekilde eşitlenmiştir. char tus=0; komutu ile karakter tipinde “tus” isminde değişken tanımlanmış ve ilk değer olarak sıfır (0) verilmiştir. Tuş takımı tarama fonksiyonu olarak char keypad_oku() komutu ile keypad_oku() isminde fonksiyon tanımlanmıştır. Fonksiyonun başındaki “char” ifadesi, fonksiyonun geri dönüş değeri olduğunu ve bu değerin karakter tipinde olduğunu belirtir. Fonksiyonda ilk başta output_d(0×00); komutu ile D port’una bağlı sütunların hepsi lojik-0 yapılmıştır. Daha sonra output_high(sat1); komutuyla sırayla her satır lojik-1 yapılmış ve if (input(sut1)) komutu ile de sütun girişleri okunmuştur. Eğer sütun girişi “1” olursa if fonksiyonu döngüsü işlem görecektir. if fonksiyonu içinde, delay_ms(20); komutu ile tuş hatalarını önlemek için bir gecikme konulmuş ve ardından tus=1; komutu ile de basılan tuş değeri “tus” değişkenine aktarılmıştır. Burada tus= ifadesine istenen değer yazılarak hangi tuşun neye karşılık geleceği istenen şekilde değiştirilir. İlk satırda 4 sütunun taraması aynı mantıkla yapıldıktan sonra output_low(sat1); komutu ile 1. satır lojik-0 yapılmıştır. Daha sonra aynı işlemler diğer satırlar için yapılmıştır. Fonksiyonda en son olarak da return tus; komutu ile fonksiyonun “tus” değişkeni değeri ile geri dönmesi sağlanmıştır.

Dikkat edilmesi gereken bir nokta da, fonksiyon bir geri dönüş değeri içerdiğinden fonksiyon tanımlarken char sutun_tara () komutunda başta “char” kısmı ile fonksiyonun geri dönüş değeri olduğunu ve türünün karakter olduğunu belirtmemizdir. Fonksiyonun geri dönüş değeri olmasaydı başına “void” koymamız gerekirdi. Ana fonksiyondaki sonsuz döngüde portb=keypad_oku(); komutu ile tuş takımı tarama fonksiyonu çağrılmış ve bu fonksiyonda tuş değerinin tutulduğu “tus” değişkeni değeri B port’una gönderilmiştir.

 

Gelelim bizim uygulamalara

keypad1.gif

Verilen örnekte dört adet push buton yer almakta. Burada butonlara herhangi bir görev atanmış değil burada yaptığımız sadece hangi butona basıldığını tespit ederek rs232 seri port ve proteusta yer alan virtual terminal yardımıyla bilgisayar ekranında görmek. Gerçek uygulamada hyperterminal yada serial port terminal progamını kullanabilirsiniz.

Devreye dikkat edecek olursanız dört buton yer almakta ama bütün butonlar sadece bir pine RA0 analog pine bağlı. Devrede butonlara bağlı gerilim bölücü dirençler ile her butonun oluşturduğu gerilim miktarı değişmekte. Program içerisinde bir diziye atanmış bu değerler ile herhangi bir butona basıldığında analog girişte okunan değer karşılaştırılarak hangi butona basıldığı belirleniyor.

Uygulama programında hangi butona basıldığının bulunması getkey() fonksiyonu yardımıyla bulunmaktadır. Kullanıcı tarafından basılan buton sonsuz döngüde çalışan getkey() fonksiyonu yardımıyla bulunmakta daha sonrada printf() fonksiyonu yardımıylada

Program:

#include <16F877.h>
#device ADC=10
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7)

enum KeyPad {Key1=0×1e0,Key2=0×1f0,Key3=0×210,Key4=0×220};
unsigned char getkey(void);

void main (void)
{
unsigned char Key=0;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);

while(1)
{
key=getkey();
if (key)
{
printf(”%u”,key);

}
delay_ms(100);

}
}

unsigned char getkey(void)
{
unsigned long m_KeyCode;
set_adc_channel(0);
m_KeyCode=read_adc() & 0×3f0;
switch(m_KeyCode)
{
case Key1:
return 1;
case Key2:
return 2;
case Key3:
return 3;
case Key4:
return 4;
default:

return 0;
}
} 

Aşağıdaki uygulamada ise 4×3 keyapad ile basılan tuş lcd ekranda gösterilir. * tuşuna basıldığında ise ekran temizlenir.

keypad43.JPG

Yazıdaki tüm örneklere ve daha fazlasına buradan ulaşabilirsiniz.

Şifre: ccspic.com

Benzer Yazılar

Yorum yapın