mensch du bist klasse
so langsam sollten die fehler aber angst bekommen und verschwinden wenn wir so weitermachen 
die wartezeit nach dem 2. nibble ist jetzt auch nach dem 2. nibble (also nach enable).
hast recht es muss 0x06 heißen da hat sich bei sprut wohl ein fehler eingeschlichen und ich hab es bein abtippen nicht gemerkt.
Display off ist auch raus. // on muss doch drin bleiben, oder nicht, ist ja nach der internen init aus.
Code:
/** 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)
nop;
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(200);
delay100us(200);
// LCD_BUSY(); // Warten bis LCD bereit ist
LCD_RW = 0; // LCD im Schreiben-Mode
LCD_RS = 1; // LCD im Befehl-Mode
x = zeichen & 0xf0;
x = x | LCD_RS;
PORTLCD = x; //höherwertiges nibbel
nop;
LCD_E = 1; // Enable (LCD)
nop;nop;
LCD_E = 0;
delay100us(50); //5ms warten nach den 1.nibble
x = zeichen;
x = (x << 4)& 0xf0; //niederwertiges nibbel
x = x | LCD_RS;
PORTLCD = x;
LCD_E = 1; // Enable (LCD)
nop;nop;
LCD_E = 0;
delay100us(50); //5ms warten nach den 2.nibble
LCD_RS = 0;
}
void LCD_WriteString(unsigned char *String)
{
unsigned char zeichen;
zeichen = *String;
while(zeichen !='\0')
{
LCD_WriteZeichen(zeichen); // zeichen am LC-Display ausgeben
String++;
zeichen = *String;
}
}
void LCD_WriteRegister(unsigned char data)
{
unsigned char x;
delay100us(200);
delay100us(200);
// 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;nop;
LCD_E = 0;
delay100us(50); //5ms warten nach den 1.nibble
x = data;
x = (x << 4)& 0xf0; //niederwertiges nibbel
PORTLCD = x;
LCD_E = 1; // Enable (LCD)
nop;nop;
LCD_E = 0;
delay100us(50); //5ms warten nach dem 2.nibble
}
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;nop;
LCD_E = 0;
delay100us(50); //warte 5ms
LCD_E = 1; // Interface auf 8-Bit setzen
nop;nop; // Enable (LCD)
LCD_E = 0;
delay100us(2); //warte 200µs
LCD_E = 1; // Interface auf 8-Bit setzen
nop;nop; // Enable (LCD)
LCD_E = 0;
delay100us(2); //warte 200µs
PORTLCD = 0x20; // Interface auf 4-Bit setzen
LCD_E = 1; // Enable (LCD)
nop;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(0x06); // Kursor nach rechts wandernd, kein Display-Shift
LCD_WriteRegister(0x0c); // Display ein [ 0x0C = ein, 0x08 = aus ]
}
void main (void)
{
LCD_Init();
LCD_WriteZeichen('t');
}
Lesezeichen