Ok, auch wenn das Thema schon hundert mal durchgezogen wurde ...
Ich versuche mit vier Bit ein LCD anzuwerfen. Dazu sende ich das
bekannte Muster 3 x und warte dann darauf, dass das Busy flag wieder
low wird. Und dafuer habe ich mir folgende Zeilen zusammengebastelt:
// enable Impuls
void lcd_doit()
{
E_PORT |=(1<<E_BIT);
_delay_ms(1);
E_PORT &=~(1<<E_BIT);
_delay_ms(1);
}
// Busy abwarten
void lcd_ready()
{
//Befehl Busy flag und Adresse auslesen
RW_PORT|=(1<<RW_BIT);
// absenden
lcd_doit();
// lcd 7 als Eingang
LCD_7_DDR &=~(1<<LCD_7_BIT);
// solange warten bis busy flag=low
while(LCD_7_PIN & (1<<LCD_7_BIT));
// R/W und LCD_7 zuruecksetzen
RW_PORT&=~(1<<RW_BIT);
LCD_7_DDR |=(1<<LCD_7_BIT);
}
Von der Idee her richtig?
Ok vielleicht sollte ich es noch ein bisschen konkretisieren: Wenn dieser erste Schritt der Initialisierung durchgelaufen ist und ich dann einzelne der beteiligten Bits von 0 auf 1 oder anders herum setze, bleibt das Programm haengen. Vielen Dank
du liest das busyflag aus, vielleicht haegt er an dieset stelle. gibt doch einfach zwischen jeder zeile ein signal nach dausen (rs232/led...) und teste wie weit er kommt, und wo er genau haengt)
Aber grundsätzlich ist der Ablauf richtig für das Abfragen des Busy Flag RW auf high E Impuls senden D7 auslesen ? Danke
Hilft dir das weiter ? So geht's bei mir.
unsigned char LCD_Read_Busy(void)/* Read Busy Flag */
{
unsigned char busy;
LCD_RS_Register(); // set to instruction
LCD_RW_Read(); // set to read
P3DIR=0xD0;
lcdena_on; // E on
busy = P3IN & 0x08; // get LCD data
lcdena_off; // E off
busy >>= 3; // shift Busy Flag
P3DIR=0xDF;
return( busy );
}
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.