Ich dachte nun, dass der Parameter "code" sagt welche der user defined
char ich beschreiben will (0-7) und *data ist ein pointer auf Daten mit
den Zeichen informationen 8*5Pixel!)
ich wollte also das folgende Zeichen senden:
1
uint8_t*zeichen1[8]={0x0A,0x00,0x0E,0x01,
2
0x0F,0x11,0x0F,0x00};
Hier bei handelt es sich um ein "ä"!
Der Funktionsaufruf sähe dann so aus?
1
lcd_generatechar(0,zeichen1);
und das Zeichen kann dann so ausgeben werden?
lcd_data(0);
zu meinem Pointer "zeichen" bekomme ich immer folgende Warnung:
warning: initialization makes pointer from integer without a cast
und das Zeichen wird augenscheinlich auch nicht in den Speicher geladen?
Rufe ich die Funktion "lcd_generatechar()" überhaupt so korrekt auf?
Olli R. schrieb:> Ich dachte nun, dass der Parameter "code" sagt welche der user defined> char ich beschreiben will (0-7)
Würde ich auch so sehen.
Olli R. schrieb:> und das Zeichen kann dann so ausgeben werden?
Wenn die Benutzerdefinierten Zeichen bei 0 beginnen, ja (ist meistens
der Fall ein Blick ins Datenblatt kann nicht schaden).
Olli R. schrieb:> zu meinem Pointer "zeichen" bekomme ich immer folgende Warnung:
Versuchs mal so (ohne Gewääähr hab schon länger nicht mehr mit C was
gemacht)
Läubi .. schrieb:> lcd_generatechar(0, &zeichen1);
Das Ändern dahingehend, dass ich die Adresse von zeichen übergebe. führt
zu folgender Fehlermeldung/Warnung:
warning: passing argument 2 of 'lcd_generatechar' from incompatible
pointer type
???
Warum einen uint8_t * ?
In deinem Array werden Zahlen gespeichert, keine Pointer
1
uint8_tzeichen1[8]={0x0A,0x00,0x0E,0x01,
2
0x0F,0x11,0x0F,0x00};
Das
1
lcd_generatechar(0,zeichen1);
war schon richtig so. Arrays werden in C immer automatisch so übergeben,
dass ein Pointer auf das erste Element übergeben wird. Daher ist ein &
nicht notwendig.
Ok ich macht das jetzt ohne dem * für einen Pointer.
Es funktioniert allerdings noch immer nicht?
Es steht noch immer der Buchstabe µ an der Stelle 0 im char-speicher?
Olli R. schrieb:> Ok ich macht das jetzt ohne dem * für einen Pointer.> Es funktioniert allerdings noch immer nicht?> Es steht noch immer der Buchstabe µ an der Stelle 0 im char-speicher?
Das halte ich für eher unwahrscheinlich, dass ausgerechnet an der Stelle
0 ein 'µ' codiert ist. Irgendein wildes 'Sonderzeichen' aus zufälligen
Pixel, ja das wäre ok. Aber ein schönes 'µ'?
Code muss her.
holger schrieb:> lcd_command( LCD_SET_DDADR );
Ok das hat gefehlt, jetzt wird zumindest das Zeichen übertragen.
Aber:
Jetzt versuche ich dieses Sonderzeichen in das Wort März reinzubekommen?
char maerz[4]= {'M',0,'r','z'};
char * msg[12]= {"Januar", "Februar", maerz, "April",
"Mai", "Juni", "Juli", "August",
"September", "Oktober", "November",
"Dezember"};
So geht es schon mal nicht?
Ok klar die LCD-Funktion kommen natürlich nicht in eine ISR (ist ja nur
zum testen erst mal gewesen!)
>Jetzt versuche ich dieses Sonderzeichen in das Wort März reinzubekommen?
char maerz[4]= {'M',0,'r','z'};
Da fehlt eine abschliessende 0. Sonst ist das kein String.
char maerz[5]= {'M',0,'r','z',0};
Und da 0 das Ende eines Strings darstellt wird wohl nur
ein M ausgegeben. Setz dein Zeichen also an Position 1.
char maerz[5]= {'M',1,'r','z',0};
lcd_generatechar(1, zeichen1);
holger schrieb:> Da fehlt eine abschliessende 0. Sonst ist das kein String.
Stimmt so war das ja mit den Strings.
Also Danke jetzt geht alles und ich kann das LCD endlich in dem Umfang
nutzen, in dem ich es benötige.
Beste Grüße
Olli
Hmmh jetzt hab ich doch noch ein kleines Problem
und zwar wollte ich in der ISR nur ein Flag setzen, statt die
lcd-funktion aufzurufen.
mit
#define FALSE 0
#define TRUE !FALSE
while(1)
{
while(lcd_active)
{
k++;
lcd_active = FALSE;
lcd_clear();
lcd_string(msg[k]);
if (k ==12)
k = 0;
}
}
}
ISR(TIMER1_COMPA_vect)
{
lcd_active = TRUE;
}
das klappt aber irgendwie nicht?
OK die Frage hat sich auch geklärt:
solche Kommunikationsvariable müssen "volatile" sein. Natürlich wusste
ich eigentlich auch ok dann geht's morgen weiter!
Schönen Abend noch!!!