14 Ocak 2011 Cuma

1.4 Port Yazmacı (devam 6) (Port Register)

Prg: 13

           Device = 16F877
XTAL 4

TRISB=0
TRISD=%00000111

Dongu:
    If PORTD.0=1 And PORTD.1=1 Then
        PORTB.0=1
    EndIf
    If PORTD.0=1 Or PORTD.2=1 Then
        PORTB.0=0
    EndIf

GoTo Dongu


Yukarıdaki örnekte ise aynı anda iki şart birden And, Or bağlaçları ile birbirine bağlanarak kontrol edilmiştir. Örneğin PortD.0 ve PortD.1’e bağlı butonlara aynı anda basılırsa PortB.0’ı Logic 1’e gider. Eğer PortD.0’a veya PortD.2’ye bağlı butonlara basılırsa PortB.0’a bağlı led söner.

Devre 3

Yukarıdaki devrede PortB çıkışlarına bir ortak katot Seven Segment Display bağlanmıştır. Seven Segment display’in içyapısında sekiz adet led bulunur. Bu led’ler belirli bir sıra ile yerleştirilmiştir.
Şekil 10

Şekil 11
Örneğin display ile 1 rakamı oluşturmak isteniyorsa B ve C ledlerinin yanması gerekmektedir. Yine aynı şekilde 3 rakamı için ise A,B,B,D,G ledleri yanmalıdır. Seven segmentler farklı büyüklüklerde tasarlanabilir. Segment’ler büyüdükçe içindeki led'lerinde sayıları artar. Her segmentte seri olarak bağlanmış 2,3 veya daha fazla led bulunabilir. Çalışma voltajları içindeki seri bağlı led'lerin sayılarına göre değiştiği için  led'lerin transistörler ile sürülmesi gerekebilir.

Prg:14

Device = 16F877
XTAL 4

TRISB=0
TRISD=%00000111

Dim Sayac As Byte
Sayac=0
GoSub Display

Dongu:
    If PORTD.0=1 Then
        While PORTD.0=1 : Wend
        If Sayac<9 Then Sayac= Sayac +1
        GoSub Display
    EndIf
    If PORTD.1=1 Then
        While PORTD.1=1 : Wend
        If Sayac>0 Then Sayac= Sayac -1
        GoSub Display
    EndIf   
GoTo Dongu

Display:
    HSerOut [Dec Sayac]   
    If Sayac=0 Then PORTB=%00111111 ;0
    If Sayac=1 Then PORTB=%00000110 ;1   
    If Sayac=2 Then PORTB=%01011011 ;2
    If Sayac=3 Then PORTB=%01001111 ;3
    If Sayac=4 Then PORTB=%01100110 ;4
    If Sayac=5 Then PORTB=%01101101 ;5
    If Sayac=6 Then PORTB=%01111101 ;6
    If Sayac=7 Then PORTB=%00000111 ;7
    If Sayac=8 Then PORTB=%01111111 ;8
    If Sayac=9 Then PORTB=%01101111 ;9
Return

End 

Yukarıdaki örnekte yeni bir komut kullanılmıştır. Gosub komutu GoTo komutu gibi belirtilen etikete gitmeyi sağlar. Fakat bu komutun Goto komutundan farkı gidilen noktaya Return ile geri dönülmesidir. Goto kesin bir gidiştir. Gosub ise ana program döngüsü içinde gerektiği zaman geçici olarak gidilen gerekli kodlar çalıştıktan sonra tekrar geri dönülen noktalar için kullanılması uygundur.

Bu program parçalarına Alt program ( subrutine ) denir. Alt program parçaları program için birden fazla çalışması gereken fakat çalışacak kodların birbiri ile aynı olması durumlarında kullanılır. Programda tuşlara basıldığında Sayac değişkeninin değeri birer birer artmakta ve azalmaktadır. Her değer değişiminde de değer Seven Segment ile gösterilmektedir. Tuşlara basıldığında Seven Segment üzerinde gösterim yapacak olan kod parçacığı ortak olduğu için bu kod bir alt program şeklinde hazırlanmış ve gerektiği zaman bu koda gidilip programa geri dönülmüş ve kalınan yerden devam edilmiştir. Gosub ile gidilen yerden mutlaka Return komutu ile geri dönülmelidir.

Yine program içinde kullanılan yeni bir komutta While Wend komutudur. Bu komut şartlı döngü komutudur. Şart sağlandığı müddetçe döngünün dönüşü devam eder. Şart sağlanmadı noktada program Wend komutunun bir altındaki satırdan itibaren çalışmaya devam eder.

Döngü komutları üç grupta incelenir.
  1. Sonsuz döngü: Goto komutu ile sonsuz döngüler kurulur.
  2. Sayıya bağlı döngüler: For Next komutu istenilen sayıda döngü kurulmasını sağlarlar.
  3. Şartlı Döngüler: Bu tip döngülerde While Wend ve Repeat Until komutları kullanılır. Bu döngülerde şart doğru olduğu sürece  döngünün dönüşü devam eder.


Main:
     …..
     …..
     …..
     …..
     …..
Goto Main
Dim Sayac as byte
For Sayac=0 to 10
     …..
     …..
     …..
     …..
Next
Dim Sayac as byte
Sayac=0
While Sayac<10
     Sayac=Sayac+1
     …..
     …..
Wend
Programı satır satır incelemeye başlarsak;

Ekrana basılacak değerleri saklamak için öncelikle adı Sayac, tipi byte olan bir değişken tanımlanmış ve ilk değer olarak ta 0 yüklenmiştir. Bu değerin ilk kez seven segment’te gözükmesi için Gosub komutu ile alt rutine gidilmiştir. Alt rutinde if önermeleri ile Sayac değişkeninin değeri kontrol edilmiştir. Uygun olan değere göre gerekli olan segment ledleri yakılarak display'de sayı oluşturması sağlanmıştır. Sonra Return komutu ile  Gosub komutu ile gelinen yere geri dönülmüş ve bir alt satırdan itibaren program çalışmasına devam etmiştir.

Sonsuz döngünün içinde ilk önce tuşlara basılıp basılmama durumu kontrol edilmiştir. PortD.0’na bağlı tuşa basılırsa yani girişe Logic 1 verilirse şart sağlamış olur ve ilk önermenin içi çalışmaya başlar.

İlk önermenin hemen alt satırında While PORTD.0=1: Wend Komut satırı yer almaktadır. Burada ilk etapta incelenmesi gereken konu komutların arasına konmuş olan: sembolüdür. Bu sembol eğer bir satırda birden fazla komutu art arda yazmak gerekiyorsa komutları birbirinden ayırmak amacı ile kullanılır. Kısaca Wend komutu bir alt satıra yazılması gerekirken bu komutu üstteki satıra yazmak için: sembolü kullanılmıştır.

Gelelim bu satırı neden kullandık. Bildiğiniz gibi mikrodenetleyiciler bağlamış olduğunuz kristalin hızına göre farklı hızlarla çalışsa da yine elimizin butona basılması ve çekilmesi  işlemi sırasında program birçok kez aynı yerden geçecektir. Böyle bir çalışma bizim istediğimizin dışında sonuçlara neden olacaktır. Bu yüzden butona bastığımızda butondan elimizi çekinceye kadar programın o noktada takılı kalmasını sağlamak bu satırın görevidir. Bu satırda PortD.0 Logic 1 olduğu müddetçe bu satır While Wend arasında dönüp duracaktır. Elimizi butondan çektiğimizde ise Logic 0’a gidecek ve şart artık sağlanmayacağı için bir alt satıra gidilerek program kaldığımız yerden çalışmaya devam edecektir.

Bu satırda ise Sayac değişkeninin değeri 9'dan küçük ise değeri bir arttırılacak yeni sayaç değerine göre displaya yeniden değer basılacaktır. Diğer If önermesi ise Sayaç değişkeninin değerini azaltmak için kullanılmıştır.

5 yorum:

  1. Çok Teşekkür ederiz paylaşım için... emeğinize sağlık.

    YanıtlaSil
  2. hocam ortak anotlu(+) display kullansaydık bağlantı şekli değişecek peki delphi yazılıma etki edecek bir durum söz konusu olurmuydu
    saygılarımla

    YanıtlaSil
  3. hocam bu anlatılarınız için çok tesekkürler sayenizde aklıma takılan biçok noktayı buradan telafi edebiliyorum..

    YanıtlaSil
  4. Çok güzel bilgiler yayınlamışsınız teşekkürler iyi çalışmalar...

    YanıtlaSil
  5. Eğer ortak anot seven segment kullanacaksanız hem devre hemde yazılım değişmelidir. Çünkü şu anki sürme mantığına ters olarak ledleri sürmeniz gereklidir. İleriki konularda bu şekilde sürme yönteminede örnek hazırlamayı düşünüyorum. Yorumlarınız için teşekkürler. Saygılarımla.

    YanıtlaSil