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');
}
}
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.