Bu dersimizde IF-ELSE IF ile SWITCH kontrol yapılarını göreceğiz. IF ELSE-IF kontrolünü diğer IF yapıları yerine SWITCH yapısıyla göstermeyi uygun bulduk. Çünkü kullanımları hemen hemen benzer.

Bu derste çok fazla anlatım yapmayacağız. Seçtiğimiz örnek bize hem bu yapıların kullanımını hem de ikisi arasında -olmayan- farkları gösterecektir.

Şimdiye kadar yazdığımız programlarda çıkış elemanı olarak hep LED kullandık. Bugün programımızı bir 7 segment display üzerinden çalıştıralım. 0-8 arası sayan bir program oluşturalım. Buna göre PORTC’nin 0-7 arası pinlerine bağlı butonlardan hangisine basarsak displayimizde o sayıyı görelim.

Örneğin,

PORTC’nin 0. pinine bağlı 1.Butonumuza tıkladığımızda ekranda 1,
PORTC’nin 1. pinine bağlı 2.Butonumuza tıkladığımızda ekranda 2,

PORTC’nin 7. pinine bağlı 8.Butonumuza tıkladığımızda ekranda 8, yazısını görelim. Hiçbir butona tıklamadığımızda ise 7 segmentli ekranda koca bir sıfır gözüksün.

Yani devremizin donanımı aşağıdaki gibi olacaktır:

Programlamaya geçmeden önce 7-Segmentler hakkında çok kısa bir bilgi verelim. Aşağıdaki tabloyu inceleyin bir hele:

Gördüğünüz gibi displayin her bir segmenti a’den g’ye kadar isimlendirilmiştir. Örneğin ben ekranda 1 rakamını görmek için ne yapmalıyım? b ve c segmentlerine 1, diğer segmentlerine 0 vermeliyim ki b ve c segmentleri +5 Volt alarak ışıklarını yaksın gönlümüzü aydınlatsın.

Bunu yaparkan yukarıdaki segmentleri yan yana 8 basamak olarak düşünürseniz işiniz kolaylaşır. Mesela 1 rakamını yakmak için:

Gördüğünüz gibi sekiz basamaklı sayımızı 4 erli 2 gruba ayırarak değerlendiriyoruz. Buradaki h ifadesi çoğu displayde yandaki “nokta” işaretidir. Bizim programımızda onla ilgilenmiyoruz.
NOT: bu değerlendirme ortak katotlu 7 segment displayler için geçerlidir. Yani ortak uç GND’ye bağlanır. Eğer ortak anot kullansaydık, yakmak istediğimiz segmente 1 değil 0 verecektik.

Programımızı ilk önce IF ELSE-IF kontrolüyle yapalım:

void main() {
PORTB = 0;
TRISB = 0;
TRISC=0xff;

while(1) {

if (portc.f0==1)
{
PORTB = 0x06; /*1*/
Delay_ms(100);
}

else if (portc.f1==1)
{
PORTB = 0x5b; /*2*/
Delay_ms(100);
}

else if (portc.f2==1)
{
PORTB = 0x4f; /*3*/
Delay_ms(100);
}

else if (portc.f3==1)
{
PORTB = 0xE6; /*4*/
Delay_ms(100);
}

else if (portc.f4==1)
{
PORTB = 0x6D; /*5*/
Delay_ms(100);
}

else if (portc.f5==1)
{
PORTB = 0x7D; /*5*/
Delay_ms(100);
}

else if (portc.f6==1)
{
PORTB = 0x07; /*5*/
Delay_ms(100);
}

else if (portc.f7==1)
{
PORTB = 0x7F; /*5*/
Delay_ms(100);
}

else
{
PORTB = 0x3F; /*0*/
Delay_ms(100);
}

}
}

PROGRAMIN ÇALIŞMASI: bundan sonra programları satır satır açıklamak yerine kısaca anlatacağız. Çünkü artık büyüdük, koskoca adam olduk.

Arkadaşlar burada gördüğünüz üzere PORTC nin bütün pinleri GİRİŞ, PORTB ise ÇIKIŞ olarak ayarlanmış.

Yine devamlı kontrol için bir sonsuz döngüyü WHILE(1) satırıyla sağlamışız.

Bundan sonra sırasıyla PORTC’nin bütün pinleri kontrol edilip 1 mi 0 mı olduğuna, yani butona basılıp basılmadığına bakılıyor, örneğin:

if (portc.f0==1)
{
PORTB = 0x06; /*1*/
Delay_ms(100);
}

Burada PORTC’nin 0.bitini (yani 1.butonu) kontrol ediyoruz. Eğer PORTC’nin 0.Biti 1 ise yani 1.butona basılmışsa o zaman PORTB’ye 0x06 gönder. Yani displayde b ve c segmentlerini yakarak 1 işareti oluştur.

Bundan sonraki satırlar hep bir yukasına gönderme olarak “o değilse böyle yap, o da değilse bunu yap, o da olmadı bunu dene…” havasında “else-if” merdiveninden en aşağı doğru devam eder. Sonuçta tüm kontrol bittikten sonra döngünüz sonsuz olduğu için başa dönüp tekrar kontrol edecektir.

Tabi biz böyle yavaştan anlatıyoruz ama bu kontroller denetleyici içinde mili saniyeler mertebesinde oluyor.

 

SWITCH () KONTROLÜ:

Çok esnek ve kullanımı kolay bir kontrol olmasına rağmen nedense fazla kullanılmaz. Şimdi aynı programı SWITCH kontrolü ile yazalım, inceleyiniz:

void main() {

PORTB = 0;

TRISB = 0;

TRISC=0xff;

while(1) {

switch (PORTC)

{

case 1: PORTB = 0x06; /*1*/
break;

case 2: PORTB = 0x5b; /*2*/
break;

case 4: PORTB = 0x4f; /*3*/
break;

case 8: PORTB = 0xe6; /*4*/
break;

case 16: PORTB = 0x6d; /*5*/
break;

case 32: PORTB = 0x7d; /*6*/
break;

case 64: PORTB = 0x07; /*7*/
break;

case 128: PORTB = 0x7f; /*8*/
break;

default: PORTB= PORTB = 0x3F; /*0*/

}

}

}

Gördüğünüz üzere bu kontrol yapısı gayet kullanışlı. SWITCH ile durumu belirliyoruz. CASE’lerle de durumun şartını. Yani yukarıda, PORTC switch olarak seçilmiştir ve,

Durumu (case) 1 ise (0.bite bağlı butona yani 1. butona basılmışsa) ekrana 1,
Durumu (case) 2 ise (1.bite bağlı butona yani 2.butona basılmışsa) ekrana 2,
Durumu (case) 4 ise (2.bite bağlı butona yani 3.butona basılmışsa) ekrana 3,

Durumu (case) 128 ise (7.bite bağlı butona yani 8.butona basılmışsa) ekrana 8 yazacaktır. Hiçbir şartı sağlamıyorsa, “default” satırında değer yani sıfır sayısı ekranda kalacaktır. Ta ki her hangi bir butona basılıncaya kadar.

Burada “case” lerdeki 1,2,4,..,128 sayılarını anlamadınız mı? Niye mi böyle yaptık? PORTC pinlerini 8 bitlik yani 8 hanelik bir binary sayı gibi düşündük:

Arkadaşlar burada dikkat edilmesi gereken nokta şu. Decimal sayı sistemi kullanmak istiyorsak 8 biti 4 erli 2 gruba ayırmadan basamak direk değerlerini dikkate alıyoruz. Hexadecimal kullanmak istiyorsak 4 bitlik iki grup halinde dikkate alıyoruz. Yani yukarıdaki programda 6 rakamını yazmak için kullandığımız decimal değer yerine hexadecimal değerini de rahatlıkla yazabilirsiniz:

case 32: PORTB = 0x7d; /*6*/

satırını

case 0x20: PORTB = 0x7d; /*6*/

şeklinde değiştirirsek aynı işlevi görür. Burada bilmemiz gereken decimal sayıları direk yazıyorken hexadecimal sayılar “0x” ifadesiyle birlikte yazmamızdır.

20 hexadecimal = 32 decimal.

NOT: yukarıda iki satırda bir gördüğünüz /*4*/, /*5*/, /*6*/ ifadeleri yorum satırıdır. Bunlar kod değildir derlenmez. Kafanız karışmasın. Programı takip edebilelim diye biz koyduk onları oraya.

böylece SWITCH kontrolünü de öğrenmiş olduk.


SWITCH (durum)
{
Case şart1: ifadeler;
Case şart2: ifadeler;

Default: ifadeler
}


 

***

Hazırlaması uzun ve yorucu bir dersin daha sonuna geldik :) bir dahaki dersimizde diziler kavramını inceleyelim ve şu yukarıdaki programı bir saniye aralıklarla otomatik olarak 0–9 arası sayıcı olarak düzenleyim.

Bu arada dersin başında çok fazla açıklama yapmayacağız dedik ama şimdiye kadar ki en uzun dersimiz de bu oldu galiba.

TAGS:mikroc pic if kontrolü

Anahtar Kelimeler: Mikrodenetleyici

peynir6 suyu tozu , 07/05/2008-09:41 Facebook'ta Paylas