7 Segment Display Sayıcı Uygulaması

7 segment displaylere elektronik dünyasında çokça rastlarız. Bu displayler nasıl çalışır? Programlaması nasıl yapılır? Bu konulara değineceğiz.

7 segment display’ler plastik kalıp içine 8 adet LED’in yerleştirilmesiyle oluşturulmuştur.  Display’in büyüklüğüne göre birden fazla LED seri olarak bağlanabilmektedir.  Aşağıda segment isimleri ve display görülmektedir.

LED’lerin bağlantı şekline göre ortak Anot ve ortak katot olarak iki çeşittir. segment displayler tek olarak bulunduğu gibi ikili, üçlü ve dörtlü olarak ta bulunabilirler.

7 Segment Kod Dönüşümü

Kullanılacak displaylerin ortak anot veya ortak katot oluşlarına göre BCD sayının 7 segment display koduna dönüştürülmesi gerekmektedir. Bunun için MikroC’nin dönüştürme aracı vardır. Bu araca Tools menusünden “Seven Segment Editor” den veya araç çubuğu üzerindeki ikondan ulaşılabilir.  Aşağıda bu araç görülmektedir.

 Segment kod dönüştürme aracı

Sayı kodları dönüştürüldükten sonra bir dizi değişkeninde saklanarak daha kolay kullanım sağlanır. Örnek olarak ortak katot display kodları tanımlanmıştır.

const char  display_kod[10]={ 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C,  0x07, 0x7F, 0x67};

Ortak Katot Display Kod Dönüşüm Tablosu

RAKAM

BCD

SEGMENTLER

HEX

h g f e d c b a
0 0 0 0 0 0 0 1 1 1 1 1 1 0x3F
1 0 0 0 1 0 0 0 0 1 1 0 0 0x06
2 0 0 1 0 0 1 0 1 1 0 1 1 0x5B
3 0 0 1 1 0 1 0 0 1 1 1 1 0x4F
4 0 1 0 0 0 1 1 0 0 1 1 0 0x66
5 0 1 0 1 0 1 1 0 1 1 0 1 0x6D
6 0 1 1 0 0 1 1 1 1 1 0 0 0X7C
7 0 1 1 1 0 0 0 0 0 1 1 1 0x07
8 1 0 0 0 0 1 1 1 1 1 1 1 0x7F
9 1 0 0 1 0 1 1 0 0 1 1 1 0x67

Ortak Anot Display Kod Dönüşüm Tablosu

RAKAM

BCD

SEGMENTLER

HEX

h g f e d c b a
0 0 0 0 0 0 1 1 0 0 0 0 0 0xC0
1 0 0 0 1 1 1 1 1 1 0 0 1 0XF9
2 0 0 1 0 1 0 1 0 0 1 0 0 0XA4
3 0 0 1 1 1 0 1 1 0 0 0 0 0XB0
4 0 1 0 0 1 0 0 1 1 0 0 1 0X99
5 0 1 0 1 1 0 0 1 0 0 1 0 0X92
6 0 1 1 0 1 0 0 0 0 0 1 1 0X83
7 0 1 1 1 0 0 0 0 0 1 1 1 0XF8
8 1 0 0 0 1 0 0 0 0 0 0 0 0x80
9 1 0 0 1 1 0 0 1 1 0 0 0 0x98

Tarama Tekniği (MultIplexIng)

Tarama tekniğinde gözün yanılgısından istifade edilmektedir.  Şöyle ki; saniyede 25 ve üzeri resim karesini göz, kesintisiz görüntü olarak algılar. Bu teknikte de 1. displaye basamak değeri gönderilir ve bağlı olduğu ortak uç aktif edilir. 3-5 msn led yanık kaldıktan sonra ortak uç pasif edilir ve 2. displaye basamak değeri gönderilir  ve 2. Transistör aktif edilir. Böylece bütün displayler taranmış ve devamlı bir görüntü elde edilmiş olur.

En çok kullanılan teknik ise doğrudan taramanın  mikrodenetleyici ile yapılanıdır. Programlama açısından zorluklar olmasına rağmen devre daha sade ve ekonomiktir. Bu da iki türlü yapılabilmektedir. Sayı kodlarının 7447, 7448 vb. kod dönüştürücü entegreleriyle yapıldığı veya kod dönüştürme ve taramanın mikrodenetleyici tarafından yapıldığı türdür.

Şekilde kod dönüştürme işlemi ve tarama işlemi mikrodenetleyici tarafından yapılan dört displayli tarama devresi görülmektedir. Tarama işlemi timer kesmesiyle yapılmalıdır. Çünkü mikrodenetleyici başka bir işle uğraşırken taramada aksaklıklar olacaktır. Bu ise görüntüyü bozacaktır.

Daha büyük displaylerde ledler seri bağlandığı için eşik gerilimleri mikrodenetleyicinin besleme gerilimi VDD’den büyük olmaktadır. Böyle durumlarda beslemenin harici kaynaktan kullanılması gerekir ve devre biraz değişir.

Ortak Anot büyük displaylerin sürülmesinde kaynak gerilimi 8 kanallı Vdd sağlayan (8 channel source driver ic) UDN2982 gibi entegrelerle sağlanır. Segment sürme için de ULN 2803 tipi open-drain sürücü entegreleri kullanılır.

Sayıcı Uygulaması

7segmentSayici

7 Segment Sayıcı Devre Şeması

Devre kodları;

#define UP Button(&PORTA,6,180,0)
#define DWN Button(&PORTA,7,180,0)
const char ledKod[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x67};
char basamak[4],sayac=0,digit=0;
const char tr[4]={1,2,4,8};
int sayi=0;
void basamakHesapla(int deger)
{
 basamak[0]=ledKod[deger/1000];
 basamak[1]=ledKod[(deger%1000)/100];
 basamak[2]=ledKod[(deger%100)/10];
 basamak[3]=ledKod[(deger%10)];
}
//----------Timer0---------------------------------------------------
//Prescaler 1:16; TMR0 Preload = 68; Actual Interrupt Time : 3,008 ms
void InitTimer0()
{
 OPTION_REG = 0x83; // tarama süresi 3ms olarak ayarlandı
 TMR0 = 68;
 INTCON = 0xA0; // T0IE, GIE bitleri "1", T0IF biti "0"
}
void Interrupt()
{
 if (INTCON.T0IF){
  INTCON.T0IF = 0;
  TMR0 = 68;
  sayac++; // sayac'ı bir arttır (display sayısı için)
  if(sayac==4) sayac=0; //dört display olduğu için 4 te sıfırlanıyor
  PORTA=0;
  PORTB=basamak[sayac];
  PORTA=tr[sayac];
 }
}
void kurulum()
{
 CMCON=7;
 TRISA=0xC0;
 TRISB=0;
 PORTA=0x0F;
 PORTB=0xFF;
 InitTimer0();
}
void main()
{
 kurulum();
 Delay_ms(1000); // test için 1 sn bütün segmentler aktif
 basamakHesapla(sayi);
 while(1)
 {
 if(UP)
 {
 sayi++;
 basamakHesapla(sayi);
 Delay_ms(200);
 }
 if(DWN)
 {
 sayi--;
 basamakHesapla(sayi);
 Delay_ms(200);
 }

 }
}

Proje dosyalarına buradan erişilebilir.

Reklamlar

16 thoughts on “7 Segment Display Sayıcı Uygulaması

  1. Geri bildirim: ADC Keypad (Analog Klavye) | elektrokod

  2. melo arkadaşın dediği gibi çalışmadı. Kodları derleyince hata vermiyor ama butonlara basınca da tepki vermiyor. Sanırım mantık hatası var. Bende inceliyorum programınızı. Umarım sorunu çözebilirim.

    • display ortak katot mu? Eğer öyleyse displayi test ediniz. PIC’i söküp 1. dijit için picın ilgili pinine 5v veriniz. segmentlerden her birine (a,b,c,d,e,f,g,h) 5V verdiğinizde ilgili dijitin segmentlerin yandığını görünüz. Sonra diğer dijitin aynı şekilde test ediniz.

      Büyük ihtimalle displayde problem var.

      • öncelikle geri dönüş yaptığınız için teşekkür ederim.fakat gerçekte denemedim devreyi. proteusta denedim orda çalışmıyor demek istedim. Fakat tahminimce proteusun bu displaylerde hep simülasyon hatası oluyor .Oyüzden çalışmadı. Transistörleri falan düzgün simüle edemiyor bazen. Siz gerçekte deneyip çalıştırdıysanız proteusta çalışıp çalışmaması çok da önemli değil 🙂

      • proteusta denemek için transistörleri kaldırıp not kapısı koyarak deneyiniz. Gerçekte butonlara paralel 100nF koymak gerekebilir. Programda butonlara 200ms bekleme koymak gerekir. Bir de şu değişikliği yaparak deneyiniz.

        void Interrupt(){
        if (INTCON.T0IF){
        INTCON.T0IF = 0;
        TMR0 = 68;
        sayac++; // sayac’ı bir arttır (display sayısı için)
        if(sayac==4) sayac=0; //dört display olduğu için 4 te sıfırlanıyor
        PORTA=0;
        PORTB=basamak[sayac];
        PORTA=tr[sayac];
        }
        }

      • Dediklerinizi aynen yaptım. Proteusta not kapısı koydum ilk öyle denedim çalışmadı. Sonra vermiş olduğunuz interreupt içine PORTA=0; komutunu ekleyince proteusta çalıştı. İlginiz için çok çok teşekkür ederim. Saygılarımla. Kolay gelsin.

  3. kodlar pic c programına “#define DWN Button(&PORTA,7,180,0)” kısmında hata veriyor yardımcı olursanız sevinirim

  4. Merhaba projeyi yaptım çalışıyor teşekkürler. Bir sorum olacak sırası ile sağdan 1234 sayılarını ekranda göstermek istiyorum programda ne değişiklik yapmam gerek.(şifreli kapı için lazım)

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