Hast Du mal versucht den Kontrast einzustellen?
Hallo alle zusammen,
bräuchte mal 'nen kleinen Tip beim Ansteuern eines LCD-Displays (2x20)
mit dem 16F873.
Habe zum Testen mal das 1. LCD-Programmbeispiel von www.fernando-heitor.de/ kompiliert und gebrannt.
Die Hardware habe ich auch genauso aufgebaut wie von ihm beschrieben.
Leider erscheint bei mir auf dem Display kein Text, sondern beide Zeilen
werden vollkommen schwarz angezeigt ( also alle 20 Stellen der beiden Zeilen werden als schwarze Blöcke angezeigt).
Die Hardware habe ich schon min. 3-mal durchgecheckt. Scheint zu stimmen.
Das Programm sollte ja eigentlich auch stimmen.
Vielleicht hat ja jemand von euch das Beispiel schonmal ausprobiert.
Ansonsten : Woran kann es liegen, das beide Zeilen vollständig schwarz
angezeigt werden, wenn ich den Prozessor einschalte (vorher
wird natürlich nur eine Zeile angezeigt )und nicht der
gewünschte Texte ?
Vielen Dank schonmal für eure Hilfe.
MFG
Hast Du mal versucht den Kontrast einzustellen?
BlackBox
Ja, habe ich.
Habe ein Poti zwischen Pin3 der LCD-Schnittstelle und Ground gelegt,
nur wenn ich am Poti drehe ändert sich nur der Kontast der beiden Zeilen
mit den vollständig schwarzen Zeichenfeldern, aber es kommt kein Text zum vorschein.
Habe ich irgendetwas simples übersehen ?
MFG
Zwischen Pin3 und GND oder wie im Schaltbild unter http://www.fernando-heitor.de/pic/pr.../schaltung.htm das Poti zwischen +5V und GND und den Schleifer auf Pin3?Zitat von Anonymous
Bist Du dir sicher, dass der richtige Kontroller ( HD44780 oder kompatibler) in deinem Display steckt? Ist zwar eigentlich fast Standart aber es gibt auch andere.
BlackBox
check mal die enable-leitung.
ausserem: ist in der software am anfang ne pause, um das display zu initialisieren? ist es überhaupt initialisiert? die dinger brauchen nen paar millisekunden, bis die die ersten daten empfangen können.
-> MEIN PROJEKTBLOG <-
Das Display ist von datavision, ich glaube die arbeiten alle mit dem HD44780.
Nach dem Sofware-Beispiel von Heitor sollte es nach der Initialisierungsroutine genau richtig initialisiert werden.
Wie finde ich denn heraus, ob es initialisiert wurde ?
MFG
mmjaaa.. k.a. wenn es danach funktioniert, vermute ich! ich weiss nicht, musst mal ins datenblatt gucken, obs da irgend ne rückmeldung gibt, wenn das ding initialisiert ist
-> MEIN PROJEKTBLOG <-
Hallo also rausfinden kannst du es nictht. Entweder zeigt es dann die Zeichen an die zum LCD schickst dann ist alles ok oder nicht!!!!
Poste mal ein wenig Code von der INIT Routine.Nutzt du den 4 Bit oder 8 Bit Modus.Mir scheint es so als wenn das LCD nicht richtig Initialisiert ist.
Gruß
Ich habe das Display im 4-Bit-Modus initialsiert.
Hier ist der LCD-Initialisierungs-Code aus der LCD-Routine :
(habe die restlichen Funktion dieses Codes zwecks Postens weggelassen,
weil der relativ lang ist , ich hoffe das reicht):
lcdanzeige.c :
/*Die Pins RC4-RC7 werden zum Schreiben als Ausgänge definiert (LCD_WRITE), und zum Lesen als Eingänge (LCD_READ).*/
struct port_b_layout const LCD_WRITE={0,0,0,0,0};
struct port_b_layout const LCD_READ={0,0,0,0,15};
/* Hier kann der Typ der Anzeige definiert werden
( 0=5x7, 1=5x10, 2=2 lines )*/
#define lcd_type 2
/*verschiedene Eigenschaften der LCD-Anzeige
0x0C = Display an
0x01 = Display löschen
0x06 = Adresspointer inkrementieren und Displayinhalt nicht verschieben */
byte CONST LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0x0C, 0x01, 6};
/* Initialisierung des LCD-Displays. Die verschiedenen Eigenschaften der Anzeige werden hier übertragen.*/
void lcd_init()
{
byte i;
set_tris_b(LCD_WRITE);
portb.rs = 0; // siehe 4-Bit Initialisierung (LCD-Datenblatt)
portb.rw = 0;
portb.enable = 0;
delay_ms(15); // 15 ms Pause
for (i=1;i<=3;++i)
{
lcd_send_nibble(3); // 3-mal 0011 mit mind. 5ms Pause
delay_ms(5);
}
lcd_send_nibble(2); // 0010 = 4-Bit Interface
for (i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING[i]);
}
Hallo ,
Probiere es mal damit ist zwar mit dem CC5x erstellt aber dürtfe kein Problem sein es auf den CSS umzuschrieben.
Deine Init Routine kann so nicht funktionieren. Es müßen schon einige Schritte mehr durchgeführt werden damit das LCD richtig Initalisiert wird.
Siehe meine INIT Routine.
void LCDInit(void)
{
int i;
pause(100);
// Die RS (Register-Select)-Leitung bestimmt,ob die übertragenen Daten als Zeichen in den Textpuffer (RS=1)
// oder als Befehl in ein Steuerregister (RS=0) geschrieben werden
lcdport&=~LCD_RS; // RS Off auf Kontrollregister umschalten jetzt können Kommandos gesendet werden Bit löschen
PORTD=lcdport;
lcdport&=~LCD_RW; // R/W Off to send data to display
PORTD=lcdport;
for(i=0; i<3; i++)
{
PORTD= 0b00110000; //1 - 3 8 Bit Mode anwahl
OutPortD3=1; //Enable Leitung Daten schreiben EIN
NOP;
OutPortD3=0; //Enable Leitung Daten schreiben AUS
pause(5);
}
// 4 Bit Mode High and Low nible transfer
PORTD = 0b00010000; // 4 4 Bit Daten Modus EIN
OutPortD3=1;
NOP;
OutPortD3=0;
pause(10);
LCDWriteByte(0b00000001); // LCD löschen + Home
pause(10);
LCDWriteByte(0b00101000); // 2 Zeilig
pause(10);
LCDWriteByte(0b00001000); // LCD Off
pause(10);
LCDWriteByte(0b00000110); // Entry Mode , Inc , Dis
pause(10);
LCDWriteByte(0b00000011); // Cursor Home
pause(10);
LCDWriteByte(0b00001111); // Display On
lcdport|=LCD_RS; // RS On umschalten auf Datenregister Bit setzen
PORTD=lcdport; // wieder auf Textpuffer wechseln jetzt können wieder Textzeichen gesendet werden
}
Gruß Roberto
Lesezeichen