Forum: Mikrocontroller und Digitale Elektronik Anzeige Display


von Paul (Gast)


Lesenswert?

Hallo Gemeinde
möchte die Adresse eines Gerätes auf dem Diplay mit I2C darstellen. Dazu 
geb ich Daten ein:
1
#define adr1_w 0x40        // Adresse I2C 0x40
Die Anzeige soll damit kommen:
1
lcd_putcharlc(4,10,(adr1_w));

Habe das gleich auch mit

lcd_printlc
lcd_printlc_P
lcd_printlcc
lcd_printlcc_P

getestet. Kommt immer eine Fehlermeldung. Was ist falsch?
Ausgabe eines Textes geht ohne Probleme
Proramm in C Atmega
LG Pl

von Wilhelm M. (wimalopaan)


Lesenswert?

Fehlermeldung?

von Paul (Gast)


Lesenswert?

Fehlermeldung:

passing argument 3 of 'lcd_printlcc' makes pointer from integer without 
a cast

von Wilhelm M. (wimalopaan)


Lesenswert?

Ich dachte lcd_printlc?

Jetzt steht da lcd_printlcc.

Wie ist die Signatur von lcd_printlcc()?

von Paul (Gast)


Lesenswert?

Hatte alle Möglichkeiten getestet, dadurch steht jetzt lcd_printlcc. 
Werde auch die anderen nehmen.

von Paul (Gast)


Lesenswert?

passing argument 3 of 'lcd_printlc' makes pointer from integer without a 
cast

und

expected 'char *' but argument is of type 'int'

von Wilhelm M. (wimalopaan)


Lesenswert?

Wie ist die Signatur von lcd_printlcc()?

von Paul (Gast)


Lesenswert?

Was meinst du mit Signatur?

von Pete K. (pete77)


Lesenswert?

0x40 müsste das @-sign sein. Ist das im Zeichenvorrat des LCD vorhanden?

von Paul (Gast)


Lesenswert?

Benutze dieses Teil dazu:
1
bool lcd_printlcc(uint8_t line, uint8_t col, char *string) {  
2
    
3
    if (!lcd_gotolc(line, col)) return false;
4
      
5
  while(*string) {
6
    lcd_putchar(*string++);
7
    col++;
8
    if(col > LCD_COLS) {
9
      line++;
10
      col = 1; 
11
        if(line > LCD_LINES) {
12
          line = 1;
13
        }
14
            lcd_gotolc(line, col);
15
    }
16
  }
17
  return true;
18
}

von Wilhelm M. (wimalopaan)


Lesenswert?

Und schau mal: was hat der dritte Parameter fr einen Typ???

von Paul (Gast)


Lesenswert?

wenn ich

lcd_printlc_P(4,10,(adr1_w));

schreibe, erscheint B und ein Zwischending von 9 und deinem Zeichen 
(undefiniert). Hatte angenommen, das auch 0x40 bzw 64 dargestellt wird.
Denkfehler?

von Paul (Gast)


Lesenswert?

Es steht ein "char *string" drin.
Was müsste den da stehn?

von Paul (Gast)


Lesenswert?

mit diesem

lcd_putchar(adr1_w);

bekomme ich das Zeichen

Pete K. schrieb:
> 0x40 müsste das @-sign sein. Ist das im Zeichenvorrat des LCD vorhanden?

Wie mach ich daraus 0x40?

von Fabian H. (hdr)


Lesenswert?

Zum Beispiel durch den Einsatz von sprintf(...). Diese Funktion wandelt 
eine Zahl in einen String um.
Du könntest Dir auch eine Funktion schreiben, die eine Ganzzahl in einen 
Hexstring wandelt oder eine Zahl (0..15) in (0..F).


Ohne zusätzliche Funktion sieht es Quick'n'Dirty so aus:
1
lcd_putcharlc(4,10,'0');
2
lcd_putcharlc(4,11,'x');
3
lcd_putcharlc(4,12,(adr1_w & 0xF0) < 0xA0 ? ('0'+(adr1_w>>4  )) : ('A'-10+(adr1_w>>4  )));
4
lcd_putcharlc(4,13,(adr1_w & 0x0F) < 0x0A ? ('0'+(adr1_w&0x0F)) : ('A'-10+(adr1_w&0x0F)));

von Michael B. (laberkopp)


Lesenswert?

Paul schrieb:
> Was ist falsch?

Du rufst
1
bool lcd_printlcc(uint8_t line, uint8_t col, char *string)
mit
1
lcd_putcharlc(4,10,0x40);
auf und wunderst dich über einen Fehler ?

Erwartest du, daß eine 4-Zeichen-Folge "0x40" ausgegeben wird
oder erwartest du, daß ein @ ausgegeben wird ?

lcd_putcharlc wäre für die Ausgabe eines @ richtig,
du wolltest wohl lcd_putcharlcc aufrufen.

Besorge dir mal ein C Grundlagenbuch.

Aber nein, lcc passt nicht zu lc, an statt zu verschweigen was du 
verwendest, könntest du es wenigstens mal nennen:

https://www.mikrocontroller.net/attachment/280346/i2clcd.c

Aus einem
1
#define adr1_w 0x40
wird niemals eine 4-Zeichen Folge "0x40" ausgegeben.

Zumindest eine Umwandlung wie durch
1
char text[8];
2
text[0]='0';
3
text[1]='x';
4
itoa(adr1_w,text+2,16)
5
lcd_putcharlcc(4,10,text);
wäre nötig.

von Paul (Gast)


Lesenswert?

Habe den Code

Michael B. schrieb:
> char text[8];
> text[0]='0';
> text[1]='x';
> itoa(adr1_w,text+2,16)
> lcd_putcharlcc(4,10,text);

in mein Programm eingebaut. Gabe noch ein paar kleine Fehlermeldungen, 
geht jetzt aber super. Verwende es bereits in anderen Teilen meines 
Programmes. Sieht jetzt so aus:
1
char text[8];
2
lcd_putcharlc(4,10,'0');
3
lcd_putcharlc(4,11,'x');
4
itoa(adr1_w,text,16);
5
lcd_printlc(4,12,text);

noch das rein und es gibt keine Fehlermeldung:

#include "stdlib.h"

Danke für deine Hilfe.

LG Paul

PS. Musst nicht gleich mit einem C Buch drohen. Es gibt genug Schrott 
auf den Markt

von Paul (Gast)


Lesenswert?

Hallo Moderator
Danke für eure Arbeit

von oder so (Gast)


Lesenswert?

lcd_putcharlc(4,10,(char *)"0x40")

sollte auch gehen.

von Michael R. (mr-action)


Lesenswert?

Na, dann aber doch eher so (sonst muss er beim Ändern vom define ja 
daran denken, den String anzupassen...
1
#define STRINGIFY(x) #x
2
#define TOSTRING(x) STRINGIFY(x)
3
4
lcd_putcharlc(4, 10, TOSTRING(adr1_w));

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.