0-9 sayıcı yapmak kolaydı.  Peki iki veya daha fazla  basamaklı sayıları 7 segment displayler ile nasıl gösteririz? Tabi ki tarama yöntemi ile. Bu yöntemin temeli displaylerin teker teker aktif edilmesi mantığına dayanır. Yani diyelim ki “23”  sayısını displaylerde göstermek istiyoruz. O halde aşağıdaki işlemleri sırası ile yaparız;

1- Onlar ve birler basamağındaki displayler ilk durumda pasiftir.

2- İlgili porta “2” rakamını temsil eden değer yüklenir.

3- Onlar basamağındaki display aktif edilir ve “2” rakamı displayde görülür.

4- Displayin fosfor etkisinden yararlanmak için belli bir müddet beklenir (2-3 ms).

5- Onlar basamağındaki display pasif edilir.

6- İlgili porta “3” rakamını temsil eden değer yüklenir.

7- Birler basamağındaki display aktif edilir ve “3” rakamı displayde görülür.

8-Displayin fosfor etkisinden yararlanmak için belli bir müddet beklenir (2-3 ms).

9-Birler basamağındaki display pasif edilir.

10- Tekrar başa dönülerek işlem tekrarlanır.

Böylece yukarıdaki işlem sürekli yapılarak  biraz göz yanılgısı biraz da displaylerden kaynaklanan fosfor etkisinden dolayı 23 sayısı displaylerde oluşur.

Bu notta ayrıca 7448 entegresini de tanıtmak istiyorum. Bu entegre ABCD olarak 4 adet bcd girişe sahiptir. Ayrıca a,b,c,d,e,f,g olmak üzere 7 adet çıkışa sahiptir. Girişlerinden verilen BCD sayı değerine göre, ortak katot 7 segment display için çıkış üretir. Diyelimki girişinden “3” sayısına tekabül eden 0011 değerini verdik, entegre hemen çıkışından 7 segment displayde 3 sayısını gösterecek şekilde bilgi üretir. 7447 entegresi ise ortak anodlu displayler için kullanılır.

Bu yazıyı fazla uzatmayacağım ve direkt olarak program kısmına gireceğim. Programımızda 2 basamaklı bir sayıcı yapacağız. 2 buton kullanacağız. Bu butonlardan birisi arttırma işini, diğeri ise azaltma işini üstlenecek.

Programdaki en önemli kısım birler ve onlar basamaklarının hesaplandığı kısımlardır.

#define disp1   PORTA.F2
#define disp2   PORTA.F3
#define arttir  PORTA.F0
#define azalt   PORTA.F1

char sayi=0,birler,onlar;

void goster()
{
 onlar=sayi/10;
 birler=sayi%10;

 disp2=1;
 PORTB=onlar;
 disp1=0;
 delay_ms(3);

 disp1=1;
 PORTB=birler;
 disp2=0;
 delay_ms(3);
}

//*****************************************************************

void kurulum()
{
 CMCON=7;    //Bu register'a 7 değerini
 TRISA.f0=1; TRISA.f1=1;  TRISA.f2=0;  TRISA.f3=0;
 TRISB=0; PORTB=0;
 disp1=0; disp2=0;
}

//*****************************************************************

void main()
{
 kurulum();

 while(1)
         {
          if(arttir)
                    {
                     sayi++;
                     if(sayi==100)sayi=0;
                     while(arttir)
                                  {
                                   goster();
                                  }
                    }

         if(azalt)
                    {
                     if(sayi==0)sayi=100;
                     sayi--;
                     while(azalt)
                                  {
                                   goster();
                                  }
                    }

         goster();
        }
}

onlar=sayi/10;  ifadesi ile sayi değişkeni 10’a bölünerek ortaya çıkan virgüllü sayının tam kısmı birler değişkenine kaydedilir. Çünkü birlertam sayı olan char tipinde bir değişkendir.

birler=sayi%10; ifadesi ile de sayi değişkeni mod 10 işlemine tabi tutulur. Bu işlem sayi değişkeninin 10’a bölünmesinden kalanı almakta ve böylece birler basamağındaki değer hesaplanarak birler değişkenine kaydedilmektedir.

Displayimiz ortak katod olduğundan aktif etmek istediğimiz displayin ortak katod ucuna “0” , pasif edilmek istenen displayin ortak katod ucuna ise “1” gönderilir. Displayler simülasyonda direk PIC’ten sürülmüştür fakat gerçek hayatta transistör kullanılması gerekir  çünkü  ledlerin tamamı yandığında PIC’in sink akımı tüm ledlerin parlak bir şekilde yanmasına yetmeyecek ve ledlerin parlaklığı azalacaktır. Gerçek hayatta bu devrenin nasıl olması gerektiğine dair devre şeması da aşağıdaki linkte mevcuttur. Tabi transistörler kullanıldığında aktif edilmek istenen displaye “0” değil 1 yollanması gerekmektedir.

Büyütmek için tıklayın.

Bu nota ait tüm dosyaları buradan indirebilirsiniz..

Bir yazımızın daha sonuna geldik. Bizi izlemeye devam edin 😉

yorum
  1. Salih K dedi ki:

    Hocam elinize sağlık..Paylaşımlarınızın devamını bekliyorum ..

  2. Eray dedi ki:

    Çok güzel bir site olmuş elinize sağlık

  3. Mehmet Y dedi ki:

    Çok faydalı oldu gerçekten.. Teşekkürler…

  4. onur dedi ki:

    Merhaba hocam.Ben picin bir portunun ilk dört bitinle bir displayi diğer dört bitinle diğer displayi bağımsız olarak kontrol etmek istiyorum.(ikiside ileri geri 0-9 sayıcı olacak).Programsal olarak baya uğraştım olmadı internetten de araştırdım hiç yapan göremedim hocam.Hep 0-99 olarak var.
    Hocam bu şekilde program yazılarak yapabilirmiyiz diye danışmak istedim size.Teşekkürler.

    • mikrodunya dedi ki:

      Tabiki yapılabilir. İki adet 7447 veya 7448 kullanarak yapabilirsiniz displaylerin durumuna göre.

      • onur dedi ki:

        Tabi hocam bende öyle yapıyorum zaten de benim derdim programsal.
        Hocam microc ile yazdığım program şöyle:

        #define artir PORTC.RC0
        #define azalt PORTC.RC1

        short display = 0;

        void main() {
        ADCON1 |= 0x0F;
        CMCON |= 7;

        trisb = 0;
        portb = 0;

        trisc = 0x03;
        portc = 0;

        while(1)
        {
        if (!artir)
        {
        display++;
        while(!artir);
        }
        if (!azalt)
        {
        display–;
        while(!azalt);
        }
        if (display > 9) display = 0;
        if (display < 0) display = 9;
        portb = display;
        }
        }

        Burda display değişkenini porb ye değilde portb'nin ilk dört bitine nasıl gönderirim.Bunu yaparsam portc'nin 2. ve 4. bitinlede diğer displayi kontrol edecem.

      • mikrodunya dedi ki:

        Şu anda gönderdiğiniz değerler zaten ilk 4 bitte. Siz daha değerlikli 4 bite göndereceksiniz 2. display için. Bu da “portb<<=4;" komutu ile mümkün.

  5. veysel dedi ki:

    hocam anlattıgınız display taramayı kendi devremde uygulamaya calışıyorum assembly dilinde yazmaya calışıyorum fakat birini aktif digerini pasif ederken pasif ettigim sayactaki sayı görünmüyor gecikmeyide uyguladım fakat bi türlü 9 rakamından sonra 10 sayısını sayaclarda göremedim yardım edebilirmisiniz.birler basamagına sıfır komutunu portb ye attım sonra sayac1 aktif yaptım sonra gecıkme sayac1 pasif yaptım sonra bir komutunu portb ye atıp sayac2 yi aktif ettim gecıkme sonra pasif yaptım ama sayac1 deki sıfır rakamı kayboldu inşaALLAH anlatabildim

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s