Forum: Mikrocontroller und Digitale Elektronik KS0066 Initialisierung


von Basil B. (baesy)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.