Ö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ı.
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);
}
}
0 Yorumlar