Hallo, ich versuche ein LCD ein LCd anzusteuern, ohne eine Lib zu verwenden. Mit Lib funktionierts, mit meinem Versuch nicht :( #include <inttypes.h> #include <avr/io.h> #include <util/delay.h> #define LCD_RS_PORT PORTB #define LCD_RS_PIN 3 #define LCD_DATA0_PORT PORTD /**< port for 4bit data bit 0 */ #define LCD_DATA1_PORT PORTD /**< port for 4bit data bit 1 */ #define LCD_DATA2_PORT PORTD /**< port for 4bit data bit 2 */ #define LCD_DATA3_PORT PORTB /**< port for 4bit data bit 3 */ #define LCD_DATA0_PIN 5 /**< pin for 4bit data bit 0 */ #define LCD_DATA1_PIN 6 /**< pin for 4bit data bit 1 */ #define LCD_DATA2_PIN 7 /**< pin for 4bit data bit 2 */ #define LCD_DATA3_PIN 0 #define LCD_RW_PORT PORTB /**< port for RW line */ #define LCD_RW_PIN 4 /**< pin for RW line */ #define LCD_E_PORT PORTB /**< port for Enable line */ #define LCD_E_PIN 2 /**< pin for Enable line */ #define LCD_E_PORT PORTB /**< port for Enable line */ #define LCD_E_PIN 1 /**< pin for Enable line */ void write_data(uint8_t wert) { if(wert & (1<<0)) { LCD_DATA0_PORT &= ~(1 << LCD_DATA0_PIN); } else { LCD_DATA0_PORT |= (1 << LCD_DATA0_PIN); } if(wert & (1<<1)) { LCD_DATA1_PORT &= ~(1 << LCD_DATA1_PIN); } else { LCD_DATA1_PORT |= (1 << LCD_DATA1_PIN); } if(wert & (1<<2)) { LCD_DATA2_PORT &= ~(1 << LCD_DATA2_PIN); } else { LCD_DATA2_PORT |= (1 << LCD_DATA2_PIN); } if(wert & (1<<3)) { LCD_DATA3_PORT &= ~(1 << LCD_DATA3_PIN); } else { LCD_DATA3_PORT |= (1 << LCD_DATA3_PIN); } } void lcd_enable(void) { LCD_E_PORT |= (1<<LCD_E_PIN); __asm volatile ("nop"); __asm volatile ("nop"); __asm volatile ("nop"); __asm volatile ("nop"); __asm volatile ("nop"); LCD_E_PORT &= ~(1<<LCD_E_PIN); } void init_lcd(void) { _delay_ms(20); LCD_RS_PORT &= ~(1<<LCD_RS_PIN); /* Steuerregister wird angesprochen */ write_data(0x3); /* 1.0x3 */ lcd_enable; _delay_ms(8); write_data(0x3); /* 2.0x3 */ lcd_enable; _delay_ms(1); write_data(0x3); /* 3.0x3 */ lcd_enable; _delay_ms(5); write_data(0x2); /* Explizit 4-Bit einstellen */ lcd_enable; _delay_ms(5); write_data(0x0); lcd_enable; _delay_ms(5); /*Nochmal System-Set 4bit...*/ write_data(0x2); lcd_enable; _delay_ms(5); write_data(0x8); /* Anderes von System Set einstellen */ lcd_enable; _delay_ms(5); write_data(0x0); /*Display on/off, Display on, Unterstrich Cursor on, blinkender Cursor on*/ lcd_enable; _delay_ms(5); write_data(0xF); lcd_enable; _delay_ms(5); write_data(0x0); /* Cursor Home */ lcd_enable; _delay_ms(5); write_data(0x2); lcd_enable; _delay_ms(5); } void main(void) { DDRB = 0xFF; DDRD = 0xFF; init_lcd(); for(;;); } Hoffe mir kann jemand weiterhelfen Gruß Martin
WAS GENAU funktioniert nicht? Mir fällt u.a. auf, dass Du bei Funktionsaufrufen ohne Parameterübergabe die Klammern weglässt, was mit einiger Sicherheit beim Kompilieren schon mal zu einer ganzen Reihe von Fehlermeldungen führen dürfte... Abgesehen davon initialisiert Dein o.a. Code zwar (möglicherweise) das Display, es wird aber gar nix ausgegeben...
> dass Du bei Funktionsaufrufen ohne > Parameterübergabe die Klammern weglässt, was mit einiger Sicherheit > beim Kompilieren schon mal zu einer ganzen Reihe von > Fehlermeldungen. Eben nicht. Das ist dann ein ganz normaler gültiger Ausdruck in C. So wie i; auch ein gültiger Ausdruck ist (der halt nichts tut). Natürlich macht lcd_enable; nichts. Zumindest nicht das was der OP haben möchte: das die Funktion lcd_enable() aufgerufen wird. Obiges stellt einfach nur die Adresse der Funktion lcd_enable bereit und dann passiert nichts mehr. So wie bei i; der Inhalt von i bereitgestellt wird und ansonsten nichts mehr mit diesem Wert gemacht wird. Ein guter Compiler gibt dafür maximal eine Warnung aus. Irgendwas in der Richtung: "statement has no effect". Aber Fehler darf er keinen schmeissen. Wie gesagt: Ist alles völlig legal und gültiges C.
Hallo, ich habe jetzt Klammern hinter die lcd_enable's gestellt, es blinkt jedoch immernoch kein Cursor. Und laut dem DB sollte der Cursor blinkend initialisiert sein.
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.