www.mikrocontroller.net

Forum: Compiler & IDEs LCD ohne Lib


Autor: Manipulator (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Manipulator (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Manipulator (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, hab grad gesehen, dass der Cursor doch blinkt...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.