Forum: Compiler & IDEs LCD-Display "in eine neue Seite springen lassen"


von Verzweiflung (Gast)


Lesenswert?

Hallo, alle die noch Online sind.

Ich versuche seit 2 Stunden auf meinem Display eine zweite Seite, also 
das es einen Text "Mutti fraegt Kind" anzeigt. Dann soll es so 10sec 
warten und den text "antwortet" schreiben.

Wie muss ich den Code änderen?

//
// Anpassungen im makefile:
//    ATMega8 => MCU=atmega8 im makefile einstellen
//    lcd-routines.c in SRC = ... Zeile anhängen
//
#include <avr/io.h>
#include "lcd-routines.h"

int main(void)
{
    lcd_init();

    lcd_string("Mutti fraegt Kind");

    set_cursor(0,2);

    lcd_string("1:");


    while(10);


  {
    }
    return 1;
}


Oder muss ich in einer der anderen Datein noch etwas ändern?

Als Programmiersoftware hab ich AVR-Studio
es ist ein 2x 16 LCD.

Bin um jede hilfe Dankbar!!

Mfg
Stefan

von Ch D. (chrisu) Benutzerseite


Lesenswert?

Vielleicht steht ja etwas falsches in "lcd-routines.h" ?

von Verzweiflung (Gast)


Lesenswert?

Ich weiß nicht, was falsch ist! Ich hab kaum erfahrungen.

Ich bin ja froh, das es überhaupt etwas darstellt. Ich will ja nur, das 
es mit dem Text weitergeht.

Kann mir bitte jemand einen Befehl oder Beispiel geben?

Das LCD is von pollin.

die lcd.rountine.h
// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
// http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
//
void lcd_data(unsigned char temp1);
void lcd_string(char *data);
void lcd_command(unsigned char temp1);
void lcd_enable(void);
void lcd_init(void);
void lcd_home(void);
void lcd_clear(void);
void set_cursor(uint8_t x, uint8_t y);

// Hier die verwendete Taktfrequenz in Hz eintragen, wichtig!

#define F_CPU 8000000

// LCD Befehle

#define CLEAR_DISPLAY 0x01
#define CURSOR_HOME   0x02

// Pinbelegung für das LCD, an verwendete Pins anpassen

#define LCD_PORT      PORTD
#define LCD_DDR       DDRD
#define LCD_RS        PD4
#define LCD_EN        PD5
// DB4 bis DB7 des LCD sind mit PD0 bis PD3 des AVR verbunden

von Karl H. (kbuchegg)


Lesenswert?

Verzweiflung schrieb:
> Ich weiß nicht, was falsch ist! Ich hab kaum erfahrungen.

Worin soll denn deiner Meinung nach die Warterei bestehen?
1
   while(10);

Da steht: solange 10 ungleich 0 ist, mach nichts. 10 ist immer ungleich 
0 und wenn du bis ans Ende des Universums wartest.

Wenn du sowas wie ein Menüsystem bauen willst, dann ist die einfachste 
Variante die, für jede 'Seite' eine eigene Funktion zu machen. Das ist 
zwar bei deinem Mikrobeispiel nicht wirklich notwendig, sobald es aber 
komplizierter wird, sieht die Sache anders aus.
1
..
2
#include <util/delay.h>
3
..
4
5
6
void delay_sec( uint8_t sec )
7
{
8
  uint8_t i;
9
10
  for( i = 0; i < sec; ++i )
11
    _delay_ms( 1000 );
12
}
13
14
void Seite_1()
15
{
16
  lcd_clear();
17
18
  lcd_string( "Mutti fraegt Kind" );
19
20
  delay_sec( 10 );
21
}
22
23
void Seite_2()
24
{
25
  lcd_clear();
26
27
  lcd_string( "antwortet" );
28
29
  delay_sec( 10 );
30
}
31
32
int main()
33
{
34
  lcd_init();
35
36
  while( 1 )
37
  {
38
    Seite_1();
39
    Seite_2();
40
  }
41
}


Aber sei gewarnt: Solche Warteschleifen sind nur am Anfang dein Mittel 
zur Lösung. In richtigen Programmen kommt man so nicht weiter. 
Hauptsächlich deshalb, weil innerhalb einer Warteschleife (delay_sec) 
nichts weiter passieren kann ausser ISR abzuarbeiten. Genau das ist aber 
kontraproduktiv. Man möchte ja meistens haben, dass ein µC sofort auf 
ein Ereignis reagiert und nicht erst stumpfsinnig irgendwelche Zeit 
runterzählt.

Edit: Damit die _delay_ms Funktion richtig funktioniert, muss der 
Optimizer des Compilers eingeschaltet sein.
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Warteschleifen_.28delay.h.29

von Gerhard (Gast)


Lesenswert?

Es heißt "fragt" und nicht "fraegt". Grausam.

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.