mensch du bist klasseso 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'); }







Zitieren

Lesezeichen