Forum: Mikrocontroller und Digitale Elektronik 16X1 LCD zeigt nur 8 Zeichen


von T. G. (to_m)


Lesenswert?

Hallo,is

kannst mir jemand sagen, was an meinem Code falsch ist.

Ich möchte über den 8Bit-Mode ein LDC Display ansteuern

Gelesen habe ich schon wie es geht, es will aber trotzdem nicht 
funktionieren.

Hier der c-Code
1
/*
2
 * LCD_Anzeige.c
3
 *
4
 * Created: 09.11.2014 23:07:36
5
 *  Author: Admin
6
 */ 
7
8
9
#define F_CPU  4000000UL
10
#include <avr/io.h>
11
#include <util/delay.h>
12
13
14
15
/*LCD function declarations */
16
void LCD_send_command(unsigned char cmnd);
17
void LCD_send_data(unsigned char data);
18
void LCD_init();
19
void LCD_goto(unsigned char y, unsigned char x);
20
void LCD_print(char *string);
21
void LCD_blink();
22
void LCD_scroll(unsigned char direction);
23
24
#define LCD_DATA_PORT   PORTC
25
#define LCD_DATA_DDR  DDRC
26
#define LCD_DATA_PIN  PINC
27
28
#define LCD_CNTRL_PORT  PORTD
29
#define LCD_CNTRL_DDR  DDRD
30
#define LCD_CNTRL_PIN  PIND
31
32
#define LCD_RS_PIN    2
33
#define LCD_RW_PIN    3
34
#define LCD_ENABLE_PIN  4
35
36
37
38
int main(void)
39
{
40
  
41
  DDRB = 0xFF;
42
  unsigned char i;
43
  
44
  LCD_init();
45
  //LCD_goto(1,2);
46
  LCD_print("<<>>HALLO<<>>");
47
  //LCD_goto(2,3);
48
  //LCD_print("WELCOMES YOU");
49
  
50
  while(1)
51
  {
52
    //for(i=0;i<2;i++)
53
    //LCD_blink();
54
    
55
    //PORTB = 0xFF;
56
    //_delay_us(1000);
57
    //PORTB = 0x00;
58
    //_delay_us(1000);
59
    
60
    for(i=0;i<15;i++)
61
    LCD_scroll(0);
62
    
63
    //for(i=0;i<4;i++)
64
    //LCD_scroll(1);
65
    
66
    //for(i=0;i<2;i++)
67
    //LCD_scroll(0);
68
  }
69
}
70
71
/* This function sends a command 'cmnd' to the LCD module*/
72
void LCD_send_command(unsigned char cmnd)
73
{
74
  LCD_DATA_PORT = cmnd;
75
  LCD_CNTRL_PORT &= ~(1<<LCD_RW_PIN);
76
  LCD_CNTRL_PORT &= ~(1<<LCD_RS_PIN);
77
  
78
  LCD_CNTRL_PORT |= (1<<LCD_ENABLE_PIN);
79
  _delay_us(2);
80
  LCD_CNTRL_PORT &= ~(1<<LCD_ENABLE_PIN);
81
  _delay_us(100);
82
}
83
84
/* This function sends the data 'data' to the LCD module*/
85
void LCD_send_data(unsigned char data)
86
{
87
  LCD_DATA_PORT = data;
88
  LCD_CNTRL_PORT &= ~(1<<LCD_RW_PIN);
89
  LCD_CNTRL_PORT |= (1<<LCD_RS_PIN);
90
  
91
  LCD_CNTRL_PORT |= (1<<LCD_ENABLE_PIN);
92
  _delay_us(2);
93
  LCD_CNTRL_PORT &= ~(1<<LCD_ENABLE_PIN);
94
  _delay_us(100);
95
}
96
97
void LCD_init()
98
{
99
  LCD_CNTRL_DDR = 0xFF;
100
  LCD_CNTRL_PORT = 0x00;
101
  LCD_DATA_DDR = 0xFF;
102
  LCD_DATA_PORT = 0x00;
103
  
104
  _delay_ms(50);
105
  LCD_send_command(0x38);
106
  LCD_send_command(0x0C);
107
  LCD_send_command(0x01);
108
  LCD_send_command(0x0E);
109
  _delay_ms(1000);
110
  LCD_send_command(0x14);
111
  LCD_send_command(0x0F);
112
  //LCD_send_command(0x01);
113
   //_delay_ms(10);
114
  LCD_send_command(0xFF);
115
  
116
  //LCD_send_command(0x06);
117
     
118
}
119
120
/* This function moves the cursor the line y column x on the LCD module*/
121
void LCD_goto(unsigned char y, unsigned char x)
122
{
123
  unsigned char firstAddress[] = {0x80,0xC0,0x94,0xD4};
124
  
125
  LCD_send_command(firstAddress[y-1] + x-1);
126
  _delay_ms(10);
127
}
128
129
void LCD_print(char *string)
130
{
131
  unsigned char i=0;
132
  
133
  while(string[i]!=0)
134
  {
135
    LCD_send_data(string[i]);
136
    i++;
137
  }
138
}
139
140
void LCD_blink()
141
{
142
  LCD_send_command(0x08);
143
  _delay_ms(250);
144
  LCD_send_command(0x0C);
145
  _delay_ms(250);
146
}
147
148
void LCD_scroll(unsigned char direction)
149
{
150
  if(direction == 0)
151
  LCD_send_command(0x18);
152
  else
153
  LCD_send_command(0x1C);
154
  
155
  _delay_ms(500);
156
}

von Falk B. (falk)


Lesenswert?

Viele 1x16 LCDs werde logisch mit zwei Zeilen angesteuert. Um die rechte 
Hälfte zu beschreiben, muss man vorher die DD-RAM Adresse setzen, hier 
mit LCD_goto().

von T. G. (to_m)


Lesenswert?

Der Code war urspünglich für ein 2-zeiliges Display geschrieben. Deshalb 
habe ich die goto() Funktion auskommentiert.

Was soll ich denn bei einem 16x1 Display da für Werte übergeben?



Gruß


Tom

von Falk B. (falk)


Lesenswert?

LCD_goto(2, 1);

von T. G. (to_m)


Lesenswert?

Ok Super danke jetzt bin ich einen Schritt weiter.

Nun wird der Txt hinten (letze 8 Zeichen) angezeigt.


Kann ich ihn jetzt den Txt auch mit einem weiteren Befehl über das ganze 
LCD laufen lassen (scolen lassen)


Danke

Gruß

Tom

von Karl H. (kbuchegg)


Lesenswert?

T. G. schrieb:

> Kann ich ihn jetzt den Txt auch mit einem weiteren Befehl über das ganze
> LCD laufen lassen (scolen lassen)

Auch wenbn es ein Scroll Kommando gibt, so wird dir das niccht viel 
helfen.

Dein erstes Ziel ist es, die logische Unterteilung des LCD in 2 Zeilen 
(gegen die du nichts machen kannst) aufzuheben und dir eine Funktion zu 
schreiben, die sich darum kümmert, dass Ausgaben wie "Hallo Welt!" in 2 
Zeilen aufgeteilt werden müssen: Die ersten 8 Zeichen in die erste 
Zeile, die weiteren 8 Zeichen in die 2.te Zeile.
Natürlich unter Berücksichtigung der aktuellen Cursorposition und 
natürlich unter Berücksichtigung der Textlänge. Steht der Cursor in der 
Spalte 2, dann eben nur die ersten 6 Zeichen in die erste Zeile und die 
weiteren in die 2. Zeile.

Hast du eine derartige Funktion, so dass du Textausgaben machen kannst, 
ohne dich um die tatsächliche vorgegebene logische Zeilenunterteilung 
kümmern zu müssen, dann besteht Scrollen darin, dass du deinen zu 
scrollenden Text derart ausgibst, dass jeweils 1 Zeichen mehr sichtbar 
ist. Um also "Hallo Welt!" auszugeben, gibst du hintereinander aus
1
"                "
2
"               H"
3
"              Ha"
4
"             Hal"
5
"            Hall"
6
"           Hallo"
7
"          Hallo "
8
"         Hallo W"
9
"        Hallo We"
10
usw. usw.

D.h. du musst dich selbst drum kümmern, immer den Teil des Textes an der 
richtigen Stelle auszugeben, so dass der Eindruck des Durchscrollens 
entsteht. Sowohl bei links- als auch bei rechts-scrollen.

Aber der erste Schritt ist, dass du dich nicht mehr um die logische 
Zeilenunterteilung kümmern willst. Wenn du "Hamst Bamsti" ausgeben 
willst, dann willst du auch eine Ausgabefunktion haben, der du den 
String genau so übergibst, und die dann selbst die Aufteilung in die 
erste und zweite Zeile macht, so dass am LCD der Text fortlaufend lesbar 
ist.

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.