C de programlama mantığı sorunu.

Başlatan blackcat, 28 Nisan 2013, 16:23:23

blackcat

16f628 li bir devre yapıyorum pice bağlı 10 tane buton var, 1-9 arasındaki butonlara basılınca bunları sırasıyla hafızada tutacak. 10. butona basınca, her basışta en son basılan numarayı pin_a0 ve pin_a1 ile 74164 e godnerecek, 74164 e bağlı displayde numarayı gösterecek. Aşağıdaki kodu kendi mantığıma göre yazdım. Bana göre doğru ama isiste çalışmıyor. (Çalışıyor ama butonalara basma sayısını gösteriyor  ;D) Acaba nerde yanlıs yaptım...
isis şeması http://www.dosya.tc/server6/VvFny1/628.rar.html

#include <son.h>
#use fast_io(b)
#define buton1 pin_b0
#define buton2 pin_b1
#define buton3 pin_b2
#define buton4 pin_b3
#define buton5 pin_b4
#define buton6 pin_b5
#define buton7 pin_b6
#define buton8 pin_b7
#define buton9 pin_a2
#define buton10 pin_a3
#define data pin_a0
#define clock pin_a1
int digit[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x6F};
int sira[40];
int i;
int j;
int z;
int t;
void buton_kayit(int x)
{  
for (i=0;i<40;i++)
   {
      if(sira[i]==0)
       {sira[i]=x;
        break;
        }
    }
}
void veri_gonder(int y)
{
   for(j=0;j<8;j++)
      {
       output_bit(data,bit_test(digit[y],j));
       output_high(clock);
       output_low(clock);
      }
 return;
}
void main()
{
set_tris_b(0b11111111);
set_tris_a(0b11100);
for(z=0;z<40;z++)
{sira[z]=0;
}
 while(TRUE)
   {
   if (input(buton1))
   {buton_kayit(1);
   while (input(buton1))
   {
   }
   }
   if (input(buton2))
   {buton_kayit(2);
   while (input(buton2))
   {
   }
   }
   if (input(buton3))
   {buton_kayit(3);
   while (input(buton3))
   {
   }
   }
   if (input(buton4))
   {buton_kayit(4);
   while (input(buton4))
   {
   }
   }
   if (input(buton5))
   {buton_kayit(5);
   while (input(buton5))
   {
   }
   }
   if (input(buton6))
   {buton_kayit(6);
   while (input(buton6))
   {
   }
   }
   if (input(buton7))
   {buton_kayit(7);
   while (input(buton7))
   {
   }
   }
   if (input(buton8))
   {buton_kayit(8);
   while (input(buton8))
   {
   }
   }
   if (input(buton9))
   {buton_kayit(9);
   while (input(buton9))
   {
   }
   }
   if(input(buton10))
   {delay_ms(50);
      for(t=40;t>0;t--)
         {  
            if(sira[t]!=0)
               {
         veri_gonder(sira[t]);
         sira[t]=0;
            while(input(buton10))
         {
         }
         break;   
              }
         }
   }
   }
}

blackcat

programın basşına #use fast_io(a) ekledim,
biraz düzeldi ama buton10 a ilk basışta 1 rakamı sonraki basışta basılan rakam görünüyo.

blackcat

Sonunda düzelttim ama son bi sorun kaldı sira[] dizisine aynı butona her basışta kayıt yapıyor onu düzeltemedim daha.Son hali bu.
#include <son.h>
#use fast_io(b)
#use fast_io(a)
#define buton1 pin_b0
#define buton2 pin_b1
#define buton3 pin_b2
#define buton4 pin_b3
#define buton5 pin_b4
#define buton6 pin_b5
#define buton7 pin_b6
#define buton8 pin_b7
#define buton9 pin_a2
#define buton10 pin_a3
#define data pin_a0
#define clock pin_a1
int digit[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x6F};
int sira[40];
int i=0;
int j=0;
int z=0;
signed int t=0;
int y=0;
void buton_kayit(int x)
{ 
for (i=0;i<40;i++)
   {
       if(sira[i]==0)
       {sira[i]=x;
       i=0;
       break;
        }
    }
}
void veri_gonder(int y)
{
   for(j=0;j<8;j++)
      {
       output_bit(data,bit_test(digit[y],j));
       output_high(clock);
       output_low(clock);
      }
 return;
}
void main()
{
set_tris_b(0b11111111);
set_tris_a(0b11100);
for(z=0;z<=40;z++)
{sira[z]=0;
}
 while(TRUE)
   {
   if (input(buton1))
   {buton_kayit(1);
   veri_gonder(1);
   while (input(buton1))
   {
   }
   }
   if (input(buton2))
   {buton_kayit(2);
   veri_gonder(2);
   while (input(buton2))
   {
   }
   }
   if (input(buton3))
   {buton_kayit(3);
   veri_gonder(3);
   while (input(buton3))
   {
   }
   }
   if (input(buton4))
   {buton_kayit(4);
   veri_gonder(4);
   while (input(buton4))
   {
   }
   }
   if (input(buton5))
   {buton_kayit(5);
   veri_gonder(5);
   while (input(buton5))
   {
   }
   }
   if (input(buton6))
   {buton_kayit(6);
   veri_gonder(6);
   while (input(buton6))
   {
   }
   }
   if (input(buton7))
   {buton_kayit(7);
   veri_gonder(7);
   while (input(buton7))
   {
   }
   }
   if (input(buton8))
   {buton_kayit(8);
   veri_gonder(8);
   while (input(buton8))
   {
   }
   }
   if (input(buton9))
   {buton_kayit(9);
   veri_gonder(9);
   while (input(buton9))
   {
   }
   }
   if(input(buton10))
   {delay_ms(50);
      for(t=40;t>(-1);t--)
         {  
            if(sira[t]!=0)
               {
         veri_gonder(sira[t]);
         sira[t]=0;
         while(input(buton10))
         {
         }
         t=40;
         break;   
              }
         veri_gonder(0);
         }
         }
   }
}



bu kodun bir kısmını aşağıdaki gibi değiştiriyorum ama isteğim gibi çalışmıyor. Burada if kısmında mantık hatası varmı???
void buton_kayit(int x)
{ 
for (i=0;i<40;i++)
   {
       if((sira[i]==0)&&(sira[i]!=x))
       {sira[i]=x;
       i=0;
       break;
        }
    }
}

Mr.Java

Ben ne yapmaya çalıştığınızı anlamadım lakin bool komutunu kullanabilirsiniz.Butonların hepsine değer verin 0 başlangıçta.Yani false basıldığında 1 olacağı için true.Eğer True ise falan filan daha kısa olur.

Gökhan BEKEN

Bu kısım işi uzatıyor iyi bir yöntem değil. Her seferinde burda veri var mı yok mu diye kontrol edip, boş görünce haa bura boşmuş buraya yerleşiyim gibi bir fikriyatı tutmadım ben.
void buton_kayit(int x)
{  
for (i=0;i<40;i++)
   {
      if(sira[i]==0)
       {sira[i]=x;
        break;
        }
    }
}


Ana fonksiyonda sonsuz döngü ile butonları kontrol edersiniz. Butonlardan birisi tetiklendiğinde dizi=buton_no gibi bir atama yaparsınız ve  i değerini 1 artırırsınız. Daha az kaynak kullanmış olursunuz.

Algoritma şu:
anafonsiyon
{
     i=0;
     k=10; //10 tane buton olduğu için
     sonsuz_döngü
     {
           eğer 1-9 arası herhangi bir butona basılmışsa
           {
                 buton_kayıt_dizisi[i]=basılan_butonun_adı;
                 i++;
           }
           eğer 10.butona basılmışsa
           {
                displayde_goster=digit[i-k]; // "i" adet kayıt olduğuna göre. Butona kaç kere basıldığını "k" ile tuttuğuma göre, i-k ile her basışta sırayla eksilen bir sıralama ile displayde gösterebilirsiniz

                k--; //k değişkenini 1 eksilttik
           }
        
     }

}
Özel mesaj okumuyorum, lütfen göndermeyin.