hier der aktuelle code, leider immernoch ohne erfolg
aber danke schonmal für die hilfe.
habe die BUSY abfrage erstmal rausgenomen und 25ms eingesetzt.
Code:
/*******************************************************************************
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
#define nop _asm nop _endasm
//****************************************************************************
#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;
delay100us(250);
// LCD_BUSY(); // Warten bis LCD bereit ist
x = zeichen & 0xf0;
// LCD_RW = 0; // LCD im Schreiben-Mode
LCD_RS = 1; // LCD im Befehl-Mode
PORTLCD = x; //höherwertiges nibbel
nop;
LCD_E = 1; // Enable (LCD)
nop;
LCD_E = 0;
delay100us(50);
x = zeichen;
x = (x << 4)& 0xf0; //niederwertiges nibbel
LCD_RS = 1; // LCD im Befehl-Mode
PORTLCD = x;
LCD_E = 1; // Enable (LCD)
nop;
LCD_E = 0;
nop;
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;
delay100us(250);
// 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)
nop;
LCD_E = 0;
delay100us(50);
x = data;
x = (x << 4)& 0xf0; //niederwertiges nibbel
PORTLCD = x;
LCD_E = 1; // Enable (LCD)
nop;
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 (100);
PORTLCD = 0x30; // Interface auf 8-Bit setzen
LCD_E = 1; // Enable (LCD)
nop;
LCD_E = 0;
delay100us(50);
// Interface auf 8-Bit setzen
LCD_E = 1; // Enable (LCD)
nop;
LCD_E = 0;
delay100us(2);
// Interface auf 8-Bit setzen
LCD_E = 1; // Enable (LCD)
nop;
LCD_E = 0;
delay100us(2);
PORTLCD = 0x20; // Interface auf 4-Bit setzen
LCD_E = 1; // Enable (LCD)
nop;
LCD_E = 0;
LCD_WriteRegister(0x28); // 2-zeilig, 5x8-Punkt-Matrix
LCD_WriteRegister(0x08); // 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');
}
Lesezeichen