LCD_WriteZeichen() hab ich kurz nach absenden des codes auch gefunden.
habe jetzt eine verzögerung von 5 ms nach dem ersten und 2. nibble in den funktionen LCD_WriteZeichen und LCD_WriteRegister eingefügt.
aber leider immer noch ohne licht am ender des tunels![]()
ja ich sehe alle 4 zeilen, wobei sie aber ganz komisch flackern auch wenn ich nur init aufrufe.
hier der neue code
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; delay100us(50); //5ms warten nach den 2.nibble LCD_E = 1; // Enable (LCD) nop;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(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; delay100us(50); //5ms warten nach dem 2.nibble LCD_E = 1; // Enable (LCD) nop;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;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(0x02); // Kursor nach rechts wandernd, kein Display-Shift LCD_WriteRegister(0x0c); // Display ein [ 0x0C = ein, 0x08 = aus ] } void main (void) { LCD_Init(); }







Zitieren

Lesezeichen