lcd initialisierung

Gast #3011784
Lesenswert?

Hallo,

ich habe ein problem mit meinem lc-display
ich möchte von meinem mikrocontroller ATmega 8535, eine 4 stellige Zahl 
ausgeben und habe dazu folgendes in der initialisierung des displays 
stehen:

void lcd_zeichen(char Zeichen)
{
  sbi(PORTD,rs);   // rs = 1 Datenmodus
  lcd_write(Zeichen);
  _delay_ms(1);
}

________________________________________________________
void lcd_zahl(unsigned char Zahl)

{
  lcd_zeichen(0x30+Zahl / 1000)    ;Zahl %= 1000;
  lcd_zeichen(0x30+Zahl / 100)    ;Zahl %= 100; //30 von ASCII Code
  //lcd_zeichen('.');
  lcd_zeichen(0x30+Zahl / 10)    ;Zahl %= 10;
  lcd_zeichen(0x30+Zahl);
}

im main programm rufe ich das ganze wie folgt auf:

long Schalldruckverhaeltnis = 8324

lcd_text(1,"Lautstaerke: ");
lcd_zahl(Schalldruckverhaeltnis);
lcd_text(1," dB");

es zeigt mir allerding immer nur die letzten 3 stellen an und rundet ab 
ca 217 auf 4 stellig zeigt aber trotzdem 0217 an

hoffentlich könnt ihr mir helfen
#3011817
Lesenswert?

Hi

Du uebergibt einen unsigned char an die Funktion. Das sind 8 Bit und 
damit ist der Wertbereich des Parameters auf 0 .. 255 beschraenkt.
Verwende statt dessen einen 16 Bit Typ. Z.B. uint16_t.
Wie gross ist der Wertbereich fuer 'Schalldruckverhaeltnis'? Hier hast 
Du einen long verwendet.

Gruesse
#3011978
Lesenswert?

Noch ein Tip

Anstelle der 0x30 in
1
 lcd_zeichen(0x30+Zahl / 1000);
schreibs lieber so
1
 lcd_zeichen( '0' + Zahl/1000 );
dann versteh man auch, was da passiert. Und das der ASCII Code von '0' 
gleich 0x30 ist ... das muss wirklich niemand auswendig wissen. Das kann 
man getrost dem Compiler überlassen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren