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.