Hi Leute, ich verzweifel! Bin Neuling im Umgang mit Microcontrollern. Will über einen Atmega8 in C ein LCD im 4-Bit-Modus ansteuern und krigs einfach nicht hin. LCD zeigt nur die erste Zeile mit schwarzen Feldern an und die zweite ist komplet leer. Hab folgenden Code zusammengebastelt: #include <avr/io.h> #include <util/delay.h> #define F_CPU 8000000 //Displayinitialisierung void lcd_init(void) { //PORT D als Ausgang definieren DDRD = 0xff; //Power on _delay_ms(40); //Interface auf 8 Bit setzen PORTD = 0b00110000; _delay_ms(5); //Interface auf 8 Bit setzen PORTD = 0b00110000; _delay_ms(0.1); //Interface auf 8 Bit setzen PORTD = 0b00110000; //Interface auf 4 Bit setzen PORTD = 0b00100000; //2-zeilig, 5x8-Punkt-Matrix PORTD = 0b00100000; PORTD = 0b01000000; //Display aus PORTD = 0x00; PORTD = 0b10000000; //Display loeschen PORTD = 0x00; PORTD = 0b00010000; //Kursor nach rechts wandernd, kein shift PORTD = 0x00; PORTD = 0b01100000; //Display ein PORTD = 0x00; PORTD = 0b11000000; } //erzeugt den Enable-Puls void lcd_enable(void) { // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers einfügen // Beitrag "Re: Bitte helft mir. Schon wieder AtMega16" PORTD |= (1<<PD3); _delay_us(1); // kurze Pause // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers verlängern // Beitrag "LCD -> Probleme mit Optimierungsgrad" PORTD &= ~(1<<PD3); } //Ausgabe eines Zeichens auf dem Display void lcd_data (unsigned char temp1) { unsigned char temp2 = temp1; PORTD |= (1<<PD2); // RS auf 1 setzen temp1 = temp1 >> 4; temp1 = temp1 & 0x0F; PORTD &= 0xF0; PORTD |= temp1; // setzen lcd_enable(); temp2 = temp2 & 0x0F; PORTD &= 0xF0; PORTD |= temp2; // setzen lcd_enable(); _delay_us(42); } int main (void) { lcd_init(); lcd_data('T'); while(1) { } return 0; } Kann mir jemand sagen, was ich tun muss, damit das T auf meinem Display angezeigt wird? Vielen Dank schon mal im Vorraus! Hans
> //Interface auf 8 Bit setzen > PORTD = 0b00110000; Wo wird hier die Enable Leitung benutzt? > _delay_ms(5); > //Interface auf 8 Bit setzen > PORTD = 0b00110000; Einfach nur Bytes auf PORTD schreiben geht eben nicht.
Hans schrieb: > void lcd_init(void) > { > //PORT D als Ausgang definieren > DDRD = 0xff; > > //Power on > _delay_ms(40); > > //Interface auf 8 Bit setzen > PORTD = 0b00110000; > > _delay_ms(5); > //Interface auf 8 Bit setzen > PORTD = 0b00110000; > > _delay_ms(0.1); > //Interface auf 8 Bit setzen > PORTD = 0b00110000; [..] ..fehlt da nicht was?.. sowas wie RS? R/W? E? Und wo sind die angeschlossen und wer toggelt die passend? Abgesehen davon: Was für ein Display(controller) ist das überhaupt? HD44780? Das Datenblatt ist - was die Initialisierung des HD44780 angeht - übrigens ★ziemlich★ aufschlussreich. Die Datenblätter anderer Controllertypen i.d.R. ebenso :-) HTH </winkmitdemganzenzaun>
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.