7 Segment Display'e Rakam değil Sayı yazdırmak için bir çözüm yolu.

Katılım
18 Ocak 2008
Mesajlar
1,069
Puanları
156
Yaş
39
Tekrar herkese selamun aleyküm bir konu daha açtım ama aslında bu konu bir önceki konum olan " Max7219 ve Pic16F877A ile yaptığım 8 hane 7 segment display sürmek için örnek bir proje " ile bire bir bağlantılı olacaktır....

Bu konuyu araştırırken sevip saydığım işin ehli bir abime sordum onun anlattığı yöntem hoşuma gitti örnekleri de gönderince olayı çözüp uygulamamı bir önceki Max7219 ve Pic16F877A ile yaptığım 8 hane 7 segment display sürmek için örnek bir proje isimli projede kullandığım 8 hane 7 segment display ekranında uyguladım. Ama dedim ki bunu paylaşmalıyım çünkü önemli bir konu ve buna ihtiyaç duyabilecek birileri mutlaka çıkacaktır.

Ben elimde 8 hane 7 segment display olduğu için 10 milyonlar değerine kadar sayı yazdırabileceğim bir yazılım yaptım ama mantık anlaşıldıktan sonra istediğiniz kadar genişletebilirsiniz...

Program :

Kod:
sbit Chip_Select at RC0_bit;
sbit Chip_Select_Direction at TRISC0_bit;

unsigned long     sayi,deger;
unsigned char      birler,onlar,yuzler,binler,onbinler,yuzbinler,milyonlar,onmilyonlar;

void     hesapla(void){

birler=0;
onlar=0;
yuzler=0;
binler=0;
onbinler=0;
yuzbinler=0;
milyonlar=0;
onmilyonlar=0;

cevir_1:

         if        (sayi>=10000000){
                   sayi=sayi-10000000;
                   onmilyonlar=onmilyonlar+1;
         goto      cevir_1; }

cevir_2:
         if        (sayi>=1000000){
                   sayi=sayi-1000000;
                   milyonlar=milyonlar+1;
         goto      cevir_2; }

cevir_3:
         if        (sayi>=100000){
                   sayi=sayi-100000;
                   yuzbinler=yuzbinler+1;
         goto      cevir_3;}

cevir_4:
        if         (sayi>=10000){
                   sayi=sayi-10000;
                   onbinler=onbinler+1;
        goto       cevir_4;}

cevir_5:
        if         (sayi>=1000){
                   sayi=sayi-1000;
                   binler=binler+1;
        goto       cevir_5;}

cevir_6:
        if         (sayi>=100){
                   sayi=sayi-100;
                   yuzler=yuzler+1;
        goto       cevir_6;}

cevir_7:
        if         (sayi>=10){
                   sayi=sayi-10;
                   onlar=onlar+1;
        goto       cevir_7;}
        birler=sayi;
}

void     yaz(){
            Chip_select=0;
            spi1_Write(0x01); //1'ler basamağı display yazma adresi 0x01- 10'lar basamağı displayı 0x02 gibi 1 artarak gider
            spi1_Write(birler);// eğer bir rakamın yanında nokta işareti göstermek isterseniz
            //rakamdan önce 8 göndermeniz gerek örneğin 0x89 gönderirseniz 9. şeklinde görürsünüz.
            Chip_select=1;

            Chip_select=0;
            spi1_Write(0x02); //1'ler basamağı display yazma adresi 0x01- 10'lar basamağı displayı 0x02 gibi 1 artarak gider
            spi1_Write(onlar);
            Chip_select=1;

            Chip_select=0;
            spi1_Write(0x03); //1'ler basamağı display yazma adresi 0x01- 10'lar basamağı displayı 0x02 gibi 1 artarak gider
            spi1_Write(yuzler);
            Chip_select=1;

            Chip_select=0;
            spi1_Write(0x04); //1'ler basamağı display yazma adresi 0x01- 10'lar basamağı displayı 0x02 gibi 1 artarak gider
            spi1_Write(binler);
            Chip_select=1;

            Chip_select=0;
            spi1_Write(0x05); //1'ler basamağı display yazma adresi 0x01- 10'lar basamağı displayı 0x02 gibi 1 artarak gider
            spi1_Write(onbinler);
            Chip_select=1;

            Chip_select=0;
            spi1_Write(0x06); //1'ler basamağı display yazma adresi 0x01- 10'lar basamağı displayı 0x02 gibi 1 artarak gider
            spi1_Write(yuzbinler);
            Chip_select=1;

            Chip_select=0;
            spi1_Write(0x07); //1'ler basamağı display yazma adresi 0x01- 10'lar basamağı displayı 0x02 gibi 1 artarak gider
            spi1_Write(milyonlar);
            Chip_select=1;

            Chip_select=0;
            spi1_Write(0x08); //1'ler basamağı display yazma adresi 0x01- 10'lar basamağı displayı 0x02 gibi 1 artarak gider
            spi1_Write(onmilyonlar);
            Chip_select=1;
            }

max_7219_kur(){
  Chip_Select = 1;                        // DAC seçimini kaldırın
  Chip_Select_Direction = 0;             // CS # pinini Output olarak ayarla

            Chip_select=0;
            spi1_write(0x0A);// DİSPLAY TARAMA HIZINI BELİRLEYEN ADRES ( OSİLATÖR BÖLME ORANI DATASHEET'E BAK )
            spi1_write(0xff);// BÖLME ORANI 31/32
            Chip_select=1;

            Chip_select=0;
            spi1_write(0x0B);// DİSPLAY AKTİF ETME DEĞERİ YANİ 8 DİSPLAYDAN KAÇ TANE AKTİF EDİLMEK İSTENİYORSA BU ADRES BELİRLER
            spi1_write(0x07);// 0X00 DEĞERİ SADECE 1'LER BASAMAĞINDAKİ DİSPLAYI AKTİF EDER. 0X07 BÜTÜN BASAMAK DİSPLAYLERİ AKTİF EDER
            Chip_select=1;

            Chip_select=0;
            spi1_write(0x0C);//DSİPLAYLERE VERİ YOLLAMAYI AÇMA VE KAPAMA BİTİ
            spi1_write(0x01);//0X00 OLURSA DİSPLAYLER KAPALI 0X01 OLURSA DİSPLAYLER AÇIK MODDADIR.
            Chip_select=1;

            Chip_select=0;
            spi1_write(0x0F);//DİSPLAY TEST MODU REGİSTERİ
            spi1_write(0x00);//0X00 OLURSA TEST MODU KAPALI KONUMDA OLUR 0X01 OLURSA BÜTÜN DİPLYALARIN BÜTÜN DİJİTLERİNİ YAKAR
            Chip_select=1;

            Chip_select=0;
            spi1_write(0x09);//KOD ÇÖZME MODU KAYIT ÖRNEKLERİ REGİSTERİ
            spi1_write(0xFF);
            Chip_select=1; ///++++++++
}
void main() {
     adcon1=7;
     trisa=255;
     trisb=0;
     trisc=0;
     trisd=0;
     trise=255;
     sayi=0;
     deger=0;
     Chip_Select = 1;                       // Deselect DAC
     Chip_Select_Direction = 0;             // Set CS# pin as Output
     SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
     max_7219_kur();
     while(1){
                    hesapla();
                    yaz();
                    deger++;
                    sayi=deger;
                    delay_ms(500);  }}

Programdan da anlaşılacağı gibi

while(1){
hesapla();
yaz();
deger++;
sayi=deger;
delay_ms(500); }

sonsuz döngüsünün içerisinde önce hesapla alt programı çağırılmış yani sistem önce sayının değerini hesaplamış sonra yaz alt programı çağrılmış ve bu yaz alt programında da birler onlar yüzler gibi basamakları diplaylerin adreslerine göndermiş.

Sonra deger değişkeni 1 arttırılıp sayi=deger demişiz burası önemli çünkü sayi değişkeni hesapla alt programının içinde işleme tabii tutulduğu için istediğimiz sonucu elde edemiyoruz... Bu yüzden sayi değişkenini deger isimli değişkene eşitlemiş oluyoruz...

Burada bütün durum hesapla alt programının içerisinde anlatılıyor yani ekrana yazdırılmak istenen sayı hesapla alt programı içerisinde dijitlere parçalanmış oluyor.

Genel olarak mantık çok güzel bir şekilde ele alınmış sayi>= 10 milyonsa sayidan 10 milyon çıkar ve on milyonlar değişkenini 1 arttır bu şekilde sayinin içinde kaç tane on milyon varsa tespit ediliyor ardından bir alt basamağa geçiliyor...

Umarım işine yarayan kimse olur saygılarımla...
 

Forum istatistikleri

Konular
128,188
Mesajlar
915,703
Kullanıcılar
449,956
Son üye
CharmanDear

Yeni konular

Geri
Üst