//
Copyright (C) 2015 Durali Kiraz
//
PIC16F877A için hazırlandı.
#include
<pic14regs.h>
typedef
unsigned short int uint16_t;
//sigorta
tanımlarımızı yapıyoruz.
__code
uint16_t __at _CONFIG __configword =
_FOSC_XT
&&
_WDT_OFF
&&
_BOREN_OFF
&&
_LVP_OFF
;
//
Bu ms_bekle 168877a 4 Mhz frekansı için ayarlanmış bir
fonksiyondur
void
ms_bekle(uint16_t milisaniye)
{
uint16_t
i,j;
for
(i = 0; i < milisaniye; i++)
{
//
Döngüde optimizasyon için bu asm komutu eklenmiştir.
for
(j=0; j < 46; j++)
__asm
nop __endasm;
}
}
//
.gfedcba Görünen
const
unsigned char segment[]={
0x3F, // 00111111 0
0x06, // 00000110 1
0x5B, //
01011011 2
0x4F, //
01001111 3
0x66, //
01100110 4
0x6D, //
01101101 5
0x7C, //
01111100 6
0x07, //
00000111 7
0x7F, //
01111111 8
0x6F //
01101111 9
};
void
main(void) // Ana fonksiyon alanı
{
char
i = 0; // Herhangi bir değişken tanımlanıyor
TRISB
= 0x00;// PORTB çıkış olarak yönlendiriliyor
PORTB
= 0x00;// PORTB'nin tüm çıkışları sıfırlanıyor
for(;;) //
Sonsuz döngüye giriliyor
{
PORTB
= segment[i]; // Seven segment değerleri alınıyor
i++; //
i bir artırılıyor
ms_bekle(1000); //
1000ms bekleniyor
if(i>9) //
Eğer sayı 9'dan büyük ise 0'a dön
i=0; //
Değişken 0 yapılıyor
}
}
Bu dersimizde
elektroniğin en önemli çıktı araçlarından 7 segment display
ile 0~9 arası basit bir sayıcı (counter) yapmaya çalışacağız.
7Segment display; kısaca üzerinde 7 adet led'i bulunan elektronik
bir parça. Çalışma şekli olarak ortak katot ve ortak anot olmak
üzere iki çeşittir. Tabi bunların da alt çeşitlerinin olduğunu
bilmek gerekiyor. Yazılımla bu 7 segmente ait ledlerden hangisinin
yanıp hangisinin söneceğine karar veriyoruz. Olayın hepsi bu.
Tabi bunun yanında ikili,üçlü hatta 4 lü segment display lerde
kullanılmakta. Onlarla igili örneğimizi başka bir ders yada
dersler olarak değerlendireceğiz.
Bu devredeki
uygulayacağımız mantık bellirli zaman aralıklarında (1000ms)
sırayla ilgili ledlerini yakıyoruz. Böylece sayı sayma efektimiz
oluşmuş oluyor. Kod'a bakacak olursak; daha önceki derslerimizde
bahsettiğimiz sigorta tanımlarımız, pic16f877a 4 MHZ için
senkronize ettiğimiz ms_bekle isimli bekleme fonksiyonumuz yer
almakta. Daha sonra kod üzerinde açıklamaya çalıştığımız
segment isimli bir sayısal dizi tipimiz var. Diziyi onaltılık
(hexadecimal) olarak tanımladık. İstersek binary yada onluk
tipinde de yazabilirdik, farkeden bir şey olmaz. Dizide her değerin
yanında ikilik karşılıklarını açıklama olarak yazdığımız
dikkatinizi çekmiştir. By ikilik sayı görüntüsündeki 1 ler
yanacak olan ledleri, 0 lar ise sönük kalacak ledleri işaret eder.
Yani herşey 1 ve 0 olayı. Biz yinede hangi sayının gönderilen
değerlerle 7 segment displayde görüneceğini Görünen diye
belirttik. Herhalde bu husus anlaşılmıştır.
Ana kodumuza (main
fonksiyonu) gelecek olursak; B portunun tüm pinleri çıkış olarak
ayarlanmış, ardından başlangıç olarak 0x00 değeri
gönderilmiştir. Sonrasında for ile sonsuz döngümüz başlamakta.
Bu döngü içinde
PORTB
= segment[i];
satırında
segment isimli dizi değişkenin i ninci elemanı PORTB ye atanıyor.
Bildiğiniz gibi diziler 0 başlangıç değerini indis olarak
seçer. Yani sıfırıncı eleman ilk elemanıdır. Dolayısınla ilk
olarak i=0 olduğu için segmentin sıfırıncı eleamanı (0x3F)
PortB ye atanır. 0x3F gösterimde sıfırın gösterilmesini sağlar.
Bu sebeple displayda 0 gözükür. Sonrasında
i++;
ile
esasında “i = i+1” yapılır. Ve
ms_bekle(1000)
;
ile
1 saniye kadar bekleme yapılır.
if(i>9)
i=0;
satırı
ile i eğer 9 a ulaşmışsa sıfırlanır. Yani döngü 10 kere
dönüş yapar ve dizideki 10 elemanı sıra ile display'e gönderir.
Bu döngü sonsuza kadar devam eder. Başka bir derste görüşmek
üzere hoşçakalın.
duralikiraz.blogspot.com
20
Haziran 2015
“Muvaffakiyet
Allahtandır”
Hiç yorum yok:
Yorum Gönder