16X1 LCD zeigt nur 8 Zeichen

#3877404
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
}
#3877508
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.

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