Speicher beim TC 1602

OP #3587221
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
OP #3587749
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
Gast #3587771
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
Gast #3587948
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
OP #3588690
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
OP #3588704
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
OP #3588720
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
Gast #3588770
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren