22 Haziran 2015 Pazartesi

SDCC ile İki Rakamlı 7 Segment Display Uygulaması 00-99 Sayıcı (16F877A) –Ders07



















// 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 sayi_goster(char i) // Sayı göstermeye yarayan fonksiyon
{
    PORTC = 0x02;          //PORTC'de 2 değeri gönderiliyor 10
    PORTB = segment[i/10]; //i'nin 10'a bölümü gösteriliyor
    ms_bekle(10);          //10ms bekleniyor
    PORTC = 0x01;          //PORTC'de 1 değeri gönderiliyor 01
    PORTB = segment[i%10]; //i'nin 10'a bölümünden kalanı gösteriliyor
    ms_bekle(10);          //10ms bekleniyor
}


void main(void)
{
   int i = 0; // Herhangi bir değişken tanımlanıyor
   ADCON1 = 0x07; // PORTA dijital yapılıyor
   TRISA = 0x03; // PORTA'nın ilk iki pini giriş
   TRISB = 0x00; // PORTB çıkış olarak yönlendiriliyor
   TRISC = 0x00; // PORTC çıkış yapılıyor
   PORTA = 0x00; // PORTA'nin tüm çıkışları sıfırlanıyor
   PORTB = 0x00; // PORTB'nin tüm çıkışları sıfırlanıyor
   PORTC = 0x00; // PORTC'nin tüm çıkışları sıfırlanıyor
   for(;;) // Sonsuz döngüye giriliyor
   {
      if(RA0==0) // RA0'pini 0 mı?
      {
         while(!RA0); // Buton bırakıldı mı diye bakılıyor
         i++; // Değişken artırılıyor
         if(i>99) // Eğer değişken 99'dan büyükse 0 oluyor
              i=0;
      }
      else
      if(RA1==0) // RA1'pini 0 mı?
      {
          while(!RA1); // Buton bırakıldı mı diye bakılıyor
          i--; // Değişken azaltılıyor
          if(i<0) // Eğer değişken 0'dan küçükse 99 oluyor
               i=99;
      }
     
      sayi_goster(i); // O anki sayı gösteriliyor
   }
}


Bir önceki dersimizde tek haneli 7 segment display için 0-9 arası bir sayıcı devresini oluşturmuştuk. Bu dersimizde ise 00-99 arası sayabilen bir sayıcı oluşturacağız. Eğer istenirse iki tane tek 7 segment display yanyana konularak da 00-99 sayıcı devresi yapılabilir. Ancak yapışık haldeki iki haneli 7 segment display i programlamakla arasında pek bir fark olmayacaktır. Bu iki haneli olan displayde abcdefg uçları ortaktır. Kicad programının kılıflarında ayrı ayrı gözükmüş ama aslında birleşiktir. Burdaki kılıf şeklinde bile olsa pic portlarını her halükarda ortak kullanırlar. Yani 1. display hanesinin a girişi ile 2. display hanesinin a girişi birleşip Port B0 a bağlanır. O yüzden kafanız karışmasın.

Bu displaydeki dikkat edeceğimiz hususlardan biride display hanelerinin aktiflenme portlarıdır. Port C0 ve Port C1 e bağlanan portlar aktifleme işlemini yapar. Bilindiği üzere biz bu display hanelerine veri göndereceğimiz zaman hane seçimine göre C0 veya C1 portlarından birini aktifleriz. Bu şekilde aktif olan (Lojik 1) display hanesine veri yazılabilir. İlk haneden sonra diğer haneye yazabilmek için bu haneyi aktif (lojik 1), diğer haneleri ise pasif (lojik 0) yapmamız gerekir. Ayrıca bir haneden diğerine geçiştede belirli bir süre aralığı bekleme yapmamız gerekmekte. Buradaki devrede denemelerimizde 10 ms ile isiste kararlı çalıştığı görüldü.

Bu kodla ilgili bir diğer dikkat edilecek husus ise Butona basılmanın algılanması ile birlikte Buton bırakılana kadar döngüde tutulma durumudur. Buda bize butona basıştaki arttırma yada azaltmanın birer birer yapılmasının kontrollü bir şekilde sağlar. Bu bir programlama tekniğidir. Projelerinizde tam buton kontrolünü sağlayabilir.

Sayigoster isimli fonksiyonumuzda dikkat çeken bir husus ise bir sayının onlar hanesinin alınması işleminin sayının 10 a bölümü ile çıkan bölüm sonucunun olmasıdır. Yani bölmenin bölüm sonucu onlar hanesidir. Aynı şekilde bir sayının 10 bölümünden kalan değer ise birler hanesini verir. Yine buda bir pratik programlama tekniğidir. Diğer kısımlari önceki derslerde tekrarladığımız için yinelemeye gerek görülmemiştir. Bir sonraki derste görüşmek üzere hoşçakalın.


duralikiraz.blogspot.com
23 Haziran 2015


Muvaffakiyet Allahtandır.”

Hiç yorum yok:

Yorum Gönder