noch mal mit funktion void enable (void)
Code:/** 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 // verzögerung 0,25µs //**************************************************************************** #pragma code void delay100us(unsigned char multiplikator) // for PicLSBK (16MHz Taktzyklus = 4 MHz Befehlszyklus) { while(multiplikator--) Delay10TCYx(40); //40*10*0,25µs = 100 µs } void enable(void) { LCD_E = 1; // Daten übernehmen delay100us(3); LCD_E = 0; } 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 enable(); } 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); // 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; enable(); delay100us(50); //5ms warten nach den 1.nibble x = zeichen; x = (x << 4)& 0xf0; //niederwertiges nibbel x = x | LCD_RS; PORTLCD = x; enable(); 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); // 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 enable(); delay100us(50); //5ms warten nach den 1.nibble x = data; x = (x << 4)& 0xf0; //niederwertiges nibbel PORTLCD = x; enable(); 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 enable(); delay100us(50); //warte 5ms // Interface auf 8-Bit setzen enable(); // Enable (LCD) delay100us(2); //warte 200µs enable(); // Interface auf 8-Bit setzen // Enable (LCD) delay100us(2); //warte 200µs PORTLCD = 0x20; // Interface auf 4-Bit setzen enable(); // Enable (LCD) 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(0x0f); // Display ein [ 0x0C = ein, 0x08 = aus ] } void main (void) { LCD_Init(); LCD_WriteZeichen('t'); LCD_WriteZeichen('x'); }







Zitieren
Lesezeichen