LCD Display Bug

Gast #2202270
Hi,

ich habe ein 2 zeilen (5x8 Pixel) LCD Display

http://www.mikrocontroller.net/attachment/17786/TC1602E_Backlit_LCD.pdf

an einen Atmega 48 gehängt. Folgendes Problem tritt dabei auf:



Einschalten:  beide Zeilen sind "leicht" schwarz, d.h nicht mit vollem 
Kontrast schwarz.

Reset drücken: ändert nichts.

Display abstecken (d.h. Trennen der 4 Datenbits, sowie RS, RW und 
Enable):
obere Zeile mit vollem Kontrast komplett schwarz.

jetzt Reset drücken: Display funktioniert ( Zeichen werden angezeigt).


Sitze schon den ganzen Tag dran und komm nicht weiter, vielleicht kann 
mir einer helfen.. Danke!
Holger,

man müsste wissen wie du das LCD-Display ansprechen willst und auch den 
Code sehen.

Auch ein Schaltplan oder ein Bild vom Aufbau kann uns helfen.

Im Forum findest Du :

- Beitrag "Display TC1602E.01"
- http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1295045532
- 
http://www.df0fkw.datenoase.de/index.php?option=com_content&view=article&id=100:ecm2

Sind vielleicht +5V und GND vertauscht ?

Evtl. das Display zu langsam und benötigt mehr Zeit beim (be-)Schreiben, 
wenn das Busy-Flag nicht abgefragt wird.
Gast
Sorry, hier ist der Code.
Es soll im 4Bit Modus angesprochen werden. Ich habe alle Wartezeiten 
viel größer gemacht, als sie sein müssten. Der Controller sitzt auf 
einem STK500, das Display habe ich über Flachbandkabel an die 
Stiftleiste angeschlossen (PORT D), die Verdrahtung ist korrekt, wie 
gesagt kommen ja auch Buchstaben an. Die Stromversorgung läuft auch über 
das STK, Laut Datenblatt braucht das Display nur 3mA max. (Backlight 
wird nicht verwendet).

Grüße und Danke

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

5
#define F_CPU 1000000
6
#define  DB4     PD0 
7
#define  DB5     PD1  
8
#define  DB6     PD2  
9
#define  DB7     PD3 
10
#define RegSelect   PD4
11
#define RW    PD5
12
#define Enable     PD6 
13
#define LCD_Port   PORTD 
14

15
//Prototypen der Funktionen------------------
16
void lcdInit(void);
17
void enable(void);
18
void lcdClear(void);
19
void schreibeZeichen(char Zeichen);
20

21
int main (void) {
22

23
DDRD=0xff;      //Ausgang
24

25
lcdInit();
26
_delay_ms(50);
27
lcdClear();
28

29
while(1){
30
schreibeZeichen('W');
31
}
32

33
}
34

35
//Funktionen------------------------------------
36

37
void lcdInit(void){
38
  LCD_Port  =  0x00;
39
  _delay_ms(20);    //Boot Zeit
40

41
  LCD_Port  |=  ((1<<DB4)|(1<<DB5));
42
  _delay_ms(5);
43
  enable();
44
  enable();
45
  enable();
46
  //--------------------------------------------------------
47
  LCD_Port  = 0x00;
48
  LCD_Port  |=  (1<<DB5); //4 Bit Ansteuerung
49
  enable();
50
  //--------------------------------------------------------
51
  LCD_Port  |=  (1<<DB5); //2-zeilig, 5x8
52
  enable();
53
  LCD_Port  |=  (1<<DB7); 
54
  enable();
55
  //--------------------------------------------------------
56
  //Display einschalten, blinkender Cursor ein
57
  LCD_Port  = 0x00;
58
  enable();
59
  LCD_Port  |=0b11110000;
60
  enable();
61
}
62

63
void enable(void) {            
64
  LCD_Port    |= (1<<Enable);
65
  _delay_us(20);
66
  LCD_Port    &= ~(1<<Enable);
67
  _delay_us(20);
68
}
69

70

71
void lcdClear(void){
72
  LCD_Port &=~(1<<RegSelect);      
73
  _delay_ms(4);
74
  LCD_Port  =  0x00;  //Display löschen
75
  enable();
76
  LCD_Port  |=  (1<<DB4); 
77
  enable();
78
}
79

80

81
void schreibeZeichen(char Zeichen){
82
LCD_Port |=(1<<RegSelect);
83
_delay_ms(5);
84
LCD_Port = 0x00;
85

86
  switch(Zeichen){
87

88
//als Beispiel ein W  
89

90
  case 'W':
91
    {  LCD_Port |=((1<<DB4)|(1<<DB6));  //bit 0-3 
92
      enable();
93
      LCD_Port |=((1<<DB4)|(1<<DB6)|(1<<DB5));  //bit 4-7
94
      enable();
95
      break;
96
      }
97
  }
98
}
Gast
#define F_CPU 1000000
#include <util/delay.h>

So rum gehört das. Sonst stimmen die Zeiten nicht.
Und lass dir bei der Init ruhig ein bißchen mehr Zeit.

  _delay_ms(20);    //Boot Zeit

  LCD_Port  |=  ((1<<DB4)|(1<<DB5));
  enable();
  _delay_ms(5);
  enable();
  _delay_ms(5);
  enable();
  _delay_ms(5);
Gast
Danke, aber hat nichts bewirkt.
Im Gegenteil, jetzt geht gar nichts mehr..
Nach kurzen Ab- und wieder Anklemmen ist die erste Zeile satt schwarz, 
bei Reset sind beide "grau" und es kommt kein Zeichen mehr an.
Gast
Habs gelöst.
Es lag an einem popligen Zeichen bei der Veroderung. Besser ist es dann 
so (so läuft es auch):
1
  //Display einschalten, blinkender Cursor ein
2
  LCD_Port  = 0x00;
3
  enable();
4
  LCD_Port  |= ((1<<DB7)|(1<<DB6)|(1<<DB5)|(1<<DB4));;
5
  enable();
6
}

Danke und schönes Wochenende!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.