Hallo PIC freunde ich hoffe ihr seid dieses Thema noch nicht leid, und könnt mir weiterhelfen, ich versuch es schon seit einer Woche ohne erfolg.

Ich möchte ein 4x20 LCD im 4-Bit mode ansteuern LCD Treiber ist ein KS0066.

Ich bekomme einfach kein Zeichen auf das LCD und manchmal sieht es nach einem reset so aus als wenn er im 1-Zeilenmodus wäre.

Bitte helft mir ich komme nicht weiter ;(

/************************************************** ************
C18-compiler

PortPin: Display
RB0 = E
RB2 = RS
RB3 = R/W
RB4..RB7 = D4..D7
************************************************** ***************************/


/** I N C L U D E S ************************************************** ********/

#include <p18f4550.h>
#include <delays.h>


/** D E F I N I T I O N S ************************************************** **/

#define PORTLCD LATB
#define TRIS_LCD TRISB
#define LCD_E PORTBbits.RB0
#define LCD_RS PORTBbits.RB2
#define LCD_RW PORTBbits.RB3

//************************************************** **************************

#pragma code


void delay100us(unsigned char multiplikator)
// for PicLSBK (16MHz Taktzyklus = 4 MHz Befehlszyklus)
{
Delay10TCYx(40*multiplikator); //40*10*0,25µs = 100 µs
}


void LCD_BUSY(void)
{
unsigned char temp1;
// unsigned char temp2;
do
{
TRIS_LCD = 0xF0; // LCD-PORT = high nibbles:eingang; low nibbles:ausgang
//Display abfrage
LCD_RS = 0; // LCD im Befehls-Mode
LCD_RW = 1; // LCD im Lesen-Mode
LCD_E = 1; // Enable (LCD)
temp1 = PORTLCD;
temp1 = temp1 & 0xF0; // Niederw.Nibble (steuerbits) ausmaskieren
LCD_E = 0; // toggeln

LCD_E = 1; // Enable (LCD)
// temp2 = PORTLCD;
// temp2 = (temp2>>4)&0x0f;
// temp2 = temp1 | temp2; // Nibbles verbinden
LCD_E = 0; // toggeln
} while (temp1>=0x80);

delay100us(1);
LCD_RW = 0; // Busy = low: LCD im Schreiben-Mode
TRIS_LCD = 0x00; // LCD-PORT = Ausgänge
PORTLCD = 0x00; // Daten und Steuerleitungen LOW
}


void LCD_WriteZeichen(unsigned char zeichen)
{
unsigned char x;

LCD_BUSY(); // Warten bis LCD bereit ist

// LCD_RW = 0; // LCD im Schreiben-Mode
LCD_RS = 1; // LCD im Befehl-Mode

x = zeichen & 0xf0;
PORTLCD = x; //höherwertiges nibbel

LCD_E = 1; // Enable (LCD)
LCD_E = 0;


x = zeichen;
x = (x << 4)& 0xf0; //niederwertiges nibbel
PORTLCD = x;

LCD_E = 1; // Enable (LCD)
LCD_E = 0;

LCD_RS = 0;
}


void LCD_WriteString(char *String)
{
char zeichen;

zeichen = *String;
while(zeichen !='\0')
{
LCD_WriteZeichen(zeichen); // zeichen am LC-Display ausgeben
String++;
zeichen = *String;
}
}

void LCD_WriteRegister(char data)
{
unsigned char x;

LCD_BUSY(); // Warten bis LCD bereit ist

// LCD_RW = 0; // LCD im Schreiben-Mode
// LCD_RS = 0; // LCD im Befehl-Mode

x = data & 0xf0;
PORTLCD = x; //höherwertiges nibbel

LCD_E = 1; // Enable (LCD)
LCD_E = 0;


x = data;
x = (x << 4)& 0xf0; //niederwertiges nibbel
PORTLCD = x;

LCD_E = 1; // Enable (LCD)
LCD_E = 0;
}



void LCD_Init(void)
{
// LCD initialisieren

TRIS_LCD = 0x00; // LCD-PORT = Ausgänge
PORTLCD = 0x00; // Daten und Steuerleitungen LOW


delay100us (150);
delay100us (150); // warte über 30ms
delay100us (2);

PORTLCD = 0x30; // Interface auf 8-Bit setzen
LCD_E = 1; // Enable (LCD)
LCD_E = 0;
delay100us(45);
// Interface auf 8-Bit setzen
LCD_E = 1; // Enable (LCD)
LCD_E = 0;
delay100us(45);
// Interface auf 8-Bit setzen
LCD_E = 1; // Enable (LCD)
LCD_E = 0;
delay100us(45);

PORTLCD = 0x20; // Interface auf 4-Bit setzen
LCD_E = 1; // Enable (LCD)
LCD_E = 0;

LCD_WriteRegister(0x2; // 2-zeilig, 5x8-Punkt-Matrix
LCD_WriteRegister(0x0; // Display aus
LCD_WriteRegister(0x01); // Display löschen
LCD_WriteRegister(0x02); // Kursor nach rechts wandernd, kein Display-Shift
LCD_WriteRegister(0x0C); // Display ein [ 0x0C = ein, 0x08 = aus ]
}


void main (void)
{
LCD_Init();
LCD_WriteZeichen('t');
LCD_WriteZeichen('e');
LCD_WriteZeichen('s');
LCD_WriteZeichen('t');
}