PIC|ULAK PIC|ULAK ile Keypad Uygulaması By Sinan Sözügüzel Posted on 10 Mart 2016 10 min read 0 1 6,892 Paylaş ! Facebook Paylaş ! Twitter Paylaş ! Google+ Paylaş ! Reddit Paylaş ! Pinterest Paylaş ! Linkedin Paylaş ! Tumblr Merhaba Arkadaşlar, Bu yazımızda, MekatronikLAB firmasının üretmiş olduğu PIC mikrodenetleyiciler ile proje geliştirme kiti PIC|ULAK ile keypad(tuş takımı) uygulamasını gerçekleştirdik. Tuş takımı hakkında bilgi verecek olursak, 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. 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. 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. Butona basıldığında ve bırakıldığında bir ark (parazit) meydana gelir. Buna tuş sıçraması da (key debounce) denilir. Tuş sıçraması butona bir kez basıldığı halde butona birden fazla basılmış ve çekilmiş gibi durum yaratır.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. Malzemeler pic|ulak 4*10k direnç 4*330Ω direnç 4*4 keypad 4*20 lcd Bağlantı Şeması CCS C Kodları [php] #include <18f2550.h> #fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD #use delay (clock=4M) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor. #use fast_io(b) //Port yönlendirme komutları B portu için geçerli #define use_portb_lcd TRUE // LCD B portuna bağlı #include <lcd420.c> // lcd.c dosyası tanıtılıyor #define sut1 pin_a0 // sut1 ifadesi pin_d0 ifadesine eşitleniyor #define sut2 pin_a1 // sut2 ifadesi pin_d1 ifadesine eşitleniyor #define sut3 pin_a2 // sut3 ifadesi pin_d2 ifadesine eşitleniyor #define sut4 pin_a3 // sut3 ifadesi pin_d2 ifadesine eşitleniyor #define sat1 pin_c1 // sat1 ifadesi pin_d4 ifadesine eşitleniyor #define sat2 pin_c0 // sat2 ifadesi pin_d5 ifadesine eşitleniyor #define sat3 pin_a5 // sat3 ifadesi pin_d6 ifadesine eşitleniyor #define sat4 pin_a4 // sat4 ifadesi pin_d7 ifadesine eşitleniyor char tus=0; // karakter tipinde değişken tanımlanıyor //*********** Keypad Tarama Fonksiyonu ********* char keypad() // Fonksiyon ismi { output_a(0x00); // 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=0x0A; } 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=0x0B; } 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=0x0C; } 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=0x0F; } if (input(sut2)) // 2. sütun okunuyor { delay_ms(20); tus=0; } if (input(sut3)) // 3. sütun okunuyor { delay_ms(20); tus=0x0E; } 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_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(0x00); // B portu komple çıkış set_tris_a(0xF0); // Yüksek değerlikli 4 bit çıkış, düşük değerlikli 4 bit giriş lcd_init(); // LCD hazırlanıyor printf(lcd_putc,"\f PICULAK "); printf(lcd_putc,"\n KEYPAD UYGULAMASI "); printf(lcd_putc,"\n ROBOTURKA "); printf(lcd_putc,"\n MEKATRONIKLAB "); delay_ms(500); printf(lcd_putc,"\f BASILAN TUS=>"); // LCD’ye string yazdırılıyor printf(lcd_putc,"\n\n ROBOTURKA "); printf(lcd_putc,"\n MEKATRONIKLAB "); while(1) // Sonsuz döngü { lcd_gotoxy(14,1); if (keypad()>9) // Eğer basılan tuş değeri 9’dan büyük ise printf(lcd_putc,"%d",keypad()); // Tuş değeri LCD’ye yazdırılıyor else // Eğer basılan tuş değeri 9’dan büyük değilse printf(lcd_putc,"%d ",keypad());// Tuş değeri LCD’ye yazdırılıyor } } [/php] Devrenin Çalışma Videosu