Pic te Display Uçlarını konfigüre etmek... Acil Yardım Arkadaşlar....(LÜTFEN)

Başlatan artapon, 02 Ocak 2013, 22:56:09

artapon

Arkadaşlar ben PIC16F877 ile display sürmek istyorum. displayi resim 1 de olduğu zaman kolaylıkla sürebiliyorum. ama displayin pinlerinin yerini değiştirirnce nasıl sürebilirim. nasıl konfigüre edebilirim. bir türlü işin içindne çıkamadım... Lütfen acil yardımlarınıza ihtiyacım var...

Bu şekilde bağladığım zaman çok güzel çalışıyor... ama 2. resimde bağladığım zaman picin pinlerini nasıl konfigüre edeceğimi bilmiyorum .


Aşağıdaki şekilde bir bağlantı ile displayi kullanamk istiyorum. sizce programda nasıl bir değişiklik yapmam gerekiyor...
Aldanma İnsanların Samimiyetine, Menfaatleri İçin Gelirler Vecde, Vaad Etmeseydi Allah cenneti, O'na Bile Etmezlerdi Secde!   (NFK)

subram

http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

artapon

kodlar aşağıdaki gibidir.

/*******************************************************************************
*  Name    : PIC 16F877 İLE MODÜL KONTROLÜ                           ***********
             PORT_D DEN OKUNAN BİLGİ İŞLENİP PORT_B YE AKTARILACAK,  ***********
             DİJİTAL SES KONTROLÜ YAPILACAK VE GERİLİM ÖLÇÜLECEK.    ***********
*  Author  : AYETULLAH AKAR                                          ***********
*  Notice  : All Rights Reserved                                     ***********
*  E-mail  : artapon_49@hotmail.com                                  ***********
*  Date    : 91.12.2012                                              ***********
*  Version : 1.0                                                     ***********
*  Notes   :                                                         ***********
********************************************************************************/

#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

//***********Denetleyici konfigürasyon ayarları************
#device adc=10
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)        // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor
#use fast_io(a) //Port yönlendirme komutları A portu için geçerli
#use fast_io(b) //Port yönlendirme komutları B portu için geçerli
#use fast_io(c) //Port yönlendirme komutları C portu için geçerli
#use fast_io(d) //Port yönlendirme komutları D portu için geçerli
#use fast_io(e) //Port yönlendirme komutları E portu için geçerli

#define     display_1   pin_c1   // display_1 ifadesi pin_a0 ifadesine eşleniyor
#define     display_2   pin_c5   // display_2 ifadesi pin_a1 ifadesine eşleniyor
#byte       portd=0x09      // portD adresi burası bunu yaptıktan sonra bilgi=portd yazarsan portd bilgi içerisine atılır.

   char  birler=0;
   char  onlar=0;
   int16 sayac, rakam;
   char modul_oku;
   int16 adcsonuc, gerilim; // İşaretsiz 16 bitlik tam sayı tipinde değişken tanımlanıyor
   int i;
   
         // Ortak ANOT display için veri değerleri
//int digit[17]={63,6,91,79,102,109,125,7,127,111,119,56, 57, 94,121,113, 252};
//            [0 ,1,2 ,3 , 4 , 5 , 6 ,7, 8 , 9 , a , b ,c , d , e , f ,  b]

// Ortak ANOT display için veri değerleri
int digit[17]={160, 246, 152, 208, 198, 193, 129, 242, 128, 192, 119,56, 57, 94,121,113, 252};
//            [0 ,1,2 ,3 , 4 , 5 , 6 ,7, 8 , 9 , a , b ,c , d , e , f ,  b]


         // Ortak KATOT display için veri değerleri
//int digit[16]={192,249,164,176,153,146,130,248,128,144,136,199,198,161,134,142};
//              [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , a , L , c , d , e , f ]
      
 

void ekran()
         {    
        if (sayac<=1023)
            {
               sayac++; rakam=0;
               output_low(display_2);  // 2. display aktif durumda
               output_d(digit[birler]); // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_high(display_2);   // 2. display pasif durumda
               output_low(display_1);  // 1. display aktif durumda
               output_d(digit[onlar]);  // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_high(display_1);   // 1. display pasif durumda  
               }
                  else
                     {
                        if (rakam<=64)       //10 Saniye Süre içinde bir aktivite olmazsa Pic FF yapmaya Başlayacak.
                           {
                              rakam++;
                              output_low(display_1);  
                              output_high(display_2);   
                              output_d(64);       
                              delay_ms(10);       
                           }
                  else
                        {
                        rakam++;
                        if (rakam==128)
                           {
                              rakam=0;
                           }
                              output_low(display_2);  
                              output_high(display_1);
                              output_d(64);        
                              delay_ms(10);       
                        }
                     }
         }
      
      
void gerilim_oku()

          {
               set_adc_channel(0);   // RE0/AN5 ucundaki sinyal A/D işlemine tabi tutulacak
               delay_us(50);         // Kanal seçiminde sonra bu bekleme süresi verilmelidir
               adcsonuc=read_adc();     // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor

               gerilim=(0.0048875855*(1+adcsonuc))*20; //gerilim=((adcsonuc*5)/1024)*10;  // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor
      
               birler=gerilim%10;  // birler hanesi hesaplanıyor
               onlar=gerilim/10;   // onlar hanesi hesaplanıyor
      
                  if (gerilim>=42) //4.2v
                         {
                              birler=16;   // FULL BATTERY
                              onlar=15;
                         }
                    if (gerilim<=24) //2.4V
                         {
                              birler=16;   // LOW BATTERY
                              onlar=11;
                         }
      
               output_low(display_2);  // 2. display aktif durumda
               output_d(digit[birler]); // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_high(display_2);   // 2. display pasif durumda 
               output_low(display_1);  // 1. display aktif durumda
               output_d(digit[onlar]);  // displaye bilgi gönderiliyor
               output_high(PIN_B7);    //nokta
               delay_ms(5);             // gecikme veriliyor
               output_high(display_1);   // 1. display pasif durumda  
          
            }
     
      
     
      /********* ANA PROGRAM FONKSİYONU********/

void main ()
   { 
      setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
      setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
      setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
      setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
      setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
      setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   
         set_tris_a(0x01);    // A portu A0 GİRİŞ Diğer uçlar ÇIKIŞ olarak yönlendiriliyor
         set_tris_b(0xFF);    // B portu tümüyle GİRİŞ olarak yönlendiriliyor
         set_tris_c(0x81);    // C portu C0 ve C8 GİRİŞ gerisi tümüyle ÇIKIŞ olarak yönlendiriliyor
         set_tris_d(0x00);    // D portu tümüyle ÇIKIŞ olarak yönlendiriliyor
         set_tris_e(0x00);    // E portu tümüyle ÇIKIŞ olarak yönlendiriliyorş
   
         output_d(0x00);      // Port_B çıkışlarını 0 Yap
         
         setup_adc_ports(AN0);//setup_adc_ports(AN5) AN5 girişi analog giriş;sAN3|sAN4|VSS_VREF
         setup_adc(ADC_CLOCK_DIV_2);   // ADC clock frekansı Fadc=Fosc/2
         
         for(i=0;i<10;i++)
         {
         gerilim_oku();          // Gerilimi 3 saniye boyunca ekranda Okumak İçin Fonksiyona Git
         }
             

            while(TRUE) // ANA program döngüsü
               {
               
               // EEprom dan Data Oku Ve Ekrana Yaz.
               modul_oku=read_eeprom(0);
               birler=modul_oku%10;  // birler hanesi hesaplanıyor
               onlar=modul_oku/10;   // onlar hanesi hesaplanıyor
               output_d(digit[modul_oku]); // digit[modul_oku] değerini B portuna gönder
               delay_ms(5);      // 5 msn bekle
               ekran();
               
                  // Modülden Data Oku Ve Porta Aktar.
                  //modul_oku = (input(pin_B0)*0b00001000)+(input(pin_B1)*0b00000100)+(input(pin_B2)*0b00000010)+(input(pin_B3)*0b00000001)+(input(pin_B4)*0b10000000)+(input(pin_B5)*0b01000000)+(input(pin_B6)*0b00100000)+(input(pin_B7)*0b00010000);
               
                  // B PORTU KONFİGÜRE EDİLİDİP GİRİŞ SIRALAMASI DEĞİŞTİRİLDİ. 
                  
                  modul_oku=input_b();
                  //(0b00000001+input_d());  // d portunu oku değeri modul_oku değişkenine aktar.
                  
                  
                  write_eeprom(0,modul_oku);
                  birler=modul_oku%10;  // birler hanesi hesaplanıyor
                  onlar=modul_oku/10;   // onlar hanesi hesaplanıyor
                  output_d(digit[modul_oku]); // digit[modul_oku] değerini D portuna gönder
                  delay_ms(5);      // 5 msn bekle
                  ekran();
                  sayac=0;
                  
                  
/********************* Düşük Batarya Kontrol Birimi**************************/
                  if(!input(PIN_C0)) 
                  {
                     while (!input(PIN_C0))
                     {
                        sayac=0;
                        if (sayac<=1023)
                        {
                           sayac++; rakam=0;
                           output_high(display_1); 
                           output_b(0x03);   // ekrana b. yaz
                           delay_ms(5);            
                           output_low(display_1);  
                           output_high(display_2); 
                           output_b(0x47);   // ekrana L. yaz
                           delay_ms(5);          
                           output_low(display_2);
                        }
                     }
      
                  }
                  
       }// ana döngü sonu.
               
               
               
                
                  
   }
   
   
   
     
Aldanma İnsanların Samimiyetine, Menfaatleri İçin Gelirler Vecde, Vaad Etmeseydi Allah cenneti, O'na Bile Etmezlerdi Secde!   (NFK)

drmp

         // Ortak ANOT display için veri değerleri
//int digit[17]={63,6,91,79,102,109,125,7,127,111,119,56, 57, 94,121,113, 252};
//            [0 ,1,2 ,3 , 4 , 5 , 6 ,7, 8 , 9 , a , b ,c , d , e , f ,  b]

// Ortak ANOT display için veri değerleri
int digit[17]={160, 246, 152, 208, 198, 193, 129, 242, 128, 192, 119,56, 57, 94,121,113, 252};
//            [0 ,1,2 ,3 , 4 , 5 , 6 ,7, 8 , 9 , a , b ,c , d , e , f ,  b]


         // Ortak KATOT display için veri değerleri
//int digit[16]={192,249,164,176,153,146,130,248,128,144,136,199,198,161,134,142};
//              [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , a , L , c , d , e , f ]

bu aray satırındaki değerleri değiştirmen gerekiyor

artapon

Ortak ANOT display için veri değerleri
int digit[15]={24,   187,  148,  145,  51,   81,   80,   155,  16,   17,   247,  108,  96,   70};
                     [0,    1,      2,     3,     4,     5,     6,     7,      8,    9,     -,      L.     b.     F.]

bu satırdaki kodları değiştirerek sorunu çözdük. çözüm için bana yardım arkadaşa teşekkür ederim...
çözüm şu şekilde oluyor arkadaşlar...
kullandığım display 7 segment ortak anot display;
burda her segmentin normal değerinisegmentin yanına yazdım.
A        -       1
B        -       2
C        -       4
D        -       8
E        -       16
F        -       32
G        -       64
H        -       128

Normal bağlantıda "3" görebilmem için yanmasını istediğim segmentlere "0" bilgisi göndermemiz gerekiyor. yanmasını istemediğimiz segmentlere ise "1"  bilgisi göndermemiz gerekiyor. bu şekilde displayde "3" görebilmemiz için segment  değerlerini toplayacağız.

Displayde "3" yazması için yanmaması gereken segmentler "E", "F", "H" tır. bunların toplamı ise 176 dır. digit dizisinde 3. sıraya 176 yazarsak displayde 3 sayısını pice kodlamış oluruz.

Eğer benim yaptığım bağlantıda "3" sayısını görmek istiyorsak yine aynı şekilde yanmasını istemediğimiz segmenlerin decimal değerini toplayıp toplamı digit dizisine yazıyoruz...

YardımıcI olan arkadaşlara ve PROF AHMET BEY'e tekrar TEŞEKKÜR EDERİM...
Aldanma İnsanların Samimiyetine, Menfaatleri İçin Gelirler Vecde, Vaad Etmeseydi Allah cenneti, O'na Bile Etmezlerdi Secde!   (NFK)