LCD ohne Lib

Gast #365433
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
Angehängte Dateien:
Gast #365434
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...
#365435
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.