van decimaal naar binair ?

Alleen berichten van “dekees” worden getoond. Alle berichten tonen

Kan gewoon in C:

code:


void WriteBinary(uint8_t x)
{
   for(uint8_t Mask = 0x80; Mask != 0; Mask >>= 1)
   {  Lcd4_Write_Char( (x & Mask) ? '1' : '0');
   }
}

@trix

code:


   RAM_content >> 1;

Dit doet niks. Je schuift de waarde uit RAM_content 1 positie naar rechts, en gooit het resultaat weg. Als je het resultaat wilt terug schrijven in RAM_content dan heb je een assignment nodig:

code:


   RAM_content = RAM_content >> 1;

of verkort:

code:


   RAM_content >>= 1;

En hier gaat het ook fout

code:


   sprintf(s, "content  = %u", (lchar));

sprintf() krijgt hier de opdracht om een %u (unsigned decimal) getal af te printen en doet dat dan ook. Maar lchar is een pointer dus je krijgt de waarde van de pointer ipv de string die je wilt.
Als je een string wilt printen moet je %s gebruiken.

Maar dan ontbreekt de nul terminator nog. Geeft niet als je de lengte van de string beperkt "%.8s", en anders moet je een terminator schrijven:

code:


   lchar[8] = 0;

Hier allebei in het voorbeeld

code:


   for (cnt = 7; cnt >= 0; cnt = cnt -1)
   {
      lchar[cnt] = (0x30 + (RAM_content & 0x01));
      RAM_content >>= 1;
   }
   // below: put the content on the display
   lchar[8]=0;
   sprintf(s, "content  = %.8s", lchar);
   Lcd4_Set_Cursor(1,16);
   Lcd4_Write_String(s);

En in C is er inderdaad verschil tussen enkele en dubbele quotes.
'0' is een char, waarde 48 (decimal) = waarde 30 (hex).
"0" is een string met een '0' (0x30) en een null terminator (0x00). Als je dat in je programma gebruikt krijg je het adres van die string.

Alleen weet ik vandaag geen processor aan te bevelen om dat op te doen

??? We hebben het hier toch over een AtMega328 ?

code:


   mov  R26,R24    ; x
   ldi  R27,0x80   ; Mask = 0x80
L001:
   ldi  R24,0x30   ; '0'
   and  R26,R27    ; x & Mask
   breq L002       ; ?
   inc  R24        ; '0' + 1 
L002:
   rcall Lcd_Write_Char 
   lsr  R27       ; Mask >>= 1
   brne L001      ; while Mask != 0
   ret

Maar toch is de assembler makkelijker te lezen als je de C versie erachter zet. :)

edit:
Wel de goede kant schuiven natuurlijk..

Voor de basic liefhebbers:

code:


void WriteBinary(uint8_t x)
{
   for(uint8_t Mask = 0x80; Mask != 0; Mask >>= 1)
   {  Lcd4_Write_Char( (x & Mask) ? '1' : '0');
   }
}

Kun je ook uitschrijven als:

code:


void WriteBinary(uint8_t x)
{
   for(uint8_t Mask = 0x80; Mask != 0; Mask = Mask >> 1)
   {  
      if( (Mask & x) == 0)
         Lcd4_Write_Char( '0');
      else
         Lcd4_Write_Char( '1');
   }
}

Hier nog een hele discussie over hetzelfde onderwerp.
Daar zitten wel een paar creatieve oplossingen tussen. :)

https://stackoverflow.com/questions/111928/is-there-a-printf-converter…

De .8 in %.8s zorgt ervoor dat je max 8 letters afdrukt. Zonder de punt zou het een minimum zijn.
Dat is dus een andere manier om aan te geven hoeveel letters je op het scherm krijg.