mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik KS0066 Initialisierung


Autor: Basil Brunner (baesy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Ich möchte gerne ein Display mit dem Prozessor KS0066 im Hintergrund 
initialisieren. Zur Ansteuerung verwende ich den PIC18F4550 von 
Microchip und zum Programmieren die MPLAB Umgebung mit C18 C-Compiler. 
Ich benütze den 4-Bit Modus. Nachfolgend mein bisheriger C-Code:

//Datenbus
#define Bus_in PORTD
#define Bus_out LATD
#define Richtung TRISD
#define Input 0xFF
#define Output 0x00

//Adressen
#define AD_LCD 0x01

//Display
#define RS LATDbits.LATD4
#define RW LATDbits.LATD7
#define En LATDbits.LATD6
#define BusyF PORTDbits.RD3
#define wait 50

unsigned int i=0;

//Funktionsprototyp
/*********************************************************************** 
***********/
void InitLCD(void);
void WriteChar(unsigned char ucZeichen, unsigned char bRS);
void WaitBusyF(void);

/*********************************************************************** 
***********\
* InitLCD
*
* Initialisiert das Display
* 4-Bit Interface
* 2-Line-Mode, Display-off
* Display-on, Cursor-off, Blink-off
* "Display clear"
* Increment-Mode, Entrie-shift-off
*
* Parameter:
* keine
\*********************************************************************** 
***********/
void InitLCD(void)
{
  Richtung = Output;        //PortD als Ausgänge setzen
  ChipSelect(AD_LCD);

  RS = 0;                   //RS Leitung auf Low legen
  RW = 0;                   //Write-Modus
  for(i=0; i<wait; i++);
  Bus_out &= 0xF0;              //4-Datenbits löschen
  for(i=0; i<wait; i++);
  Bus_out |= (0x20 & 0xF0)>>4;  //0x20 an Datenbits anlegen => 4-Bit 
Interface einstellen
  for(i=0; i<wait; i++);
  En = 1;                   //Negative Flanke auf Enable-Leitung 
erzeugen
  for(i=0; i<wait; i++);
  En = 0;                   //""
  for(i=0; i<wait; i++);
  WriteChar(0x28, 0);       //2-Line-Modus und Display-off
  for(i=0; i<250; i++);
  WriteChar(0x0F, 0);       //Display-on, Cursor-off, Blink-off    0x0C 
= ohne Cursor, 0x0F = mit Cursor
  for(i=0; i<250; i++);
  WriteChar(0x01, 0);       //Display Clear
  for(i=0; i<250; i++);
  WriteChar(0x06, 0);       //Increment-Mode, Entrie-Shift-off
}


/*********************************************************************** 
***********\
* WriteChar
*
* Sendet ein Zeichen (8-Bit) an des Display
*
* Parameter:
* ucZeichen = Gewünschtes Kommando oder Zeichen
* bRS = 0=Kommando, 1=anzuzeigendes Zeichen
\*********************************************************************** 
***********/
void WriteChar(unsigned char ucZeichen, unsigned char bRS)
{

  Richtung = Output;        //PortD als Ausgänge setzen
  En = 0;                   //Enable-Leitung auf Low setzen
  ChipSelect(AD_LCD);       //LCD auf Datenbus legen

  RS = bRS;                 //Kommando oder Zeichen senden (0=Kommande, 
1=Zeichen)
  RW = 0;                   //Write-Modus
  for(i=0; i<wait; i++);
  Bus_out &= 0xF0;          //4-Datenbits löschen
  Bus_out |= (ucZeichen & 0xF0)>>4; //High-Nibbel des zusendenden 
Zeichens auf Datenbus legen
  for(i=0; i<wait; i++);
  En = 1;                   //Negative Flanke auf Enable-Leitung 
erzeugen
  for(i=0; i<wait; i++);
  En = 0;                   //""
  for(i=0; i<wait; i++);
  Bus_out &= 0xF0;              //4-Datenbits löschen
  for(i=0; i<wait; i++);
  Bus_out |= ucZeichen & 0x0F;  //Low-Nibbel des zusendenden Zeichens 
auf Datenbus leben
  for(i=0; i<wait; i++);
  En = 1;                   //Negative Flanke auf Enable-Leitung 
erzeugen
  for(i=0; i<wait; i++);
  En = 0;                   //""
  for(i=0; i<wait; i++);

  WaitBusyF();              //Warten bis Display den Befehl verarbeitet 
hat

  ChipSelect(0x00);                //Display von Bus entfernen
}


/*********************************************************************** 
***********\
* WaitBusyF
*
* Fragt das BusyFlag des Displays ab
*
* Parameter:
* keine
\*********************************************************************** 
***********/
void WaitBusyF(void)
{
  Richtung = 0x08;        //PortD3 als Input, rest als Output
  RS = 0;                 //RS-Leitung auf Low setzen
  for(i=0; i<wait; i++);
  RW = 1;                 //Read-Modus
  for(i=0; i<wait; i++);
  En = 1;                 //Enable-Leitung auf High setzen
  while(BusyF == 1);      //warten bis BusyFlag low ist, Befehl 
verarbeitet von Display
  En = 0;                 //Enable-Leitung auf Low setzen
  for(i=0; i<wait; i++);
  En = 1;                 //Enable-Leitung auf High setzen
  for(i=0; i<wait; i++);
  En = 0;                 //Enable-Leitung auf Low setzen
  for(i=0; i<wait; i++);

  RW = 0;                 //Write Modus

  Richtung = Output;      //PortD als Ausgänge setzen
}


Die ChipSelect-Funktion benötigte ich, da mehrere Module am gleichen 
Datenbus angeschlossen sind. Dies funktioniert mit Sicherheit. Die 
vielen for-Schleifen benutze ich als Zeitverzögerungen. Am PIC 
angeschlossen ist ein 20MHz Quarz.

Habe ich einen grundlegenden Fehler beim Initialisieren gemacht? Oder wo 
könnte der Fehler sein?

Vielen Dank für eure Hilfe

Lg Baesy

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.