CCS PicC'de 32bit sayı nasıl BCD'ye çevirilir?

Başlatan SüleymanKara, 08 Ağustos 2004, 18:23:12

SüleymanKara

CCS PicC'de 32bit sayıyı BCD formatına çevirmek için herhangi bir fonksiyon var mı ?
Yoksa 32 bit sayıyı nasıl BCD formatına çevirebilirim?

arif

dg0 = MAKE8(ms,3);
     dg1 = MAKE8(ms,2);
     dg2 = MAKE8(ms,1);
     dg3 = MAKE8(ms,0);

dg0...dg3  int8
ms=float yada int32 olabilir
kolay gelsin..

SüleymanKara

Yazdığım bir programda elde ettiğim 32bit'lik bir sayıyı 7 segment display'e vermem gerekiyordu.Ondan bu soruyu sormuştum. Aslında soru biraz hatalı BCD'ye çevirmek gerekmiyor, Decimal'e çevirsem yeter.

Arif bahsettiğin "Make8" komutu int32'nin istenen byte'lık kısmını mı alıyor ? Öyleyse 32 bit'lik bir sayıyı bu komutla BCD'ye çeviremeyiz.
Çünkü 32 bitlik işaretsiz bir sayı en fazla 4294967295 değerini alır yani her bir BCD değerini 8bitlik değişkene yüklersek 10 byte a ihtiyaç duyarız.

Şöyle bir programla BCD olmasa da decimal'e çevirebiliriz sanırım. Yanılıyorsam düzeltin.

for (i=0;i<10;i++)
 {
   c=b%10;
   b=b-c;
   b=b/10;
 }

"b" 32 bitlik bir sayı
c[] ise Decimal değerlerin yer aldığı matris.

Erkan Gench

şöyle bir tanımlama yapalım

int32 a=4180987876;

a sayısını lcd'ye yazdırmak için aşağıdaki komutu kullanırsınız.

printf(lcd_putc,"%lu",a);   //%lu işaretsiz sayı için %ld işaretli sayı için

fakat istediğiniz sayıyı 7 segmenli göstergeye yazmak olduğuna göre yapacağınız printf komutunun içindeki 'lcd_putc' yerine kendi fonksiyonunuzu yazmak.

printf komutunun yaptığı şey verdiğiniz değerleri formatlayarak bayt bayt çıkış birimine göndermektir (burada çıkış birimi lcd_putc fonsiyonu)

yani yapacağınız şu

void fonksiyonum(char deger)
{
 
  /*deger içindeki değişkeni göstergeye yazan komutlar*/
  konum++;
}

printf(fonksiyonum,"%lu",a);


bu kodlarda printf komutu a sayısının içindeki 4, 1, 8, 0, ... sayılarını sırasıyla fonksiyonum'a gönderecektir. bu arada sayılar ASCII kodu olarak gönderilir rakam olarak değil.

ben bu yöntemle hem grafik lcd için hemde kayan yazı için kendi printf fonksiyonumu yazdım.
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.

DumrulBey

dg0 = MAKE8(ms,3); 
dg1 = MAKE8(ms,2); 
dg2 = MAKE8(ms,1); 
dg3 = MAKE8(ms,0);

Arif'in verdiği kodlar, herhangi bir 32 bit sayı için 4 baytlık değişkenleri ayrı şekilde kullanabilmemize yarıyor. Mesela 1,234,567,890 gibi 32 bit sayı için 8 bitlik mikrodenetleyicide, dört farklı değişkende h'49 96 02 D2' şeklinde tutulur. Arasını boşlukla ayırdığım her onaltılık (hexadecimal) sayı dg0..dg3 değişkenlerine aktarılır. Ancak dikkat edin aynı şekilde aktarıldığı için tek başlarına farklı sayıları gösterirler. Dolayısıyla dg0 ve dg1 sayını MSB (Most Significant Bit) yani yüksek değerlikli bitlerini temsil ederken, dg2 ve d3 LSB (Least Significant Bit) düşük değerlikli bitleri gösterir.

for (i=0;i<10;i++) { 
  c[i]=b%10;  //(b MOD 10), c[i] = kalan
  b=b-c[i];   //(b - kalan),
  b=b/10;     //(b DIV 10)
}

Süleyman'nın verdiği kodlar, anladığım kadarıyla satırların yanlarına yazdığım komutları işletiyor. Şöyle bir göz ucuyla bakınca doğru olduğu anlaşılıyor. Ancak önemli bir not; bellekten tassarruf etmek için for (i=0;i<=9;i++) şeklinde döngüye başlamakta ve diziyi 8 bitlik tanımlamakta fayda var. Çünkü dizi değişkenleri sıfır
  • 'dan başlar. Ayrıca rakamları diziye tersten yerleştirdiği için tersten okutturmak yerinde olacaktır.

    Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)