Hallo Forum,
ich muss mal wieder zu Kreuze kriechen und euch um Rat zu einem µC
Problem, genauer zur Ansteuerung eines 2*16 Zeichen LCDs, bitten. Ich
habe hier ein PICDEM 2 Plus Demo Board mit PIC18F4520 und 4MHz Quarz.
Das Problem besteht darin, dass ich nicht die beabsichtigten Zeichen
ausgeben kann. Anstatt eines Buchstaben wird ein Symbol aus zwei
senkrechten Linien dargestellt. Das 5*8 Felder-Symbol hat dann die
zweite und vierte Spalte dunkel, der Rest hell. Bei manchen Zeichen
erscheinen auch drei dunkle Linien, die sind dann in der ersten, dritten
und fünften Spalte.
Ich vermute ein Problem bei der Initialisierung. Muss ich die
Zeichenauswahl im CGROM konfigurieren? Nach LCD Initialisierung kann den
Cursor ins gewünschte Feld verschieben, er blinkt auch wie gewünscht
etc.
Der gesamte Code ist auch angehängt, aber hier das (vermutlich)
wesentliche, so wird mein LCD initialisiert:
1
voidLcdInit(void){
2
LcdTris=0x00;// All LCD lines as outputs
3
Lcd_Vcc=0;
4
Lcd_Vcc=1;
5
6
__delay_ms(20);
7
LcdWriteNibble(0x03,1);// transmit 3 times soft reset
8
__delay_ms(20);
9
LcdWriteNibble(0x03,1);
10
__delay_ms(20);
11
LcdWriteNibble(0x03,1);
12
__delay_ms(20);
13
LcdWriteNibble(0x02,1);
14
15
LcdWait();
16
LcdCommand(0x28);// 4bit interface, 2-line LCD, 5*8 font
17
LcdWait();
18
LcdCommand(0x0F);// Disply ON, Cursor ON, Blinking ON
LcdLat=tmp|(Msg&0x0F);// Reload LATD with updated message
24
Nop();
25
Nop();
26
27
Lcd_E=0;
28
}
Vielleicht sieht jemand von euch einen Fehler? Wenn ihr noch weitere
Infos braucht, kann ich die gerne anbieten.
Viele Grüße und herzlichen Dank,
Ulminpoika
Sven W. schrieb:> Das Problem besteht darin, dass ich nicht die beabsichtigten Zeichen> ausgeben kann. Anstatt eines Buchstaben wird ein Symbol aus zwei> senkrechten Linien dargestellt.
Prüfe mal alle Datenleitungen die zum LCD gehen.
Prüfe, ob du sie eventuell vertauscht hast, oder ob du zwischen
Datenleitungen einen Kurzschluss hast.
Wenn du den ASCII Code eines Zeichens ausgibst und am LCD wird etwas
ganz anderes sichtbar, dann ist die naheliegenste Vermutung, dass das
LCD bitmässig ganz etwas anderes sieht, als das was du auf den Weg
geschickt hast. Was zb sein kann, wenn es irgendwo Kurzschlüsse gibt.
War das Display ganz normal vom Händler oder vllt. ein Restposten? Es
gibt nämlich sehr exotische Zeichensätze. Wenn da ein HD44780 verbaut
ist, kann man am Suffix erkennen, ob es ein kundenspezifischer Typ ist:
A00 - japanischer Standard
A02 - Europa Standard
BXX - Kundenspezifisch
Hallo,
vielen Dank für eure Antworten.
Bei meiner Antwort an euch ist mir der Fehler in der Funktion
"LcdPutChar" aufgefallen. Da die Steuerkommandos funktionieren, das
Schreiben aber nicht, musst der Fehler irgendwo in der Schreibroutine
oder in der Übergabe liegen.
Aus dieser Funktion
1
voidLcdPutChar(unsignedcharvalue){
2
unsignedchartmp=0;
3
tmp=value&0xF0;// get upper nibble of character
4
tmp>>4;// (Korrigiert) shift upper nibble into data lines
5
NOP();
6
LcdWriteNibble(tmp,0);
7
tmp=value&0x0F;// get lower nibble of character
8
LcdWriteNibble(tmp,0);
9
LcdWait();
10
}
wurde diese:
1
voidLcdPutChar(unsignedcharvalue){
2
unsignedchartmp=0;
3
tmp=value&0xF0;// get upper nibble of character
4
tmp=tmp>>4;// shift upper nibble into data lines
5
NOP();
6
LcdWriteNibble(tmp,0);
7
tmp=value&0x0F;// get lower nibble of character
8
LcdWriteNibble(tmp,0);
9
LcdWait();
10
}
Ich hatte das Rechts-Schieben in der LcdCommand Funktion korrekt
programmiert, aber in der LcdPutChar dann den Fehler. Deswegen liefen
alle Steuerbefehle ordentlich, aber in der Schreibfunktion gings dann
nicht.
Hat mir wieder mal geholfen, einfach jemandem mein Problem zu schildern.
Und schon wirds besser.
Vielen Dank und ne scöne Woche noch.