LCD Anzeige macht Probleme

Gast #1424976
Lesenswert?

Hallo,

ich habe dieses 
(http://www.reichelt.de/?;ACTION=3;LA=0;GROUPID=3005;ARTICLE=31653;APE=0;SID=31dmHv86wQAR8AAAOeeEo31c9a0fc77def4657a3a3e06e3a57f37) 
display, und möchte es im 4-Bit-Modus ansteuern. Dazu ahbe ich hier im 
Forum ein Beispielprogramm in C gefunden. Jedoch zeigt das Display nach 
dem Anschließen an einen Port in der unteren Reihe nur schwarze Balken 
an. Egal welcher Port, egal ob ein Programm auf dem µC ist oder nicht. 
Woran kann das ligen?
Gast #1425007
Lesenswert?

> Woran kann das liegen?
Nach der Aussage:

>Jedoch zeigt das Display nach dem Anschließen an einen Port in der
> unteren Reihe nur schwarze Balken an. Egal_ _welcher Port, egal ob ein
> Programm auf dem µC ist oder nicht.
...liegt es daran, dass du nicht weisst, was du tust, oder?

- Schaltplan
- Programm

Das ist das mindeste, was du uns zur Verfügung stellen solltest. Dann 
können wir dir auch helfen.

Ralf
Gast #1425058
Lesenswert?

Hier die Dateien:

C-Datei:
1
/*
2
LCD4b.c
3
---------------------------------------------------------------------------------------
4
                 LCD-Routine für KS0070 und HD44780 im 4Bit Modus v1.1
5
---------------------------------------------------------------------------------------
6
*/
7

8
#include <avr/io.h>
9
#include "lcd4b.h"
10
#include <avr/delay.h>
11

12

13
int main(void)
14
{
15
  DDRD |=  0b11111100;      //Pins 2-7 als Ausgänge 
16
  
17
  DDRC = 0xff;
18
  _delay_ms(2000);
19
  PORTC=0x00;
20
  _delay_ms(500);
21
  PORTC=0xff;
22

23
  lcd_linit();        //LCD Initialisieren
24
  lcd_clear();        //Display löschen
25
  lcd_out("Hallo Welt");      //Text ausgeben
26
  lcd_command(line2);      //2. Zeile
27
  lcd_out("!!!");        //Text ausgeben
28

29
  while(1);
30
}
31

32

33
// sendet ein Datenbyte an das LCD
34
void lcd_data(char byte)
35
{
36
  char sich_byte;
37
  sich_byte = byte;
38
  byte &= ~0x0f;          //Bit 0-3 auf 0 setzen
39
  byte |= (1<<lcd_rs);      //RS setzen
40
  PORT = byte;          //oberes Nibbel Ausgeben
41
  lcd_enable();
42

43
  byte = sich_byte;
44
  byte = byte<<4;          //Nibbles vertauschen
45
  byte &= ~0x0f;          //Bit 0-3 auf 0 setzen
46
  byte |= (1<<lcd_rs);      //RS setzen
47
  PORT = byte;          //unteres Nibbel Ausgeben
48
  lcd_enable();
49

50
  kpause();
51
}
52

53
//sendet einen Befehl an das LCD
54
void lcd_command(char byte)
55
{                              //wie lcd_data, nur ohne RS zu setzen
56
  char sich_byte;
57
  sich_byte = byte;
58
  byte &= ~0x0f;          //Bit 0-3 auf 0 setzen
59
  PORT = byte;          //oberes Nibbel Ausgeben
60
  lcd_enable();
61

62
  byte = sich_byte;
63
  byte = byte<<4;          //Nibbles vertauschen
64
  byte &= ~0x0f;          //Bit 0-3 auf 0 setzen
65
  PORT = byte;          //unteres Nibbel Ausgeben
66
  lcd_enable();
67

68
  kpause();
69
}
70

71
//erzeugt den Enable-Puls
72
void lcd_enable(void)
73
{
74
  PORT |= (1<<lcd_e);          //Enable auf High
75
  kpause();              //kurze pause
76
  PORT &= ~(1<<lcd_e);           //Enable auf Low
77
}                 
78

79
//Pause nach jeder Übertragung
80
void kpause(void)
81
{
82
  _delay_us(48);            //48us Pause
83
}
84

85

86
//Längere Pause für manche Befehle
87
void lpause(void) 
88
{
89
  _delay_ms(5);            //5ms Pause
90
}
91

92
//Initialisierung
93
void lcd_linit(void)          //Wenn der Display gleich nachdem er mit Spannung versorgt wurde
94
{                    //in Betrieb genommen werden soll
95
  unsigned char i;
96
  for(i=0;i<10;i++)
97
  {
98
    _delay_ms(10);
99
  }
100
  lcd_init();
101
}
102

103
//Initialisierung
104
void lcd_init(void)
105
{
106
  PORT = 0b00100000;        //Interface auf 4-Bit setzen
107

108
  lcd_enable();
109
  lpause();
110

111
  
112
  lcd_command(0b00101000);    // 2-zeilig, 5x8-Punkt-Matrix
113
  lcd_command(0b00001100);    // Display ein
114
  lcd_command(0b00000110);    // Kursor nach rechts wandernd, kein Display shift
115
}
116

117
//Sendet den Befehl zur Löschung des Displays
118
void lcd_clear(void)
119
{
120
    lcd_command(0x01);
121
  lpause();
122
}
123

124
//gibt einen Text aus
125
void lcd_out(char *s)
126
{
127
    while (*s)            //so lange *s != '\0' also ungleich dem "String-Endezeichen"
128
    {
129
        lcd_data(*s);        //Zeichen ausgeben
130
        s++;
131
    }
132
}
133
/*
134
-----------------------------------------------------------------------------------------------
135
LCD4b developed by Johannes K.
136
-----------------------------------------------------------------------------------------------
137
*/

und die Headerdatei:
1
/*
2
LCD4b.h
3
---------------------------------------------------------------------------------------
4
                 LCD-Routine für KS0070 und HD44780 im 4Bit Modus v1.1
5
---------------------------------------------------------------------------------------
6
Für die Ansteuerung des Displays werden 6 Pins benötigt.
7

8
Pinbelegung:            
9
PORT Pin lcd_rs    RS
10
PORT Pin lcd_e    E
11
PORT Pin 4        Datenbit 4
12
PORT Pin 5         Datenbit 5
13
PORT Pin 6         Datenbit 6
14
PORT Pin 7          Datenbit 7
15
               R/W und Datenbits 0-3 auf GND
16
               
17
PORT, lcd_rs, lcd_e können frei gewählt werden
18

19
Software:  
20
  AVR-GCC 3.3
21
  AVR Libc 1.2.3 
22
  
23
Hardware:  
24
  AVR-uController
25
*/
26
#ifndef F_CPU
27
#define F_CPU 1000000UL     //Prozessor Frequenz in Hz
28
#endif
29

30
#define lcd_e 3              //E Pinnummer
31
#define lcd_rs 2             //RS Pinnummer
32
#define PORT PORTD           //Portname
33

34
#define line1 0b10000000     //Adresse im Speicher des LCD-Controllers für die 1. Zeile
35
#define line2 0b11000000     //Adresse im Speicher des LCD-Controllers für die 2. Zeile
36

37
extern void lcd_data(char byte);
38
extern void lcd_command(char byte);
39
extern void lcd_enable(void);
40
extern void kpause(void);
41
extern void lpause(void);
42
extern void lcd_linit(void);
43
extern void lcd_init(void);
44
extern void lcd_clear(void);
45
extern void lcd_out(char *s);
46
/*
47
-----------------------------------------------------------------------------------------------
48
LCD4b developed by Johannes K.
49
-----------------------------------------------------------------------------------------------
50
*/

Belegung:

Pins (LCD) 1, 3, 5 und 7-10 an Masse
Pins (LCD) 11-14 an PORTD 4-7
E wie beschrieben an 3
und rs an 2
Gast #1425194
Lesenswert?

Hi

>Das würde ich eben wissen, was man machen muss, um die 4 Bits um ein Pin
>zu verschieben. Bei E und RS war es ja ganz einfach.

Dann musst du aber noch die Software umschreiben.

Das
>  char sich_byte;
>  sich_byte = byte;
>  byte &= ~0x0f;          //Bit 0-3 auf 0 setzen
>  byte |= (1<<lcd_rs);      //RS setzen
>  PORT = byte;          //oberes Nibbel Ausgeben
>  lcd_enable();

>  byte = sich_byte;
>  byte = byte<<4;          //Nibbles vertauschen
>  byte &= ~0x0f;          //Bit 0-3 auf 0 setzen
>  byte |= (1<<lcd_rs);      //RS setzen
>  PORT = byte;          //unteres Nibbel Ausgeben
>  lcd_enable();

basiert darauf, das Bit4..7 an Port4..7 hängen. Reichen deine 
C-Kenntnisse aus, das anzupassen?

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