CCS C 7 segment display problemi

Başlatan ilker58, 26 Aralık 2014, 04:08:26

ilker58

Merhabalar Değerli Üyeler,

CCS C de 7448 ve pic16f877 kullanarak 4 adet 7 segment displayı sürmeye çalışıyorum. Amacım ise basit; birler, onlar, yuzler ve binler basamaklarını ayrı ayrı tuşlarla artırıp azaltmak ve bunu displaylarda göstermek ne yazıkkı bir yerlerde hep aynı hatayı yapıyorum sanırım. Kod aşağıda mevcuttur. Bu konuda yardımlarınızı esirgemezseniz mutlu olurum.

#include <main.h>
#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(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

#define   arttir_birler      pin_a0   
#define   azalt_birler       pin_a1   
#define   arttir_onlar      pin_a2   
#define   azalt_onlar       pin_a3
#define   arttir_yuzler      pin_a4   
#define   azalt_yuzler      pin_a5
#define   arttir_binler      pin_e0   /
#define   azalt_binler      pin_e1


char birler=0, onlar=0,yuzler=0,binler=0,i=0,j=0,k=0,l=0;

// Ortak katot display için veri değerleri
const int digit[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};

  void main ()
{
 
   set_tris_a(0xFF);
set_tris_b(0x00);
   
   
   while(1)     // Sonsuz döngü
   {
        output_high(pin_c7);
       
       output_b(digit[birler]);
       
       delay_ms(5);
       
       output_low(pin_c6);
       
       output_high(pin_c6);
       
       output_b(digit[onlar]);
       
       delay_ms(5);
       
       output_low(pin_c6);
       
       output_high(pin_c5);
       
       output_b(digit[yuzler]);
       
       delay_ms(5);
       
       output_low(pin_c5);
       
       output_high(pin_c4);
       
       delay_ms(5);
       
       output_low(pin_c4);
       
       delay_ms(5);
       
       
       
       
       if(input(arttir_birler))
       {
        delay_ms(10);
        i++;
        if(i==10)
          i=0;
       birler=i%10;
       
        while(input(arttir_birler))
    {
    output_high(pin_c7);
       output_b(digit[birler]);
       delay_ms(5);
       output_low(pin_c7);
       output_high(pin_c6);
       output_b(digit[onlar]);
       delay_ms(5);
       output_low(pin_c6);
       output_high(pin_c5);
       output_b(digit[yuzler]);
       delay_ms(5);
       output_low(pin_c5);
       output_high(pin_c4);
       delay_ms(5);
       output_low(pin_c4);
   
    }
       
       
       }
       
      if(input(azalt_birler)&&(i!=0))
        {
          delay_ms(10);
          i--;
          birler=i%10;
           while(input(azalt_birler))
    {
    output_high(pin_c7);
       output_b(digit[birler]);
       delay_ms(5);
       output_low(pin_c7);
       output_high(pin_c6);
       output_b(digit[onlar]);
       delay_ms(5);
       output_low(pin_c6);
       output_high(pin_c5);
       output_b(digit[yuzler]);
       delay_ms(5);
       output_low(pin_c5);
       output_high(pin_c4);
       delay_ms(5);
       output_low(pin_c4);
   
    }
         
         
         
     
       }
     
   /*   --------------------------------------------------------------------------------------------*/
     
       if(input(arttir_onlar))
       {
        delay_ms(10);
        j++;
        if(j==10)
          j=0;
       birler=j%10;
        while(input(arttir_onlar))
    {
    output_high(pin_c7);
       output_b(digit[birler]);
       delay_ms(5);
       output_low(pin_c7);
       output_high(pin_c6);
       output_b(digit[onlar]);
       delay_ms(5);
       output_low(pin_c6);
       output_high(pin_c5);
       output_b(digit[yuzler]);
       delay_ms(5);
       output_low(pin_c5);
       output_high(pin_c4);
       delay_ms(5);
       output_low(pin_c4);
   
    }
       
       }
       
      if(input(azalt_onlar)&&(j!=0))
        {
          delay_ms(10);
          j--;
          onlar=j%10;
         
           while(input(azalt_onlar))
    {
    output_high(pin_c7);
       output_b(digit[birler]);
       delay_ms(5);
       output_low(pin_c7);
       output_high(pin_c6);
       output_b(digit[onlar]);
       delay_ms(5);
       output_low(pin_c6);
       output_high(pin_c5);
       output_b(digit[yuzler]);
       delay_ms(5);
       output_low(pin_c5);
       output_high(pin_c4);
       delay_ms(5);
       output_low(pin_c4);
   
         
    } 
     
       }
  /*---------------------------------------------------------------------------------------*/     
     
       if(input(arttir_yuzler))
       {
        delay_ms(10);
        k++;
        if(k==10)
          k=0;
       yuzler=k%10;
       
       while(input(arttir_yuzler))
    {
    output_high(pin_c7);
       output_b(digit[birler]);
       delay_ms(5);
       output_low(pin_c7);
       output_high(pin_c6);
       output_b(digit[onlar]);
       delay_ms(5);
       output_low(pin_c6);
       output_high(pin_c5);
       output_b(digit[yuzler]);
       delay_ms(5);
       output_low(pin_c5);
       output_high(pin_c4);
       delay_ms(5);
       output_low(pin_c4);
   
    }
       
       
       
       }
       
      if(input(azalt_yuzler)&&(k!=0))
        {
          delay_ms(10);
          k--;
          onlar=k%10;
     
        while(input(azalt_yuzler))
    {
    output_high(pin_c7);
       output_b(digit[birler]);
       delay_ms(5);
       output_low(pin_c7);
       output_high(pin_c6);
       output_b(digit[onlar]);
       delay_ms(5);
       output_low(pin_c6);
       output_high(pin_c5);
       output_b(digit[yuzler]);
       delay_ms(5);
       output_low(pin_c5);
       output_high(pin_c4);
       delay_ms(5);
       output_low(pin_c4);
   
       
       
    }
       
       
       
       
       
       
       }
     
   /* -------------------------------------------------------*/
     
       if(input(arttir_binler))
       {
        delay_ms(10);
        l++;
        if(l==10)
          l=0;
       binler=l%10;
       
       while(input(arttir_binler))
    {
    output_high(pin_c7);
       output_b(digit[birler]);
       delay_ms(5);
       output_low(pin_c7);
       output_high(pin_c6);
       output_b(digit[onlar]);
       delay_ms(5);
       output_low(pin_c6);
       output_high(pin_c5);
       output_b(digit[yuzler]);
       delay_ms(5);
       output_low(pin_c5);
       output_high(pin_c4);
       delay_ms(5);
       output_low(pin_c4);
   
    }
       
       
       
       }
       
      if(input(azalt_binler)&&(l!=0))
        {
          delay_ms(10);
          l--;
          binler=l%10;
     
       
    /*  ------------------------------------------------------------*/
   
   
    while(input(azalt_binler))
    {
    output_high(pin_c7);
       output_b(digit[birler]);
       delay_ms(5);
       output_low(pin_c7);
       output_high(pin_c6);
       output_b(digit[onlar]);
       delay_ms(5);
       output_low(pin_c6);
       output_high(pin_c5);
       output_b(digit[yuzler]);
       delay_ms(5);
       output_low(pin_c5);
       output_high(pin_c4);
       delay_ms(5);
       output_low(pin_c4);
   
    }
    }
   
   
    }
}



Saygılarla

vitruvius

Bu bütün kod mu bazı kısımları silip mi eklediniz? Bazı eksiklikler görüyorum çünkü. Mesela sigorta ayarları yok, gecikme fonksiyonu için kullanılan osilatör frekansı belli değil, kullanmadığınız birimleri (ADC, CCP, timer gibi) kapatmanız gerekir, e poru giriş, c portu çıkış ama bunu kodda belirtmemişsiniz vs.

Öncelikle tek basamak üzerinden işlem yapın, onu halledince basamak arttırırsınız. Bu şekilde takip zor olur. Ayrıca sorununuzu da belirtmemişsiniz. Ne gibi bir sorunla karşı karşıyasınız? Devreyi gerçekte mi deniyorsunuz yoksa simulasyonda mı? Devre şemanıza da bir bakalım.

ilker58

#2
Öncelikle zaman ayırdığınız için çok teşekkür ederim  vitruvius, on işlemci ayarlarını yapmadım ccs c nin son sürümlerinden birisini kullanıyorum. Bildiğim kadarıyla project wizard kısmından bu ayarları basit olarak yapıp kullanıcı için kolaylık sağlanmış sanırım. Osc frekansım 4 mhz sorunumun büyuk kısmını çözdüm şimdilik.
sorunum yukarıdaki kodda b portu çıkışında herhangi bir sinyal almamış olmamdı. şuan birler onlar yuzler ve binler basamağı için int değerinde i j k ve l yi atadım ancak tüm çıkışları b portu üzerinden yönlendiriyorum şuan istediğim gibi arttır ve azalt işlemlerini her display için ayrı ayrı gerçekleştirebilmeme rağmen gecikme süresinden dolayı displaylerin Katot uçlarını belli bir delay ile açıp kapatıyorum örneğin birler basamağı için 4. displayın ground bacağını aktif edip birler basamagı bilgisini i değişkeninden b portuna yönlendiriyorum. Sorunum bu delaylardan dolayı oluşan yanıp sonmeleri nasıl giderebilirim?? devre şeması ektedir.


Kodlar


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

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları

#use delay(clock=4000000) // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor

#define birler_arttir pin_A0 // "buton" adında "pin_A0" kelimesine eşit bir sabit tanımlanıyor
#define birler_azalt  pin_A1
#define onlar_arttir  pin_A2
#define onlar_azalt   pin_A3
#define yuzler_arttir pin_A4
#define yuzler_azalt pin_A5
#define binler_arttir pin_E0
#define binler_azalt pin_E1
int i,j,k,l;

const int digit[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
int birler,onlar,yuzler,binler;

/********* ANA PROGRAM FONKSİYONU********/

void main ()
{
set_tris_a(0xFF);
set_tris_b(0x00);



while(1) // Sonsuz döngü oluşturuluyor
{
output_high(pin_c0);
output_b(digit);
delay_ms(20);
output_low(pin_C0);
output_high(pin_c1);
output_b(digit[j]);
delay_ms(20);
output_low(pin_c1);
output_high(pin_c2);
output_b(digit[k]);
delay_ms(20);
output_low(pin_c2);
output_high(pin_c3);
output_b(digit[l]);
delay_ms(20);
output_low(pin_c3);







if(input(birler_arttir))
{

i++;
birler=i%10;
if(i>9)
i=0;


}

if(input(birler_azalt))
{

i--;
birler=i%10;
if(i<0)
i=0;


}


if(input(onlar_arttir))
{

j++;
onlar=j%10;
if(j>9)
j=0;


}

if(input(onlar_azalt))
{

j--;
onlar=j%10;
if(j<0)
j=0;


}

/*---------------------------------------------*/

if(input(yuzler_arttir))
{

k++;
yuzler=k%10;
if(k>9)
k=0;


}

if(input(yuzler_azalt))
{

k--;
yuzler=k%10;
if(k<0)
k=0;


}


/*--------------------------------------------*/

if(input(binler_arttir))
{

l++;
binler=l%10;
if(l>9)
l=0;


}

if(input(binler_azalt))
{

l--;
binler=l%10;
if(l<0)
l=0;


}







while(input(birler_arttir)|input(birler_azalt)|input(onlar_arttir)|input(onlar_azalt)|input(yuzler_arttir)|input(yuzler_azalt)|input(binler_arttir)|input(binler_azalt)){

output_high(pin_c0);
output_b(digit);
delay_ms(20);
output_low(pin_C0);
output_high(pin_c1);
output_b(digit[j]);
delay_ms(20);
output_low(pin_c1);
output_high(pin_c2);
output_b(digit[k]);
delay_ms(20);
output_low(pin_c2);
output_high(pin_c3);
output_b(digit[l]);
delay_ms(20);
output_low(pin_c3);


}

}

}

birler onlar yuzler ve binler basamağı değişkenleri başka bir döngü için programın devamında kullanılacağı için ekledim birde int i 0 dan küçük olamaz ancak yazmış bulunduk onu da düzelteceğim kusuruma bakmayın böyle kucuk hatalar oluyor gece yarısı yazınca

Saygılarla