Forum: Mikrocontroller und Digitale Elektronik LCD ANAG VISION 1624YRB


von Andre (Gast)


Lesenswert?

Hallo zusammen

Ich bin mittlerweile echt am verzweifeln. Mein LCD will einfach nicht 
laufen an einem Atmega 32. Sieht hier evtl. jemand einen Fehler?

Die oberste Zeile des 16x2 Displays zeigt nach Anlegen der 
Versorgungsspannung nur schwarze Balken an :-/

Das Display sollte ienen HD44780 kompatiblen controller besitzen.

Als Steuerbits habe ich Port A (0-2) spendiert und als Datenport PortD 
(8Bit modus)
1
//LCD.c
2
//F_CPU = 1MHz
3
//CTRL = Port A
4
//DATA = Port D
5
6
7
#include "LCD.h"
8
9
unsigned char lcd_init(){
10
  
11
  //Benötigte Ports als ausgänge definieren
12
  DDRA = 0xFF;
13
  DDRD = 0xFF;
14
15
  CTRL &= 0x00;
16
  
17
  //Strom anschalten
18
  CTRL |= 0b00000100;
19
20
21
  //Sämtlihe Ports mit Null belegen
22
23
  //30 Millisekunden warten
24
  _delay_ms(30);
25
  DATA = 0;
26
27
  //Initislisierungssequen
28
  pulse_LCD(0b00110000);
29
  _delay_ms(5);
30
31
  pulse_LCD(0b00110000);
32
  _delay_ms(5);
33
34
  pulse_LCD(0b00110000);
35
  _delay_ms(1);
36
37
  //5x8 Dot, 2-Line, 5x8 
38
  pulse_LCD(0b00111000);
39
  _delay_ms(30);
40
41
  //Display Off, Cursor On, Blinking
42
  pulse_LCD(0b00111100);
43
  _delay_ms(30);
44
45
  //Clear Display
46
  pulse_LCD(0b00000001);
47
  _delay_ms(30);
48
49
  //Set Entry Mode
50
  pulse_LCD(0b00000110);
51
  _delay_ms(30);
52
53
  Display On
54
  pulse_LCD(0b00001111);
55
56
  return 0x00;
57
}
58
59
//Funktion zur Übernahme der Daten an das Display
60
void pulse_LCD(uint8_t data){
61
62
  _delay_ms(30); //30 Millisekunden warten
63
64
  //Enable setzen
65
  CTRL |= 0b00000010;
66
  _delay_us(2);  //2 Millisekunden warten
67
68
  DATA = 0;
69
  _delay_us(2);
70
  DATA |= data;
71
  _delay_us(2);
72
73
  //Enable löschen
74
  CTRL &= 0b11111101;
75
  _delay_us(2);
76
  
77
78
  //Ausgangswerte wieder lsöchen
79
  DATA &= 0b00000000;
80
}
81
82
void lcd_write(uint8_t data){
83
84
  DATA = 0;
85
  _delay_us(2);
86
87
  //30 Millisekunden warten
88
  _delay_ms(30);
89
90
  //RS setzen
91
  CTRL |= 0b00000001;
92
  _delay_us(2);
93
94
  //Enable-Impuls setzen
95
  CTRL |= 0b00000010;
96
  _delay_us(2);
97
98
  //Übernahme der Daten
99
  DATA = data;
100
  _delay_us(2);
101
102
  //Löschen der Flags (Enable)
103
  CTRL &= 0b11111101;
104
  _delay_us(2);
105
106
  //Löschen der restlichen Flags
107
  DATA &= 0x00;
108
  CTRL &= 0b11111110; //RS löschen
109
}

Vielen Dank im Voraus!!

von H.Joachim S. (crazyhorse)


Lesenswert?

Habe keine Lust, mich da durchzuforsten :-)
Es gibt Unmengen an funktionierendem Code (meist allerdings im 
4bit-mode) - warum nimmst du nicht sowas?
Ausserdem gibts ein LCD-Controller (KSirgendwas??), der ist zu 99% 
kompatibel - aber gerade in der init-Sequenz nicht. Vielleicht liegts 
nur daran?

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.