Forum: Mikrocontroller und Digitale Elektronik Speicher beim TC 1602


von Achim S. (achims)


Lesenswert?

Hallo
Bei den Displays mit 4 Linien und 20 Zeichen liegen die Adressen des 
Speichers (nach PF) bei:
1
#define LCD_LINES       4 /*number of visible lines of the display 4 */
2
#define LCD_DISP_LENGTH 20 /*visibles cha. per line of the display 20 */
3
#define LCD_LINE_LENGTH 0x40 /*internal line length of the dis. 0x40 */
4
#define LCD_START_LINE1 0x00 /* DDRAM address of first char of line 1 */
5
#define LCD_START_LINE2 0x40 /* DDRAM address of first char of line 2 */
6
#define LCD_START_LINE3 0x14 /* DDRAM address of first char of line 3 */
7
#define LCD_START_LINE4 0x54 /* DDRAM address of first char of line 4 */
8
#define LCD_WRAP_LINES    0 /* 0:no wrap,1:wrap at end of visibile line */
Wenn ich ein anderews Display verwende (TC1602E) mit 16 Zeichen und 2 
Linien verändern sich auch die Adressen des Speichers.
Wie sind dann die Werte?
achim

von spess53 (Gast)


Lesenswert?

Hi

>Wenn ich ein anderews Display verwende (TC1602E) mit 16 Zeichen und 2
>Linien verändern sich auch die Adressen des Speichers.
>Wie sind dann die Werte?

S.3 in
http://www.lcd-module.de/fileadmin/pdf/doma/blueline-w.pdf

MfG Spess

von Achim S. (achims)


Lesenswert?

Danke für die Info
achim

von Achim S. (achims)


Lesenswert?

Nach den Angaben im Datenblatt sind das die Adressen:

00-0F
40-4f

Bei PF sind 4 Lines mit den Adressen

L1 - 00
L2 - 40
L3 - 14
L4 - 54

angegeben.

Wenn ich 2 Lines eintrage, welche Adressen (Line) muss ich angeben?
Nach Wiki oder spurt, kann es als 8+8 oder (2)16 gebaut sein
achim

von spess53 (Gast)


Lesenswert?

Hi

>Nach Wiki oder spurt, kann es als 8+8 oder (2)16 gebaut sein

8+8 findet man eigentlich nur bei einzeiligen Displays. Bei zweizeiligen 
Displays sind als Anfangsadressen 0x00 und 0x40 üblich.

MfG Spess

von Achim S. (achims)


Lesenswert?

In welche Linie muss ich es eintagen (L1 bis L4)
bzw. 2 Linien angeben?

von spess53 (Gast)


Lesenswert?

Hi

Hör mal mit deinen Linien auf. In dem Zusammenhang ist Line mit Zeile zu 
übersetzen.

#define LCD_LINES       2
#define LCD_DISP_LENGTH 16
#define LCD_LINE_LENGTH 40     (!! oben falsch)
#define LCD_START_LINE1 0x00
#define LCD_START_LINE2 0x40

MfG Spess

von Achim S. (achims)


Lesenswert?

Danke für deine Info
achim

von Achim S. (achims)


Lesenswert?

Sorry, muss noch mal fragen.
Es stimmt wass nicht bei den Angaben. Habe die die Werte so eingetragen:
1
#define LCD_LINES           2    
2
#define LCD_DISP_LENGTH    16    
3
// #define LCD_LINE_LENGTH  0x40    
4
#define LCD_START_LINE1  0x00    
5
#define LCD_START_LINE2  0x40
In der ersten Zeile erscheinen die Zeichen von 1 bis 16.
Die zweite Zeile kann ich nicht erreichen. Egal welche Position ich 
eingebe, es erscheint nur die erste Stelle. Sonst kann ich in der 
zweiten Zeile nichts ausgeben lassen.
Display defekt? Denkfehler?
achim

von holger (Gast)


Lesenswert?

>Display defekt? Denkfehler?

Programmfehler. An welcher Stelle kann man nicht sagen
da das Programm nicht bekannt ist.

von Achim S. (achims)


Lesenswert?

Kein Problem.
Auszug aus der lcd.h
1
#define LCD_LINES           2     
2
#define LCD_DISP_LENGTH    16     
3
#define LCD_LINE_LENGTH  40         
4
#define LCD_START_LINE1  0x00     
5
#define LCD_START_LINE2  0x40

Auszug aus dem Programm:
1
// Text auf LCD ausgeben
2
lcd_printlc(1,1,(unsigned char *)"ABCDE1234554321B");
3
lcd_printlc(2,1,(unsigned char *)"12345");
Die erste Zeile wird korrekt ausgegeben. In der zweiten Zeile erscheint 
nur 5, ganz links und lässt sich nicht nach rechts schieben.
achim

von holger (Gast)


Lesenswert?

>Auszug aus dem Programm:

Reicht nicht.

von Achim S. (achims)


Lesenswert?

Das nächste:
1
#define F_CPU 16000000
2
#include <avr/io.h>         // Header-Datei 
3
#include <avr/interrupt.h>  // Header-Datei f. Interruptfunktion
4
#include <stdint.h>         // Header-Datei 
5
#include "i2clcd.h"         // Header-Datei f. I2CLCD
6
7
volatile uint8_t tcount;    // Globale Variable (volatile)
8
uint8_t x;                  // Lokale Variable zum Schalter des Ports
9
int loops = 0;              // Zähler 
10
..
11
ISR
12
...
13
int main(void) 
14
  {              // Hauptprogramm ab hier
15
    x = 0;                        // Flag für LED Zustand (0/1)
16
    char s[20];                   // String-Variable für Ausgabe der Sequenzanzahl
17
    DDRD = (1 << DDD7);           // PortD7 als Ausgang für LED1
18
    TCCR0 = (1<<CS02);            // Prescaler 256
19
    TIMSK |= (1<<TOIE0);          // Overflow Interrupt erlauben
20
    sei();                        // Global Interrupts aktivieren
21
    i2c_init();                   // I2C initialisieren
22
    lcd_init();                   // LCD initialisieren
23
    lcd_command(LCD_CLEAR);       // LCD-Anzeige löschen
24
25
// Text auf LCD ausgeben
26
27
lcd_printlc(1,1,(unsigned char *)"ABCDE1234554321B");
28
29
lcd_printlc(2,1,(unsigned char *)"        12345");
30
31
lcd_wait_ms(10000);            // Text 3s stehen lassen
32
lcd_command(LCD_CLEAR);       // Display löschen
33
...
ohne den Abstand  bei (2,1) kommt nichtz mal die 5
achim

von holger (Gast)


Lesenswert?

Reicht immer noch nicht.

Ich möchte den Code von lcd_printlc() sehen.
Wenn lcd_printlc() Unterfunktionen aufruft möchte ich auch
den Code von den Unterfunktionen sehen.

Sonst wird das hier nichts.

von Achim S. (achims)


Lesenswert?

Habe was gefunden.
Die Einstellung der Zeilen und der Länge kann in lcd.h und in i2clcd.h 
vorgenommen werden. Wenn ich es in i2clcd.h verändere funktioniert es.
Danke
achim

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.