mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik [PIC] LCD verwenden


Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend!

Ich habe Probleme mit meinem LCD Display von ANAG VISION AV1624. 
Controller auf dem Display ist ein KS0066 oder Ähnliches steht im 
Datenblatt.

Ich habe es soweit fertig bekommen das ich einen Cursor habe der blinkt 
und "Zeichen" ausgeben kann. Das Problem an den Zeichen ist nur das es 
meistens nur schwarze Blöcke sind.

Hier ist mein Code:
/** D E C L A R A T I O N S ************************/
#pragma code

#define LCD_data LATD
#define LCD_enable LATDbits.LATD5
#define LCD_rw LATDbits.LATD6
#define LCD_rs LATDbits.LATD7

void lcd_init();
void Delay_ms(int ms);
void LCD_WriteRegister(char x);

// **********************************************
//
//
// Delay
//
//
//***********************************************
void Delay_ms(int ms)
{
int i, e;
for( e = 0; e <= ms; e++)
{
  for( i = 0; i <= 80; i++ ) 
  {
    Delay10TCYx(18);
  }
}
}

// **********************************************
//
//
//Befehlsübergabe
//
//
// **********************************************
void lcd_enable(void)
{
LCD_enable = 1;
Delay10TCYx(100); //Verzögerung
LCD_enable = 0;
}

// **********************************************
//
//
//LCD Initialisieren
//
//
// **********************************************
void lcd_init(void)
{
  PORTD = 0x00;

// Nach Power on ein wenig warten
// Ininitlisierung nach dem Reset
  Delay_ms(15);
  PORTD = 0x03; 
  lcd_enable();

  Delay_ms(5);
  lcd_enable();

  Delay_ms(1);
  lcd_enable();

// 4 Bit Interface
  LCD_WriteRegister(0x02);

// 2 Zeilig, 5x7
//
// N = 1 2 Zeilen Display
//   = 0 1 Zeilen Display
// F = 1 5x10 Zeichen
//   = 0 5x7 Zeichen
  LCD_WriteRegister(0x28);  

// Display an
// D = 1 Display ein
//   = 0 Display aus
// C = 1 Curor Unsichtbar
//   = 0
// B = 1 Cursor Blinkt
//   = 0
  LCD_WriteRegister(0x0F);  

// Display Löschen
  LCD_WriteRegister(0x01);

// Entry Mode
  LCD_WriteRegister(0x06);
}

// **********************************************
// Wird für die Initialisierung verwendet.
//
// 
// Status: Funktioniert
// **********************************************
void LCD_WriteRegister(char z)
{
  char x;
  Delay_ms(1);

  x = z & 0x0f;
  PORTD = x;
  lcd_enable();

  Delay_ms(1);
  x = (x<<4)& 0x0f;
  PORTD = x;
  lcd_enable();
}

// **********************************************
// Schreibt ein Zeichen auf das Display.
//
//
// Status: Nicht komplett
// **********************************************
void LCD_WriteChar(unsigned char data)
{
PORTD = 0x00;
LCD_data =(data<<4)&0x0f;
LCD_rs = 1;
lcd_enable();

LCD_data = 0x00; // Clear Low.nibble
LCD_data = data&0x0f;
LCD_rs = 1;
lcd_enable();
}

// **********************************************
//
// Hauptprogramm
//
//
// **********************************************
void main(void)
{
//Einstellen der Ports
// 0 = Output
// 1 = Input
TRISD = 0x00; //PORT D Ausgang
PORTD = 0x00;

//Initialisierung LCD
lcd_init();

LCD_WriteChar(0b01100001);
LCD_WriteChar('0');
LCD_WriteChar('1');
LCD_WriteChar('b');
LCD_WriteChar('5');
LCD_WriteChar('j');

while(1);

Die Ausgabe am Display ist: "Block" "Space" "Block" "Space" "Space" "P"

Hoffe ihr könnt mir helfen. Ich ärgere mich schon seit 2 Tagen mit dem 
rum.

LG
Andreas

Autor: TK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab den Code jetzt nicht durchgesehen, aber meistens handelt es sich 
bei diesem "Phänomen" um ein Initialisierungsproblem. Was sagt denn das 
Datenblatt zum LCD. Da ist doch bestimmt eine Init-Routine beschrieben??
Mach mal am Anfang ein Delay von mindestens 150ms rein!!!
Ich glaube, die Initialisierung für 4bit Modus geht auch anders!
Da muß der "FUNCTION MODE" nämlich 2mal hintereinander gesendet werden.

So weit

Gruß
TK

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also an die Initialisierungs Routine im Datenblatt hab ich mich 
gehalten. Hab am Anfang 15ms Wartezeit eingebaut.

Die Initialisierung funktioniert denke ich. Blinkender Cursor, Display 
an und aus, kein Cursor... Das Funktioniert soweit.

Nur wenn ich Zeichen ausgeben will kommt Müll raus.

LG
Andreas

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void LCD_WriteRegister(char z)
// Nebenbei: Warum hier "char", und nicht "unsigned char", sind doch
// "Befehls-Bytes"
{
...
x = z & 0x0f;  PORTD = x; // Zuerst LOW Nibble,
...
x = (x<<4)& 0x0f; // Dann HIGH-Nibble
...


void LCD_WriteChar(unsigned char data)
// Warum hier "unsigned char", sind doch "Buchstaben", also "char"
{
...
LCD_data =(data<<4)&0x0f;
// Zuerst High-Nibble
...
LCD_data = 0x00; // Clear Low.nibble <== WARUM?
...
LCD_data = data&0x0f;
// Dann Low-Nibble
...

Sicher dass die Nibble-Reihenfolge hier stimmt? Im WriteRegister machst 
du es genau anders herum!

Und gewöhn dir das ständige hin- und herwechseln zwischen PORTD und LATD 
ab, entscheid dich für eine Variante.

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe es bei LCD_WriteChar auch anders rum versucht mit den Nibbles. 
Gleiches Ergebnis. Zwar andere Zeichen aber noch nicht das was ich 
ausgeben will.

Das mit PORTD und LATD hab ich noch nicht ganz ausgebessert. Ich habe 
das von einem anderen Programm abgeschrieben und da war PORTD.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich habe es bei LCD_WriteChar auch anders rum versucht mit den Nibbles.

Du scheinst dir selber nicht im klaren darüber
zu sein wo denn die Datenleitungen vom Display
angeschlossen sind. Ich rate mal PORTD0..3
Links schieben geht da schon mal gar nicht.
Dann überschreibst du deine Steuerleitungen.
Rechts schieben ist also die richtige Richtung.

Und das hier z.B. ergibt genau 0.

  x = (x<<4)& 0x0f;

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich danke euch!

Die ganze hin und herschieberei war Schuld. Zuerst High und dann Low 
Nibble! Bei der Initialisierung hab ich zuerst Low und dann high 
geschickt und deshalb kam er da durcheinander. Genauer gesagt in der 
Funktion LCD_WriteRegister.

Danke euch allen!

LG
Andreas

Autor: Sascha Focus (sascha_focus) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

was ist denn daraus geworden???

Beitrag "Probleme mit PIC18F4550"

Gruß Sascha

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab dort geschrieben das es mit der Config von dir nun funktioniert. Ich 
habe aber den Bootloader nocht nicht ausprobiert weil ich die USB Buchse 
noch nicht eingelötet habe.

LG
Andreas

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.