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'); }







Zitieren
Lesezeichen