Hallo
Das würde ich nicht machen. Wenn das LCD, aus welchen Gründen auch immer, hier etwas ausgeben möchte, knallt´s! Ist eigentlich r/w mit GND verbunden?habe zusätzlich die freien Daatenleitungen auf GND gesetzt
Ein 4x20-LCD an meinem RP6 (auch ein Mega32):
https://www.roboternetz.de/phpBB2/ze...ag.php?t=41805
Der Code (hoffentlich richtig an deine Belegung angepasst):
Vielleicht hilf dir das?Code:// LCD 20x4 (LMC-SSC4A20) an den PC0-3, PC5 und PC7 10.2.2011 mic // 4-Bit-Ansteuerung ohne busy-Abfrage: // 1 - GND - GND // 2 - Vcc - Vcc // 3 - Kontrast (0-0,5V) // 4 - RS - PC7 // 5 - R/W - GND // 6 - E - PC5 // 7 - nc // 8 - nc // 9 - nc // 10 - nc // 11 - Data4 - PC0 // 12 - Data5 - PC1 // 13 - Data6 - PC2 // 14 - Data7 - PC3 // 15 - A - Vcc // 16 - K - GND #include <avr/io.h> #include <util/delay.h> #define demospeed 50 #define d4h (PORTC|=1) #define d4l (PORTC&=~1) #define d5h (PORTC|=2) #define d5l (PORTC&=~2) #define d6h (PORTC|=4) #define d6l (PORTC&=~4) #define d7h (PORTC|=8) #define d7l (PORTC&=~8) #define eh (PORTC|=32) #define el (PORTC&=~32) #define rsh (PORTC|=128) #define rsl (PORTC&=~128) void strobe(void) { eh; _delay_ms(1); el; } void lcd_write8(uint8_t wert, uint8_t pause) { if(wert & 16) d4h; else d4l; if(wert & 32) d5h; else d5l; if(wert & 64) d6h; else d6l; if(wert & 128) d7h; else d7l; strobe(); _delay_ms(pause); } void lcd_write4(uint8_t wert, uint8_t pause) { if(wert & 16) d4h; else d4l; // high nipple if(wert & 32) d5h; else d5l; if(wert & 64) d6h; else d6l; if(wert & 128) d7h; else d7l; strobe(); _delay_ms(pause); if(wert & 1) d4h; else d4l; // low nipple if(wert & 2) d5h; else d5l; if(wert & 4) d6h; else d6l; if(wert & 8) d7h; else d7l; strobe(); _delay_ms(pause); } void lcd_cls(void) { rsl; lcd_write4(1,2); rsh; } void lcd_locate(uint8_t x, uint8_t y) { rsl; switch (y) { case 0: lcd_write4(0x80+x, 40); break; // 0. Zeile case 1: lcd_write4(0xc0+x, 40); break; // 1. Zeile case 2: lcd_write4(0x94+x, 40); break; // 2. Zeile case 3: lcd_write4(0xd4+x, 40); break; // 3. Zeile } rsh; } void lcd_writeChar(uint8_t zeichen) { lcd_write4(zeichen,1); } void lcd_writeString(char *string) { while(*string) lcd_writeChar(*string++); } void lcd_init(void) { DDRC |= 0b10101111; PORTC &= ~0b10101111; rsl; _delay_ms(100); lcd_write8(0b00100000,100); // Function Set: 4bit-Modus starten lcd_write4(0b00101000,40); // Function Set: 2 Zeilen, Font 0 (0010NFxx) lcd_write4(0b00000001,40); // Display Clear lcd_write4(0b00000110,40); // Entry Mode Set: inc, no shift lcd_write4(0b00001100,40); // Display On and Cursor //lcd_write4(0b00001111,40); // Display On and Cursor rsh; _delay_ms(1); } int main(void) { uint8_t i; // Hilfsvariable lcd_init(); // lcd initialisieren lcd_cls(); // Display löschen lcd_locate(0,0); // Schreibpositon festlegen for(i=0; i<20; i++) {lcd_writeChar('*'); _delay_ms(demospeed); } lcd_locate(0,1); for(i=0; i<20; i++) {lcd_writeChar('a'+i); _delay_ms(demospeed/2); } lcd_locate(0,2); for(i=0; i<20; i++) {lcd_writeChar('A'+i); _delay_ms(demospeed/3); } lcd_locate(0,3); for(i=0; i<10; i++) {lcd_writeChar('0'+i); _delay_ms(demospeed/4); } for(i=0; i<10; i++) {lcd_writeChar('0'+i); _delay_ms(demospeed/4); } _delay_ms(2000); lcd_cls(); lcd_locate(2,0); lcd_writeString("RP6 ROBOT SYSTEM"); lcd_locate(0,2); lcd_writeString("LC-Display an LED1-6"); lcd_locate(9,3); lcd_writeString("16.7.08 mic"); while(1){ } return 0; }
btw. verwende ich fünf der sechs Datenleitungen gleichzeitig auch zum Einlesen von fünf Tastern ;)
Poste mal dein aktuelles Programm... (bitte in Code-Tags)
Gruß
mic







Zitieren

Lesezeichen