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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.