Adsız Nümerik (rakamlardan oluşan) tuş takımları, güvenlik sistemlerinden cep telefonlarına kadar pek çok alanda kullanılmaktadırlar. Bu yazımızda MikroC Pro for PIC derleyicilerinde bulunan keypad kütüphanesinin nasıl kullanıldığını anlatmaya çalışacağız. Öncelikle keypad kütüphanesinde bulunan komutları inceleyelim. Bu komutlar :

  • Keypad_Init
  • Keypad_Key_Press
  • Keypad_Key_Click

komutlarıdır.  Keypad_init komutu tuş takımını kullanıma hazırlar, keypad_key_kepress komutu herhangi bir tuşa basıldığında tuşun değerini algılar, keypad_key_click komutu ise herhangi bir tuşa basılıp bırakıldığında basılan tuşun değerini algılar. Komutların işlevlerini açıkladık. Şimdi tuş takımlarının iç yapılarına göz atalım;

Adsız

Resimden görüldüğü gibi tuş takımın bağlantı uçları satır ve sütunlardan oluşmaktadır.  Resimdeki tuş takımı 4×4’lük bir tuş takımıdır. Piyasada pek çok farklı tuş takımı bulunmaktadır. MikroC keypad kütüphanesi 4×1,4×2,4×3 ve 4×4 tuş takımlarını desteklemektedir.  Ben bu yazıda 4×3’lük bir tuş takımı kullanarak şifre girilen ve eğer şifre doğruysa röleyi çeken bir uygulama üzerinde duracağım. Devre gerçek ortamda denenmemiştir, simülasyonda çalışmaktadır. Devresi de yapılırsa çalışmaması için herhangi bir sebep yok tabiki.. Lafı fazla uzatmadan devre şemamıza bir göz atalım.

Adsız

Resmi büyük görmek için tıklayın…

Kodları da devre şemasının hemen arkasına ekleyelim;

// LCD bağlantıları
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

char sifre[4],i=0,j=7,kp=0;
const char pass[5]="2345"; // şifre 2345 olarak belirlendi.
char  keypadPort at PORTC; // tuştakımı PORTC'ye bağlanacak.

void main() {
trisb.f7=0;
portb.f7=0;

Keypad_Init();                           // Keypadi kur.
Lcd_Init();                              // LCD'yi kur.
Lcd_Cmd(_LCD_CLEAR);                     // LCD'yi temizle
Lcd_Cmd(_LCD_CURSOR_OFF);                // İmleci kapat.
Lcd_out(1,1,"Sifreyi Giriniz:");
lcd_out(2,7,"____");
while(1)
{
kp=0;
while(kp==0)// Herhangi bir tuşa basılmazken sürekli tuşları tarayan altprogram.
{
kp=Keypad_Key_Click();//tuştakımna basılınca değeri al.
delay_ms(10);// 10ms'lik gecikme şart.
}

switch (kp) {// ASCII dönüşümü yapılıyor.(Mesela 1 karakterine denk gelen ASCII kod 49'dur.)
case  1: kp = 49; break; // 1
case  2: kp = 50; break; // 2
case  3: kp = 51; break; // 3
//case  4: kp = 65; break; // A //4x4 keypad kullanıldığında bu kısımlar da koda dahil edilebilir.
case  5: kp = 52; break; // 4
case  6: kp = 53; break; // 5
case  7: kp = 54; break; // 6
//case  8: kp = 66; break; // B
case  9: kp = 55; break; // 7
case 10: kp = 56; break; // 8
case 11: kp = 57; break; // 9
//case 12: kp = 67; break; // C
case 13: kp = 42; break; // *
case 14: kp = 48; break; // 0
case 15: kp = 35; break; // #
//case 16: kp = 68; break; // D
}
lcd_chr(2,j,'*');
j++;
if(j==11)j=7;
sifre[i]=kp;
i++;
if(i==4)
{
i=0;
if(sifre[0]==pass[0] && sifre[1]==pass[1] && sifre[2]==pass[2] && sifre[3]==pass[3]) // Şifre doğruysa 10 saniye boyunca röleyi çektir...
{
portb.f7=1;
lcd_cmd(1),
lcd_out(1,1,"Sifre Dogru!");
delay_ms(10000);
Lcd_out(1,1,"Sifreyi Giriniz:");
lcd_out(2,7,"____");
portb.f7=0;
}
else               // Şire yanlışsa tekrar şifre girilmesini iste...
{
Lcd_Cmd(1);
Lcd_Out(1,1,"Sifre Yanlis!");
portb.f7=0;
delay_ms(2000);
Lcd_out(1,1,"Sifreyi Giriniz:");
lcd_out(2,7,"____");
}
}
}
}

Projemizde 4MHz hızında çalışan bir 16f876A kullandık. Devremiz ilk çalıştığında bizden daha önceden belirlemiş olduğumuz şifreyi girmemizi istemektedir. Şifreyi kod yazımı esnasında pass değişkenine “2345” olarak yazdık.  Eğer girdiğimiz 4 basamaklı şifremiz belirlediğimiz şifre ile aynı ise röle 10 saniye boyunca çekmektedir. Eğer yanlış ise şifreyi tekrardan girmemiz istenmektedir. Program daha kolay anlaşılabilmesi için basit tutulmuştur. Dikkat edilmesi gereken nokta switch-case ifadesinin içerisinde yapılan dönüşümdür. Burada keypadden gelen 1,2,3,4,5,6,7,8,9 gibi değerler ascii karşılıklarına dönüştürülmektedir. İstenilirse farklı algoritmalar kullanılarak ascii dönüşümü yapılmaya da bilir.

Dikkat edilmesi gereken diğer bir konu da tuş takımının bağlantısıdır. sütunlar sırası ile PORTC’nin 0,1,2ve 3 numaralı pinlerine, satırlar ise sırası ile  PORTC’nin  4,5,6 ve 7. pinlerine bağlanmalıdır. Biz 4×3 tuş takımı kullandığımızdan 4. sütun yoktur ve bu sebeple PORTC’nin 3. pini boş bırakılmıştır. Tuş takımının hangi porta bağlanacağı ise  “char  keypadPort at PORTC;” satırı ile belirlenmiştir.

Uygulama ile ilgili bütün  dosyalara buradan ulaşılabilir.

İyi çalışmalar.

yorum
  1. Onur dedi ki:

    Hocam, devrenin gerçekte sağlıklı çalışabilmesi için, BC547 Collector ucu ile rölenin 5V’luk bobin gerilimi arasına paralel 1 diyot (1N4001 gibi) koymanız gerekli.

  2. abdullah orduyılmaz dedi ki:

    burada ascii karakterleri nereden biliyoruz

    • mikrodunya dedi ki:

      ASCII karakterler standarttır. Google’da aratırsanız ASCII karakter tablosuna ulaşabilirsiniz.
      MEsela “1” karakterinin sayısal karşılığı 49’dur.

  3. abdullah orduyılmaz dedi ki:

    teşekkür ederim beni aydınlattınız. bir sorum daha olucak klavyeden girilen bir karakteridemi aynı mantıkla işleyeceğiz.

  4. Hamza dedi ki:

    J1 HATA VERİYOR

    • m3 dedi ki:

      J1 uzerine sag tiklayip exclude from simulation secenegine tik koyarak devre disi birakabilirsiniz simuladyonda.

  5. alperen dedi ki:

    hocam unutlan diyodu tam olarak nereye koyacagımı anlayamadım? şekil üzerinde gösterme şansınız varmıdır acaba? alp_eren_999@hotmail.com bu maile fotograf üzerinde gösterip atabilirmisiniz hocam

  6. atacan97 dedi ki:

    Tebrik ederim güzel bir yazı olmuş ellerine sağlık.Fakat aklıma takıldı gerçek Keypadlerde neden 8 pin varken isisde 7 pin var. Gerçekteki keypadin bağlanışı nasıl olmalı ?

  7. Elif dedi ki:

    İyi günler,yazınız için teşekkürler..Benim sorum keypad ile step motoru adım adım sağa ya da sola istediğim adım kadar döndürmek fakat hiçbiryerde buna benzer bir örnek bulamıyorum tuş takımı ile motorumu switch case le yönlendircem fakat en başta tam olarak nasıl komut gireceğimi bilemiyorum,yardımcı olursanız sevinirim..Şimdiden teşekkürler…

    • mikrodunya dedi ki:

      Keypad ile ilgili ve step motor ile ilgili yazılarımı okuduktan sonra yapabilmeniz lazım. Mesela adım sayısını girip ‘#’ tuşuna bastıktan sonra step motoru döndürebilirsiniz.

  8. melikeser dedi ki:

    merhaba benim proje ödevim var ve 6×6 keypad kullanmam gerekiyor. butonların bağlantılarını yaptım ama kodda nasıl harf tanımlatacağımı anlamadım. keypadden bastığım tuşun lcd de yazması gerekiyor yardımcı olabilir misiniz bitirme projem bir an önce yapmam gerekiyor 😦

  9. melikeser dedi ki:

    6×6 keypad ile lcd ye yazı yazan c kodu rica ediyorum ve proteus çizimi çünkü 12 bağlantı bacağı olacağından dolayı hangi port a bağalayacağımı anlayamadım satır ve sütun bağlantılarını. 1 aydır araştırıyorum bulamadım yardımcı olursanız çok sevinirim gerçekten okulu bitirmem için bu ödevi yapmak zorundayım bir an önce

    • mikrodunya dedi ki:

      Siz nerede takıldığınızı nokta atışı gösterirseniz yardımcı olayım. Kodun tamamını hazır olarak vermeyeceğim.
      Eğer isterseniz kodunuzu şemanızı ve devrenizi ücret karşılığı yaparım.

  10. melikeser dedi ki:

    (pic16f877 kullanmam gerekiyor)

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s