Örnek 1:

PIC16F887 kullanarak 0-99 arası 7segment display sayıcı yapınız.

Devre şemamızı Proteus programı ile çizdik. Devremizde iki adet ortak katot 7segment display mevcut. Displayler ortak katot olduğu için MCU tarafından High seviye (lojik 1 -5V-) geldiği durumda yanacak, Low seviye (lojik 0-0V-) geldiğinde sönecektir.

Resimde 7segment displayin segment isimleri görülmektedir. Segmentler 330R akım sınırlama dirençleri ile MCU’ya bağlandılar. MCU tarafından sayıların gönderilebilmesi için 7segment kod dönüştürme işleminin yapılması gerekir. Ayrıntılı bilgi için; /https://elektrokod.wordpress.com/2013/12/09/7-segment-display-sayici-uygulamasi/

Dönüştürme işlemi sonunda;

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

değerlerini elde ediyoruz. Burada ledKod isminde 10 elemanlı 8bitlik bir dizi değişkeni oluşturduk. Değişkenin ilk elemanı yani 0. eleman 0 değerini, 1. eleman 1. değeri vb. 7segment displaye yazacaktır.

Program içinde PORTC=0x3F; kullandığımda C portuna bağlı displayde “0” rakamı görünecektir. Daha kullanışlı olması için PORTC=ledKod[0]; kodunu kullanabilirim.

Şimdi sıra geldi displaylerin ikisine de rakam göndermeye; diyelim ki sayımız 12 olsun. Sayımızın 10’lar basamağı 1, birler basamağı 2. Yani 1 sayısını 1. displaye, 2 sayısını 2. displaye göndermeliyiz. Bunun için sayıyı basamaklarına ayırmalıyız. 12 sayısını 10′ böldüğümüzde bölüm 1, kalan da 2 olacaktır. O halde bu kodları şöyle yazabilirim;

PORTC=ledKod[sayi/10];// 1. display
PORTD=ledKod[sayi%10];// 2. display

Mikroc Kodları;

const char  ledKod[10]={ 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C,  0x07, 0x7F, 0x67};
unsigned char sayi=0;
 //------------------------
 void main() 
 {
   TRISC=0;
   TRISD=0;
   PORTC=ledKod[0];
   PORTD=ledKod[0];
   while(1)
   {
      PORTC=ledKod[sayi/10];
      PORTD=ledKod[sayi%10];
      sayi++;
      if(sayi>99) sayi=0;
      delay_ms(1000);
   }
 }

Buradaki kodları derlediğimizde birer saniye aralıklarla 0-99 sayıcı elde etmiş oluruz.

Örnek 2:

PORTA’nın 0. bitine bağlı olan butona basıldığında bir arttıran, 1. pinine bağlı olan butona basıldığında bir azaltan ve sayıyı displayde gösteren programı yazınız.

Devrede pull-down bağlanmış iki adet buton ve iki tane ortak katot display görülmektedir. Butonlar MCU’ya giriş olarak, displayler ise çıkış olarak kullanılacaktır.

Buton kullanımı ile ilgili ayrıntılı bilgi için; https://elektrokod.wordpress.com/2013/11/18/buton-kontrolu/

Devre tasarımında kullanacağımız port/pin giriş için mi yoksa çıkış için mi kullanılacağı tanımlanmalıdır. Bunu port yönlendirme registerleri aracılığı ile yapmaktayız. PIC MCU’larda bu register TRIS olarak isimlendirilmiş. Çıkış için 0, giriş için 1 kullanılmalı.

TRIS ve PORT Kavramı

 

Bizim devremizde iki adet buton PORTA’nın 0. ve 1. pinlerine bağlanmış. O zaman ilk iki bit giriş, diğerleri çıkış olarak ayarlamak istersek; TRISA=0b00000011; veya TRISA=0x03; veya TRISA=3; olarak yazmalıyız.

PORTC ve PORTD çıkış portu olduğu için;

TRISC=0;

TRISD=0; yazmalıyız.

MikroC kodları;

#define BTN_YUKARI  PORTA.B0
#define BTN_ASAGI   PORTA.B1
 //------------------------------------
 const char  ledKod[10]={ 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C,  0x07, 0x7F, 0x67};
 char sayi=0;
 //------------------------------------
 void main()
 {
   ANSEL=0;     //başlangıç ayarları
   ANSELH=0;
   TRISA=3;
   TRISC=0;
   TRISD=0;
   PORTC=ledKod[0];
   PORTD=ledKod[0];
   while(1)
   {
      if(BTN_YUKARI) // Yukarı butonuna basıldığında;
{
if(sayi<99) sayi++; // eğer sayi 99'dan küçükse arttır.
PORTC=ledKod[sayi/10]; // 10lar basamağını 1. displaye yaz
PORTD=ledKod[sayi%10]; // 1'ler basamağını 2. displaye yaz
while(BTN_YUKARI); // butondan elini çekene kadar bekle
}
if(BTN_ASAGI) // Aşağı butonuna basıldığında;
{
if(sayi>0) sayi--; // eğer sayi 0'dan büyükse azalt.
PORTC=ledKod[sayi/10]; // 10lar basamağını 1. displaye yaz
PORTD=ledKod[sayi%10]; // 1'ler basamağını 2. displaye yaz
while(BTN_ASAGI); // butondan elini çekene kadar bekle
}
} }




Daha Kısa olarak şöyle de yazılabilir;
while(1)
{
if(BTN_YUKARI||BTN_ASAGI)
{
if(sayi<99&&BTN_YUKARI) sayi++;
if(sayi>0&&BTN_ASAGI) sayi--;
PORTC=ledKod[sayi/10]; // 10lar basamağını 1. displaye yaz
PORTD=ledKod[sayi%10]; // 1'ler basamağını 2. displaye yaz
delay_ms(300);
}
}