CCS C ile Tuş Takımı Uygulamaları

pr_01_37_max

 

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. 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.

Basılan tuşu LCD ekranda gösteren program

/******************************************************
 PIC16F877 ile Tuş Takımı ve LCD Uygulaması
PIC PROG/DEKA : Port B jumper'ı LCD 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ı B portu için geçerli

#define use_portb_lcd TRUE // LCD B portuna bağlı

#include <lcd.c> // lcd.c dosyası tanıtılıyor

#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(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=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=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=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_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_d(0x0F); // Yüksek değerlikli 4 bit çıkış, düşük değerlikli 4 bit giriş

 lcd_init(); // LCD hazırlanıyor

 printf(lcd_putc,"\fBasilan Tus="); // LCD'ye string yazdırılıyor

 while(1) // Sonsuz döngü
 {
 lcd_gotoxy(13,1); // İmleç 3.sütun, 1.satıra konumlandırılıyor

 if (keypad_oku()>9) // Eğer basılan tuş değeri 9'dan büyük ise
 printf(lcd_putc,"%d",keypad_oku()); // 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_oku()); // Tuş değeri LCD'ye yazdırılıyor
 }
}

Tuş Takımı Uygulamaları

Bu yazı CCS C Örnekleri kategorisine gönderilmiş ve , ile etiketlenmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.