BUTON KONTROLÜ PIC girişlerine bağlı botonlara basılıp
Transkript
BUTON KONTROLÜ PIC girişlerine bağlı botonlara basılıp
BUTON KONTROLÜ PULL-DOWN BAĞLANTI PULL-UP BAĞLANTI PIC girişlerine bağlı botonlara basılıp basılmadığını bilmez. Sadece o girişte “0” mı var “1” mi var onu bilir. Bağlantının türüne göre bu eşleştirmeyi sizin yapmanız gerekir. Pull-Down Bağlantı (Ters Bağlantı) Butona basılmadığında Giriş=1 Butona basıldığında Giriş=0 Pull-Up Bağlantı (Ters Bağlantı) Butona basılmadığında Giriş=0 Butona basıldığında Giriş=1 PROGRAM_1: PORTA’nın 0. bitine (RA0) bağlı butona basınca PORTB’ye bağlı tüm ledleri yakan program. (PORTB’yi temizlemeyi unutmayınız.) Pull-Up Bağlantıya göre void main() { trisb=0; portb=0; while(1) { if (porta.ra0==1) portb=0xFF; } } Pull-Down Bağlantıya göre … { if (porta.ra0==0) portb=0xFF; } } Program açıklama: Burada devre çalıştırıldığında LED sönük konumdadır. Butona basmadığımız sürece sönük konumda kalır. Butona bastığımızda ise LED yanar. Programda LED’leri söndürecek bir komut olmadığından LED’ler 1 kere yakıldığında bir daha sönmez. Butona basılıp LED’ler yakıldıktan sonra butona tekrar basmamız hiçbirşeyi değiştirmez. LED’ler hep yanık kalır. Eğer RESET butonu ile devreyi resetlersek program tekrar başlayacağından portb=0 komutu ile LED’ler söner ve biz butona basıncaya kadar sönük kalır. Bit tanımlaması yapmadaki farklılıklar if (porta.ra0==1) portb=0xFF; if (porta.f0==1) portb=0xFF; if (porta.b0==1) portb=0xFF; if (portb.rb0==1) portb=0xFF; if (portb.f0==1) portb=0xFF; if (portb.b0==1) portb=0xFF; Sayı Tanımlamaları Binary: porta.ra0=0b00101111; Hex: porta.ra0=0x2F; Decimal: porta.ra0=47; DEFINE ile BUTON TANIMLAMA PROGRAM_1: PORTA’nın 0. bitine (RA0) Pull-Up bağlı butona basınca PORTB’ye bağlı tüm ledleri yakan program. #define buton1 porta.b0 void main() { trisb=0; portb=0; while(1) { if (buton1==1) portb=0xFF; } } NOT: Programlamada DEFINE kullanmak kullanım kolaylığı açısından çok önemlidir. DEFINE program komutu değil, derleyici komutudur. MikroC Derleyici derleme sırasında DEFINE ile tanımlı her yeri kendi ismiyle değiştirerek derler. Yani programda “buton1” yazdığınız yere “porta.b0” yazarak programı derler. PROGRAM_2: PORTA’nın 0. Bitine (RA0) bağlı butona basınca PORTB’deki tüm ledleri yakan, PORTA’nın 1. bitine (RA1) bağlı butona basınca PORTB’deki ledleri 11001100 şeklinde yakan program. (Butonlar Pull-Down bağlı) RA0 a buton1 , RA1 e buton2 bağlanmıştır. #define buton1 porta.ra0 #define buton2 porta.ra1 void main() { trisb=0; portb=0; while(1) { if(buton1==0) portb=0xFF; if(buton2==0) portb=0xCC; } } Program açıklama: Devreye enerji verdiğimizde LED’ler sönük konumdadır. Butonlara basmadığımız sürece LED’ler sönük kalır. Buton1’e bastığımızda (11111111) şeklinde yanar ve diğer butona basılıncaya kadar bu şekilde yanık kalır. Buton2 ye basıldığında (11001100) şeklinde yanar ve diğer butona basılıncaya kadar bu şekilde yanık kalır. Program resetlenmedikçe LED’ler ya (11111111) şeklinde, ya (11001100) şeklinde yanar. Örneğin (11001100) şeklinde yanarken buton2’ye basılırsa LED’lerde bir değişiklik olmaz. Buton1’e bastığımızda (11111111) durumuna geçer. IF ve KOMUTLAR DİZİSİ PROGRAM_3: PORTA’nın 0. bitine (RA0) Pull-Up bağlı butona basılınca PORTB’deki tüm ledleri bir defa 1 sn. aralıklarla yakıp söndüren program. #define buton1 porta.ra0 void main() { trisb=0; portb=0; while(1) { if(buton1==1) { Bu parantezden sonraki komutlar IF içindeki İFADE doğru ise yapılacak. …. …. …. } …. …. } } Buraya PORTB deki Led’leri yakıp söndüren program kodları yazılacak. Bu paranteze kadar olan komutlar IF içindeki İFADE doğru ise yapılacak. Buradaki komutlar IF içindeki İFADE yanlış ise yapılacak. PROGRAM_3: PORTA’nın 0. bitine (RA0) Pull-Up bağlı butona basılınca PORTB’deki tüm ledleri bir defa 1 sn. yakan program. #define buton1 porta.ra0 void main() { trisb=0; portb=0; while(1) { if(buton1==1) { portb=0xFF; delay_ms(1000); portb=0; } } } Program açıklama: Devreye enerji verildiğinde LED’ler sönük konumdadır. Buton’a bastığımızda LED’ler 1 sn. yanar ve söner ve sönük konumda kalır. Butona tekrar basıldığında 1 sn. LED’ler tekrar yanar ve söner. Burada dikkat edilmesi gereken konu şudur: Diyelimki butona bastık ve LED’ler yanıyor. LED’ler yanıyor iken butona tekrar basmak hiçbirşey ifade etmez çünkü butonun etkisinin olabilmesi için butona basıldığı anda buton kontrolü yapan “if(buton1==1)” komutundan programın geçmesi gerekir. Burada süre kısa olduğundan (1 sn.) bunun fazla önemi yoktur ama süre 5 sn. olsa idi “delay_ms(5000);” bu bekleme sırasında buton kontrol komutu çalışmayacağından butona basmanın bir anlamı olmayacaktır. SORU: Program3 için yazdığımız kodları aşağıdaki gibi değiştirirsek programın çalışması nasıl değişir? #define buton1 porta.ra0 void main() { trisb=0; portb=0; while(1) { if(buton1==1) { portb=0xFF; delay_ms(1000); portb=0; portb=0x00; } } } IF İçersindeki İfadenin 2 Tane Olması Durumu PROGRAM_4: PORTA’nın 0. ve 1. bitlerine bağlı butonlara aynı anda basıldığında PORTB’ye bağlı tüm ledleri yakan program. (Butonlar Pull-Up bağlı) #define buton1 porta.ra0 #define buton2 porta.ra1 void main() { trisb=0; portb=0; while(1) { if(buton1==1 && buton2==1) portb=0xFF; } } IF İfadeleri İçin Operatörler == != < > <= >= Eşittir. Eşit değildir. Küçüktür. Büyüktür. Küçük eşittir. Büyük eşittir. && VE işlemi || VEYA işlemi ! DEĞİL işlemi Örnekler if( buton1==0 && buton2==0) …. : Her 2 buton “0” olduğunda ifade doğru olur. Yani eğer butonlar Pull-Down bağlı ise her 2 butona basıldığında ifade doğru olur. if( buton1==0 || buton2==0) …. : Butonlardan herhangi biri “0” olduğunda ifade doğru olur. Yani eğer butonlar Pull-Down bağlı ise butonlardan herhangi birine basıldığında ifade doğru olur. Butonlardan ikisinede basılması (yani ikisininde “0” olması durumunda) ifade yine doğru olur. if( (buton1==0 && buton2==0 ) || buton3==0 ) …. buton1=0, buton2=0, buton3=0 ise İFADE=Doğru buton1=0, buton2=0, buton3=1 ise İFADE=Doğru buton1=1, buton2=0, buton3=0 ise İFADE=Doğru buton1=1, buton2=1, buton3=0 ise İFADE=Doğru buton1=1, buton2=1, buton3=1 ise İFADE=Yanlış buton1=1, buton2=0, buton3=1 ise İFADE=Yanlış buton1=0, buton2=1, buton3=1 ise İFADE=Yanlış PROGRAM_5: PORTB ‘nin 2. bitine (RB2’ye) Pull-Up bağlı butona basıldığı müddetce PORTB’nin 5. Bitine LED’i yakan programı yapınız. (RB2’ye basıldığı müddetçe demek RB2’ye basıldığında yansın, basılmadığında sönsün demektir.) #define buton portb.b2 #define LED portb.b5 void main() { trisb.b5=0; portb.b5=0; (trisb=0b11011111) (trisb=0xDF) (trisb=0b11011111) (trisb=0xDF) while(1) { if(buton==1) LED=1; if(buton==0) LED=0; } } DİĞER #define buton portb.b2 #define LED portb.b5 void main() { trisb.b5=0; portb.b5=0; while(1) { if(buton==1) LED=1; LED=0; } }