Forum: Mikrocontroller und Digitale Elektronik Zeilendefinitionen für 4x20 LCD


von Thomas P. (thomas_p52)


Lesenswert?

Hallo

Ich hab mir nach dem Tutorial 
(http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung) 
bzw der Erweiterung dazu 
(http://www.mikrocontroller.net/articles/Erweiterte_LCD-Ansteuerung) 
eine LCD Steuerung zusammengebastelt, funktioniert so weit auch gut, bis 
auf die Positionen....

Im Header File kann man ja die Zeilendefinitionen einstellen, und sind 
auch schon für ein 4x16 LCD da, nur wie siehts da mit einem 4x20 aus? 
Die ersten zwei Zeilen werden richtig angezeigt, nur Zeile 3 am Ende von 
Zeile 1 bzw. Zeile 4 am Ende von Zeile 2. Auch mit meinem Code ändert 
sich nichts an der Sache. Es bleibt genau gleich wie beim 4x16 Code

Wie gehört es richtigerweise?

4x16:
1
////////////////////////////////////////////////////////////////////////////////
2
// Zeilendefinitionen des verwendeten LCD
3
// die Einträge hier sollten für ein LCD mit einer Zeilenlänge von 16 Zeichen passen
4
// bei anderen Zeilenlängen müssen diese Einträge angepasst werden
5
 
6
#define LCD_DDADR_LINE1         0x00
7
#define LCD_DDADR_LINE2         0x40
8
#define LCD_DDADR_LINE3         0x10
9
#define LCD_DDADR_LINE4         0x50

und meine Version 4x20:
1
////////////////////////////////////////////////////////////////////////////////
2
// Zeilendefinitionen des verwendeten LCD (4x20)
3
 
4
#define LCD_DDADR_LINE1         0x00
5
#define LCD_DDADR_LINE2         0x40
6
#define LCD_DDADR_LINE3         0x14
7
#define LCD_DDADR_LINE4         0x54

mfg thomas

von Hans Peter B. (Gast)


Lesenswert?

Eine Supererklärung für dein Problem findest du unter
http://www.sprut.de/electronic/lcd/index.htm

Hans Peterhttp://www.sprut.de/electronic/lcd/index.htm

von Thomas P. (thomas_p52)


Lesenswert?

Hallo

Hab grad eine Lösüng gefunden :D

Ich hab mir ein Programm geschrieben, mit dem ich Zeichen für Zeichen 
durchgehe und hab so die richtigen Adressen herausgefunden, diese darf 
ich aber nicht hexadezimal addieren sondern normal, dezimal:

Line1: 0
Line2: 40
Line3: 20
Line4: 84

Dies kann ich aber komischerweise nicht in den defines eintragen, 
sondern muss es direkt ins lcd.c eintragen. Weiß jemand warum?

Abfrageprogramm:
1
#ifndef F_CPU
2
  #define F_CPU 16000000
3
#endif
4
5
#include <avr/io.h>
6
#include "lcd.h"
7
#include <util/delay.h>
8
#include <stdlib.h>
9
#include "rncontrol.h"
10
11
12
int main(void)
13
{
14
  int i=0, data;
15
  char number[2];
16
  
17
  lcd_init();    //LCD initialisieren
18
19
        while(1)
20
        {
21
    lcd_clear();
22
    data = LCD_SET_DDADR + i;
23
    lcd_command(data);
24
    lcd_string("x");
25
    itoa(i,number,10);
26
    lcd_string_xy(1,1,number);
27
    _delay_ms(200);
28
    
29
    REDO:{};
30
    
31
    if(button()==2)
32
      i++;
33
    else if (button()==4)
34
      i--;
35
    else
36
      goto REDO;
37
  }
38
}

von H. P. Bolliger (Gast)


Lesenswert?

itoa() heisst integer to ASCII und erwartet bei dir die Zählvariable i 
als int. Darum wäre es einfacher i direkt in einen ASCII-char zu wandeln
Hans Peter

von Thomas P. (thomas_p52)


Lesenswert?

Ok, dass wär auch möglich, aber ich stell mir die Frage warum ich die 
Werte direkt ins lcd.c File schreiben muss, und nicht wie eigentlich 
vorgesehen über die #define Anweisung im lcd.h machen kann....

mfg thomas

von H. P. Bolliger (Gast)


Lesenswert?

Also wenn, wie du in der Eingangsfrage beschrieben hast, die 
Definitionen in LCD.h mit Hex-Werten funktionieren, dann sollten auch 
Integer-Werte kein problem darstellen. -> Die Verzögerungswerte weiter 
oben sind auch in dezimal eingetragen!
Wobei bei den, mit deinem Abfrageprogramm ermittelten Adressen, kann der 
Wert für Linie 2 nicht stimmen - der sollte 64 dez betragen.
Hans Peter

von Thomas P. (thomas_p52)


Lesenswert?

Hallo
Doch, der Wert stimmt, es funktioniert ;)

Das Problem ist, ich kann dort eintragen was ich will, ändern tut sich 
nichts....

mfg thomas

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.