LCD Display HD44780 - Nur die rechte seite Funktioniert

Gast #2460359
Lesenswert?

Hey Leute,
Habe heute endlich das Display bekommen, verschaltet und getestet. Da 
kam dieses Problem auf: Erstes Bild im Anhang

Wie man sieht, ist die rechte seite weiß. Was mir aber aufgefallen ist, 
ist das der Cursor hinter dem weiß blinkt. Also das sieht man durch das 
Weiß hindurch irgendwie xD

Ist das Teil kaputt(was sehr, sehr schade wäre, weil ich dann wie 2 
wochen auf ein neues warten muss oO), oder hab ich da was Falsch 
gemacht?

Und jetzt seht euch mal das zweite Bild im Anhang an.
Das sieht echt nicht gut aus und lässt mich vermuten, das das Display 
kaputt ist. Aber wieso sollte man sowas denn hinbekommen?!
Angehängte Dateien:
Gast #2460392
Lesenswert?

Hast Du das LCD auch für zweizeiligen Betrieb initialisiert? Das ändert 
die interne Zuordnung der Displayadressen und könnte genau so aussehen - 
hintere Hälfte des LCD nicht initialisiert und auch nicht beschreibbar.
Gast #2460441
Lesenswert?

Du musst im Command-Mode 0x28 (4bit) oder 0x38 (8bit) senden.

Display-RAM Adressen:

1-zeilig: 00 01 02 03 04 05 06 07 40 41 42 43 44 45 46 47

2-zeilig: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
          40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F

Merkst Du was?
Gast #2460493
Lesenswert?

1
#include <avr/io.h>
2
#include <util/delay.h>
3

4
#define LCDDataPort   PORTB
5
#define LCDDataDDR    DDRB
6
#define ControlPort    PORTD
7
#define ControlDDR     DDRD
8
#define Enable      5
9
#define ReadWrite    7
10
#define BiPolar      2
11

12
void PeekABoo(void);
13
void SendCommand(unsigned char command);
14
void SendCharacter(unsigned char character);
15
void LCDIsBusy(void);
16

17
int main(void){
18
  
19
  ControlDDR |= 1<<Enable | 1<<ReadWrite | 1<<BiPolar;
20
  _delay_ms(15);
21
  
22
  SendCommand(0b00000001);
23
  _delay_ms(20);
24
  
25
   SendCommand(0x38);
26
  _delay_ms(20);
27
   SendCommand(0b00001111);
28
  _delay_ms(20);
29
  
30
   
31
   SendCharacter(0x4c);
32
   SendCharacter(0x69);
33
   SendCharacter(0x65);
34
   SendCharacter(0x73);
35
   SendCharacter(0x73);
36
   SendCharacter(0x20);
37
   SendCharacter(0x4a);
38
   SendCharacter(0x65);
39
   SendCharacter(0x6d);
40
   SendCharacter(0x61);
41
   SendCharacter(0x69);
42

43
  
44
  while (1)
45
  {
46
    
47
    
48
  }
49

50
}
51

52
void LCDIsBusy(){
53
  
54
  LCDDataDDR = 0;
55
  ControlPort |= 1<<ReadWrite;
56
  ControlPort &= ~ 1<<BiPolar;
57
  
58
  while(LCDDataPort >= 0x80){
59
  
60
    PeekABoo();
61
  
62
  }
63
  
64
  LCDDataDDR = 0xFF;
65
  
66
}
67
void PeekABoo(){
68

69
  ControlPort |= 1<<Enable;
70
  asm volatile ("nop");
71
  asm volatile ("nop");
72
  ControlPort &= ~1<<Enable;
73

74
}
75
void SendCommand(unsigned char command){
76
  
77
  LCDIsBusy();
78
  LCDDataPort = command;
79
  ControlPort &= ~ (1<<ReadWrite|1<<BiPolar);
80
  PeekABoo();
81
  LCDDataPort = 0;
82

83
}
84
void SendCharacter(unsigned char character){
85

86
  LCDIsBusy();
87
  LCDDataPort = character;
88
  ControlPort &= ~ (1<<ReadWrite);
89
  ControlPort |= 1<<BiPolar;
90
  PeekABoo();
91
  LCDDataPort = 0;
92
  
93
}

hier mal der ganze code ;D
Gast #2460513
Lesenswert?

Bitte das 0x38 dreimal wiederholen, danach erst das Display clearen 
(0b00000001), natürlich immer mit einem Delay hintendran.

Wenn das nicht hilft, das 0x38 in einer Endlosschleife senden und die 
LCD-Pins messen, also ob Data = 0x38, RS und RW = 0 ist.
Gast #2460535
Lesenswert?

Sry wegen doppelpost, aber: Wenn 0x38 weglasse, muss ich den Kontrast 
höher machen, damit die schrift zu lesen ist. Die rechte seite, sieht 
dann so aus, als hätte ich wenig kontrast drin, also weniger weiß. 
Fortschritt oder nicht?
Gast #2460586
Lesenswert?

Sieht so aus als ob es den "Segment Driver" zerschossen hätte (der ist 
für die Segmente der 2. Hälfte zuständig).

Passiert was wenn du auf dem Epoxid-Klecks hinter der 2. Hälfte drückst 
oder wird er heiß? Ist auf der Rückseite ein Lötzinnklecks gelandet?
Gast #2460597
Lesenswert?

Hi

>Kann es Kaputt sein, weil ich zu heiß gelötet habe oder so? Weil die
>Pins musste ich ja selbst hinlöten

Sehr unwahrscheinlich. Aber weshalb hast du so eine kastrierte 
Initialisierung? Mach es doch einfach mal so wie im Datenblatt.


>  while(LCDDataPort >= 0x80){
>  PeekABoo();

Das passt nicht.

E auf H
Einlesen
E auf L

MfG Spess

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