Forum: Mikrocontroller und Digitale Elektronik Custom character bei Display mit HD44780


von Thomas M. (thomas_m2)


Lesenswert?

Hallo,

ich fange gerade mit Mikrocontrollern an und habe mir vor kurzem ein 
HD44780-gesteuertes LCD-Display (2x16) geholt, das mit einem ATMega 
32-16 ansteuere. Ich kann das Display soweit auch gut ansprechen und 
darauf schreiben, aber beim Definieren eigener Zeichen hakt es.

Wenn ich versuche, den Anfang des CGRAM auszuwählen und etwas rein zu 
schreiben, springt der Cursor stattdessen in die untere Zeile des 
Displays. Wenn ich dann versuche, ein Zeichen ins CGRAM zu schreiben, 
läuft der Cursor weiter. Versuche ich dann (nach einem Rücksprung an den 
Beginn der ersten Zeile) das Zeichen auszugeben, passiert nichts.

Verlötung und Verkabelung habe ich schon x-mal gecheckt und ich kann das 
Display sonst ja auch problemlos ansprechen.

Ich komme nicht weiter und habe auch keine Idee. Ich habe meinen Code 
mal angehängt. Er ist krude, aber ich will gerne das Display wirklich 
Schritt für Schritt betreiben, um zu verstehen was da abläuft. Ich 
denke, das Problem ist vielleicht offensichtlich, aber ich komme 
momentan einfach nicht dahinter.

Weiß nicht ob es einen Unterschied macht aber mein Display hat 
japanische statt europäische Sonderzeichen (aber eigentlich sind die 
CGRAM-Adressen ja identisch).

Viele Grüße,

Thomas

1
#define F_CPU 1000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
int main(void)
7
{
8
    DDRA  = 0b11111111; //Bank A: Data
9
    DDRD  = 0x00000001; //PD0: Register select
10
    PORTC = 0b00000001; //Enable: high
11
    DDRC  = 0x00000001; //PC0: Enable
12
    
13
    PORTD = 0b00000000; //Instruction mode
14
    
15
    _delay_ms(500);
16
    
17
    PORTA = 0b00111000; //8 bit, 2 Zeilen, 5×7 Font
18
    PORTC = 0b00000000; //Enable
19
    PORTC = 0b00000001;
20
    
21
    _delay_ms(500);
22
    
23
    PORTA = 0b00001111; //Display an, Cursor move, Cursor blinkt nicht
24
    PORTC = 0b00000000; //Enable
25
    PORTC = 0b00000001;
26
    
27
    _delay_ms(500);
28
    
29
    PORTA = 0b00000110; //Entry mode, Increment cursor, kein display shift
30
    PORTC = 0b00000000; //Enable
31
    PORTC = 0b00000001;
32
    
33
    _delay_ms(500);
34
    
35
    PORTD = 0b00000001; //Data mode
36
    
37
    int i;
38
    
39
    for (i = 0; i < 5; i++)
40
    {
41
        PORTA = 0b00110000; //Schreibe "0", damit was passiert
42
        PORTC = 0b00000000; //Enable
43
        PORTC = 0b00000001;
44
        
45
        _delay_ms(10);
46
    }
47
    
48
    _delay_ms(500);
49
    
50
    PORTD = 0b00000000; //Instruction mode
51
    PORTA = 0b01000000; //Sprung @CGRAM: 0x40 --> Sprung erfolgt aber in zweite Displayzeile (DDRAM 0x40) !?
52
    PORTC = 0b00000000; //Enable
53
    PORTC = 0b00000001;
54
    
55
    _delay_ms(500);
56
    
57
    PORTD = 0b00000001; //Data mode
58
    PORTA = 0b00100001; //CGRAM(1): Punkt rechts oben (im DDRAM käme "!") --> Cursor springt eine Position weiter (DDRAM 0x41)
59
    PORTC = 0b00000000; //Enable
60
    PORTC = 0b00000001;
61
    
62
    _delay_ms(500);
63
    
64
    PORTD = 0b00000000; //Instruction mode
65
    PORTA = 0b10000000; //Sprung @DDRAM: 0x0 (funktioniert)
66
    PORTC = 0b00000000; //Enable
67
    PORTC = 0b00000001;
68
    
69
    PORTD = 0b00000001; //Data mode
70
    PORTA = 0b00000000; //Schreibe neues Zeichen --> nichts passiert
71
    PORTC = 0b00000000; //Enable
72
    PORTC = 0b00000001;
73
    
74
    while(1) {}
75
    
76
    return (1);
77
}

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Thomas Metz schrieb:
> PORTD = 0b00000000; //Instruction mode
>     PORTA = 0b10000000; //Sprung @DDRAM: 0x0 (funktioniert)
>     PORTC = 0b00000000; //Enable
>     PORTC = 0b00000001;

usw.
So macht das doch kein Mensch. Schreib dir doch bitte erstmal ein paar 
Unterprogramme , z.B. fürs Enable Signal:
1
void myEnable(void) {
2
  PORTC |= (1<<PC0);
3
  _delay_us(1);
4
  PORTC &= ~(1<<PC0);
5
  _delay_us(40);
6
}
Sonst kapiert das doch keiner und du schreibst in Pins rein, an die das 
Display gar nicht angeschlossen ist. Ausserdem unterschreitest du leicht 
die minimale Enable Zeit mit deinen Instruktionen. Die HD44780 sind 
laaangsame Chips.
Richte dich dann doch mal nach der korrekten Initialisierung des 
Displays, beschrieben im Datenblatt:
Anschalten und mehr als 15ms warten, nachdem Vcc 4,5V erreicht hat.
dann Daten = 0b00110000
4,1ms warten
Daten  =  0b00110000
100µs warten
nochmal Daten = 0b00110000

Erst dann kannst du sicher sein, das das LCD in der gewünschten 
Betriebsart ist. Dann solltest du nach jedem Schreiben warten, nach 
Datenblatt etwa 37µs nach den meisten Instruktionen.

: Bearbeitet durch User
von Thomas M. (thomas_m2)


Lesenswert?

Hallo Matthias,

vielen Dank für Deinen Hinweis mit der Initialisierung und der 
Enable-Zeit. Ich hab entsprechende Pausen eingefügt und jetzt geht es.

Viele Grüße,

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.