avatar_jun

4 haneli sayıyı basamaklarına ayırma

Başlatan jun, 13 Ağustos 2021, 19:24:19

jun

Merhaba arkadaşlar arduino ile 7 segment sayıcı yapıyorum,sürücü olarak cd 4511 kullanıyorum.4 haneli bir sayıyı basamaklarına ayırıp dizi değişkende nasıl tutacağıma dair bir örnek verebilirmisiniz.
Teşekkürler

ete

#1
Sayı=2478
Binler=INT(SAYI/1000).....2478/1000=2:Sayı=Sayı-(Binler*1000)....2478-(2000)=478
Yuzler=INT(Sayı/100)...Yuzler=478/100=4 :Sayı=Sayı-(Yuzler*100)...478-400=78
Onlar =INT(Sayı/10) ...78/10=7  :Sayı=Sayı-(Onlar*10)...78-70=8
Birler=Sayı  ...8
Ben haneleri buldum sen de dizi değişkenine yerleştir istediğin gibi. Örnek istersen aşağıda,
Hane(0)=Birler, Hane(1)=Onlar, Hane(2)=Yuzler, Hane(3)=Binler
Değişkenlerin tamamı integer olmalı.
Değişkenler INT olursa ayrıca formüllerde INT(... kullanmaya gerek yoktur.
Basic de bu iş daha da kolay yapılıyor. Birler=SAYI DIG 0 denildiğinde birler hanesini almış oluyoruz. BINLER=SAYI DIG 3 komutu ile binler hanesini almış oluyoruz. Derleyici MOD alma işlemini yapabiliyorsa işlem biraz daha kısaltılabilir. Binler=Sayı/1000 ve Yüzler=(Sayı MOD 1000)/100 ve Onlar=(Sayı Mod/100)/10 ve Birler=Sayı Mod 10 şeklinde bulunabilir. Bu arada Mod alma işlemi sayının mod komutundan sonraki rakama bölünüp kalanı verir.

Ete

Hattuşa

basic kullanıyorsanız birde dig komutu vardır, proton için örnek

misal sayi adlı ve 1071 değerinde olsun

birler =Dig sayi,0
onlar  =Dig sayi,1
yuzler =Dig sayi,2
binler =Dig sayi,3

jun

Merhaba yardımlarınız için teşekkürler yazılımın loop bölümü aşağıdadır.
3. basamak olan yüzler hanesinde şöyle bir problem var yüzler hanesi 2 olması gerekirken 0, 3 olaması gerekirken 1, 6 olaması gerekirken 4, 7 olaması gerekirken 5, 8 olaması gerekirken 0, 9 olaması gerekirken 1 gösteriyor.
 void loop(){
  digitalWrite(mcured, HIGH); 
 state1 = digitalRead(artir);
 state2 = digitalRead(azalt);
 state3 = digitalRead(res_et);
 if(state1 == HIGH){
 
        int ekle =0;
        while(state1==1){
        sayi=sayi+1;
          ekle=ekle+1;
          if(ekle==8)
              {
              // z=50;
              z=150;
                }
          //display.printNumber(sayi);
          Binler = sayi /1000;
          Yuzler = (sayi % 1000) /100;
          Onlar =  (sayi % 100) /10;
          Birler = sayi % 10;                              
 
          disp1(Birler);
          disp2(Onlar);
          disp3(Yuzler);
          disp4(Binler);
          delay(z);
            state1 = digitalRead(artir);
                    }  
 }

 if(state2 == HIGH){
  
        int ekle =0;
        while(state2==1){
        sayi=sayi-1;
          ekle=ekle+1;
          if(ekle==8)
              {
              // z=50;
              z=150;
                }
          //display.printNumber(sayi);
          Binler = sayi /1000;
          Yuzler = (sayi % 1000) /100;
          Onlar =  (sayi % 100) /10;
          Birler = sayi % 10;                      
 
          disp1(Birler);
          disp2(Onlar);
          disp3(Yuzler);
          disp4(Binler);
          delay(z);
            state2 = digitalRead(azalt);
                    }  
 }

 if(state3 == HIGH){
  
        sayi=0;        
          
                      
 }
 
 if(sayi==2000){
  sayi=0;
 }



 
          Binler = sayi /1000;
          Yuzler = (sayi % 1000) /100;
          Onlar =  (sayi % 100) /10;
          Birler = sayi % 10        ;                      
 
          disp1(Birler);
          disp2(Onlar);
          disp3(Yuzler);
          disp4(Binler);
 delay(100);//100 ms delay to debounce
 
}

void disp1(int num){
  if(num == 0)//0000
  {
    digitalWrite(x1a, LOW); 
    digitalWrite(x1b, LOW);
    digitalWrite(x1c, LOW);
    digitalWrite(x1d, LOW);
  }
  if(num == 1)//0001
  {
    digitalWrite(x1a, HIGH);
    digitalWrite(x1b, LOW);
    digitalWrite(x1c, LOW);
    digitalWrite(x1d, LOW);
  }
  if(num == 2)//0010
  {
    digitalWrite(x1a, LOW);//0
    digitalWrite(x1b, HIGH);//1
    digitalWrite(x1c, LOW);//0
    digitalWrite(x1d, LOW);//0
  }
  if(num == 3)//0011
  {
    digitalWrite(x1a, HIGH);//1
    digitalWrite(x1b, HIGH);//1
    digitalWrite(x1c, LOW);//0
    digitalWrite(x1d, LOW);//0
  }
  if(num == 4)//0100
  {
    digitalWrite(x1a, LOW);//0
    digitalWrite(x1b, LOW);//0
    digitalWrite(x1c, HIGH);//1
    digitalWrite(x1d, LOW);//0
  }
  if(num == 5)//0101
  {
    digitalWrite(x1a, HIGH);//1
    digitalWrite(x1b, LOW);//0
    digitalWrite(x1c, HIGH);//1
    digitalWrite(x1d, LOW);//0
  }
  if(num == 6)//0110
  {
    digitalWrite(x1a, LOW);//0
    digitalWrite(x1b, HIGH);//1
    digitalWrite(x1c, HIGH);//1
    digitalWrite(x1d, LOW);//0
  }
  if(num == 7) //0111
  {
    digitalWrite(x1a, HIGH);//1
    digitalWrite(x1b, HIGH);//1
    digitalWrite(x1c, HIGH);//1
    digitalWrite(x1d, LOW);//0
  }
  if(num == 8) //1000
  {
    digitalWrite(x1a, LOW);//0
    digitalWrite(x1b, LOW);//0
    digitalWrite(x1c, LOW);//0
    digitalWrite(x1d, HIGH);//1
  }
  if(num == 9)//1001
  {
    digitalWrite(x1a, HIGH);//1
    digitalWrite(x1b, LOW);//0
    digitalWrite(x1c, LOW);//0
    digitalWrite(x1d, HIGH);//1
  }
}

void disp2(int num)
{  
  if(num == 0)//0000
  {
    digitalWrite(x2a, LOW);//
    digitalWrite(x2b, LOW);//0
    digitalWrite(x2c, LOW);//0
    digitalWrite(x2d, LOW);//0
  }
  if(num == 1)//0001
  {
    digitalWrite(x2a, HIGH);//1
    digitalWrite(x2b, LOW);//0
    digitalWrite(x2c, LOW);//0
    digitalWrite(x2d, LOW);//0
  }
  if(num == 2)//0010
  {
    digitalWrite(x2a, LOW);//0
    digitalWrite(x2b, HIGH);//1
    digitalWrite(x2c, LOW);//0
    digitalWrite(x2d, LOW);//0
  }
  if(num == 3)//0011
  {
    digitalWrite(x2a, HIGH);//1
    digitalWrite(x2b, HIGH);//1
    digitalWrite(x2c, LOW);//0
    digitalWrite(x2d, LOW);//0
  }
  if(num == 4)//0100
  {
    digitalWrite(x2a, LOW);//0
    digitalWrite(x2b, LOW);//0
    digitalWrite(x2c, HIGH);//1
    digitalWrite(x2d, LOW);//0
  }
  if(num == 5) //0101
  {
    digitalWrite(x2a, HIGH);//1
    digitalWrite(x2b, LOW);//0
    digitalWrite(x2c, HIGH);//1
    digitalWrite(x2d, LOW);//0
  }
  if(num == 6) //0110
  {
    digitalWrite(x2a, LOW);//0
    digitalWrite(x2b, HIGH);//1
    digitalWrite(x2c, HIGH);//1
    digitalWrite(x2d, LOW);//0
  }
  if(num == 7) //0111
  {
    digitalWrite(x2a, HIGH);//1
    digitalWrite(x2b, HIGH);//1
    digitalWrite(x2c, HIGH);//1
    digitalWrite(x2d, LOW);//0
  }
  if(num == 8) //1000
  {
    digitalWrite(x2a, LOW);//0
    digitalWrite(x2b, LOW);//0
    digitalWrite(x2c, LOW);//0
    digitalWrite(x2d, HIGH);//1
  }
  if(num == 9)//1001
  {
    digitalWrite(x2a, HIGH);//1
    digitalWrite(x2b, LOW);//0
    digitalWrite(x2c, LOW);//0
    digitalWrite(x2d, HIGH);//1
  }
}

void disp3(int num)
{  
  if(num == 0)//0000
  {
    digitalWrite(x3a, LOW);//
    digitalWrite(x3b, LOW);//0
    digitalWrite(x3c, LOW);//0
    digitalWrite(x3d, LOW);//0
  }
  if(num == 1)//0001
  {
    digitalWrite(x3a, HIGH);//1
    digitalWrite(x3b, LOW);//0
    digitalWrite(x3c, LOW);//0
    digitalWrite(x3d, LOW);//0
  }
  if(num == 2)//0010
  {
    digitalWrite(x3a, LOW);//0
    digitalWrite(x3b, HIGH);//1
    digitalWrite(x3c, LOW);//0
    digitalWrite(x3d, LOW);//0
  }
  if(num == 3)//0011
  {
    digitalWrite(x3a, HIGH);//1
    digitalWrite(x3b, HIGH);//1
    digitalWrite(x3c, LOW);//0
    digitalWrite(x3d, LOW);//0
  }
  if(num == 4)//0100
  {
    digitalWrite(x3a, LOW);//0
    digitalWrite(x3b, LOW);//0
    digitalWrite(x3c, HIGH);//1
    digitalWrite(x3d, LOW);//0
  }
  if(num == 5) //0101
  {
    digitalWrite(x3a, HIGH);//1
    digitalWrite(x3b, LOW);//0
    digitalWrite(x3c, HIGH);//1
    digitalWrite(x3d, LOW);//0
  }
  if(num == 6) //0110
  {
    digitalWrite(x3a, LOW);//0
    digitalWrite(x3b, HIGH);//1
    digitalWrite(x3c, HIGH);//1
    digitalWrite(x3d, LOW);//0
  }
  if(num == 7) //0111
  {
    digitalWrite(x3a, HIGH);//1
    digitalWrite(x3b, HIGH);//1
    digitalWrite(x3c, HIGH);//1
    digitalWrite(x3d, LOW);//0
  }
  if(num == 8) //1000
  {
    digitalWrite(x3a, LOW);//0
    digitalWrite(x3b, LOW);//0
    digitalWrite(x3c, LOW);//0
    digitalWrite(x3d, HIGH);//1
  }
  if(num == 9)//1001
  {
    digitalWrite(x3a, HIGH);//1
    digitalWrite(x3b, LOW);//0
    digitalWrite(x3c, LOW);//0
    digitalWrite(x3d, HIGH);//1
  }
}

void disp4(int num)
{  
  if(num == 0)//0000
  {
    digitalWrite(x4a, LOW);//
    digitalWrite(x4b, LOW);//0
    digitalWrite(x4c, LOW);//0
    digitalWrite(x4d, LOW);//0
  }
  if(num == 1)//0001
  {
    digitalWrite(x4a, HIGH);//1
    digitalWrite(x4b, LOW);//0
    digitalWrite(x4c, LOW);//0
    digitalWrite(x4d, LOW);//0
  }
  if(num == 2)//0010
  {
    digitalWrite(x4a, LOW);//0
    digitalWrite(x4b, HIGH);//1
    digitalWrite(x4c, LOW);//0
    digitalWrite(x4d, LOW);//0
  }
  if(num == 3)//0011
  {
    digitalWrite(x4a, HIGH);//1
    digitalWrite(x4b, HIGH);//1
    digitalWrite(x4c, LOW);//0
    digitalWrite(x4d, LOW);//0
  }
  if(num == 4)//0100
  {
    digitalWrite(x4a, LOW);//0
    digitalWrite(x4b, LOW);//0
    digitalWrite(x4c, HIGH);//1
    digitalWrite(x4d, LOW);//0
  }
  if(num == 5) //0101
  {
    digitalWrite(x4a, HIGH);//1
    digitalWrite(x4b, LOW);//0
    digitalWrite(x4c, HIGH);//1
    digitalWrite(x4d, LOW);//0
  }
  if(num == 6) //0110
  {
    digitalWrite(x4a, LOW);//0
    digitalWrite(x4b, HIGH);//1
    digitalWrite(x4c, HIGH);//1
    digitalWrite(x4d, LOW);//0
  }
  if(num == 7) //0111
  {
    digitalWrite(x4a, HIGH);//1
    digitalWrite(x4b, HIGH);//1
    digitalWrite(x4c, HIGH);//1
    digitalWrite(x4d, LOW);//0
  }
  if(num == 8) //1000
  {
    digitalWrite(x4a, LOW);//0
    digitalWrite(x4b, LOW);//0
    digitalWrite(x4c, LOW);//0
    digitalWrite(x4d, HIGH);//1
  }
  if(num == 9)//1001
  {
    digitalWrite(x4a, HIGH);//1
    digitalWrite(x4b, LOW);//0
    digitalWrite(x4c, LOW);//0
    digitalWrite(x4d, HIGH);//1
  }
}

Hattuşa

#4
 Binler = sayi /1000;
          Yuzler = (sayi % 1000) /100;
          Onlar =  (sayi % 100) /10;
          Birler = sayi % 10;                      
 

yularıdaki kodun yerine şu şekilde deneyin

diyelim ki elimizde deger =1453 olsun ve biz bunu basamaklara ayıralım

sayi =deger;  //öncelikle elimizdeki deger değişkeninin bozulmasını istemediğimiz için başka bir değişkene attık

binler =sayi/1000; //binler basamağını belirledik,binler =1453/1000 =>binler =1 oldu
sayi =sayi -(binler *1000);  //yüzler basamağını bulmak için sayi değişkeninden binler hanesini çıkardık sayi =1453 -(1*1000) =>sayi =453 
yuzler =sayi /100; //yuzler basamağını bulduk, yuzler =453 /100 =>yuzler =4 oldu
sayi =sayi -(yuzler *100); // onlar basamağını bulmak için yuzler basamağını çıkardık,sayi =453-(4*100) => sayi =53 
onlar =sayi /10;  //onlar basamağını bulduk, onlar =53/10 => onlar =5 oldu
birler =sayi -(onlar *10); //birler basamağı bulundu, birler =53 -(5*10) =>birler =3 oldu




NOT: ETE hocam 2 mesaj önce vermiş kendisinden özür dilerim dikkatsizlik yaptığım için


jun

Cevabınız için teşekkür ederim sabit değer atadığımda sıkıntı yok lakin butona basıp 0 dan başlatıp artırma yaptığımda sayı yüzler basamağına gelince tekrar sapıtıyor anlamadım gitti nerede hata yapıyorum

ete

Bu sorunun muhtemel sebebi kullandığınız değişkenin Byte cinsinden olmasıdır. Byte değişkenleri maksimum 255 sayısını tutabilirler. Sayı artmaya devam ederse 255 den sonra sayı sıfırlanıp yeniden 1 den itibaren artmaya devam eder. Değişken tipini Word yapmanız gerekir.

Ete

jun

Merhaba ete hocam devreyi reelde pcb üstüne kurmuştum.yüzler hanesindeki cd4511 in iki bacağı gözle görülmeyecek kadar ince bir şekilde bakır plaka tarafından kısa devre olduğu için bu hatayı veriyormuş.Destekleriniz için çok teşekkür ederim

alisumer

şu basamak ayırma işini birde ASM de yapacak olan varmı canıma okudu insan komutların içine bölme ve çarpma işlemi koymazmı sin cos bile var nasıl kafadır.
Hep meraktan

Powered by EzPortal