Forum: Compiler & IDEs LCD ohne Lib


von Manipulator (Gast)


Angehängte Dateien:

Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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...

von Karl H. (kbuchegg)


Lesenswert?

> 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.

von Manipulator (Gast)


Lesenswert?

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.

von Manipulator (Gast)


Lesenswert?

Sorry, hab grad gesehen, dass der Cursor doch blinkt...

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
Noch kein Account? Hier anmelden.