Irgendwie check ich nicht was du da machen willst. 
*Wenn du mit chars arbeitest, dann arbeite auch mit chars und mische nicht int und char.
*Die delays kommen mir teilweise irgendwie (zu) hoch vor.
*Verarbeite deinen char in einer Funktion, und greife auf den port in einer anderen zu. So verliert man nicht die Übersicht. Bei dir scheint das alles irgendwie vermischt zu sein und es ist nicht ganz klar was du wo machst.
Bei mir schaut das senden eines char an einen HD44780 im 4 bit Modus so aus:
Code:
#define LCD_DATA_PORT PORTB
#define LCD_DB7 PB5
#define LCD_DB6 PB4
#define LCD_DB5 PB3
#define LCD_DB4 PB2
#define LCD_E_PORT PORTB
#define LCD_E PB1
#define LCD_RS_PORT PORTB
#define LCD_RS PB0
....
Code:
void lcdShowChar(unsigned char show_ch)
{
LCD_RS_PORT |= (1 << LCD_RS);
lcdSendNibble(show_ch >> 4);
lcdSendNibble(show_ch);
_delay_us(40);
}
void lcdSendNibble(unsigned char nibble)
{
LCD_DATA_PORT &= ~(1 << LCD_E) & ~(1 << LCD_DB4) & ~(1 << LCD_DB5)
& ~(1 << LCD_DB6) & ~(1 << LCD_DB7);
LCD_E_PORT |= (1 << LCD_E);
LCD_DATA_PORT |= ((nibble & 0x01) << LCD_DB4);
nibble >>= 1;
LCD_DATA_PORT |= ((nibble & 0x01) << LCD_DB5);
nibble >>= 1;
LCD_DATA_PORT |= ((nibble & 0x01) << LCD_DB6);
nibble >>= 1;
LCD_DATA_PORT |= ((nibble & 0x01) << LCD_DB7);
LCD_E_PORT &= ~(1 << LCD_E);
}
Vielleicht hilft dir das etwas. Geht aber sicher auch schöner und man könnte den PORT auch auf einmal mit einer Maske beschreiben als den char jedesmal um 1 zu verschieben. Wenn ich das nächste mal ein lcd brauche werde ich das auch wahrscheinlich dahingehend abändern.
Lesezeichen