Forum: Mikrocontroller und Digitale Elektronik LCD mit ATMEGA32 und Fleury Library


von D. M. (Gast)


Lesenswert?

Hallo zusammen,

ich habe vor Kurzem mit dem Programmieren angefangen und wollte mich nun 
an ein 16x2 LCD rantasten. Hierfür habe ich die LCD Library von Fleury 
gefunden. Leider wird bei mir nur die erste Zeile des LCD mit 
ausgefüllten Kästchen gefüllt. Kann mir hier jemand bitte über den Code 
schauen? Ich habe die verschiedenen Signale über zwei Ports verteilt. 
Evtl. stimmt hier was nicht?

hier die main:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
 
4
#include "lcd.h"
5
#include "lcd.c"
6
 
7
int main(void)
8
{
9
    lcd_init(LCD_DISP_ON_CURSOR); /* initialize lcd, display on, cursor on */
10
                                  /* for more options for */
11
                                  /* lcd_init(), view lcd.h file*/
12
    while(1)                      /* run continuously */
13
    {
14
        lcd_clrscr();             /* clear screen of lcd */
15
        lcd_home();               /* bring cursor to 0,0 */
16
        lcd_puts("hello");        /* type something random */
17
        lcd_gotoxy(0,1);          /* go to 2nd row 1st col */
18
        lcd_puts("world");  /* type something random */
19
        _delay_ms(50);            /* wait 50ms */
20
    }
21
}

und hier der betreffende Teil aus der lcd.h:
1
#define LCD_PORT         PORTB        /**< port for the LCD lines   */
2
#define LCD_DATA0_PORT   LCD_PORT     /**< port for 4bit data bit 0 */
3
#define LCD_DATA1_PORT   LCD_PORT     /**< port for 4bit data bit 1 */
4
#define LCD_DATA2_PORT   LCD_PORT     /**< port for 4bit data bit 2 */
5
#define LCD_DATA3_PORT   LCD_PORT     /**< port for 4bit data bit 3 */
6
#define LCD_DATA0_PIN    0            /**< pin for 4bit data bit 0  */
7
#define LCD_DATA1_PIN    1            /**< pin for 4bit data bit 1  */
8
#define LCD_DATA2_PIN    2            /**< pin for 4bit data bit 2  */
9
#define LCD_DATA3_PIN    3            /**< pin for 4bit data bit 3  */
10
#define LCD_RS_PORT      PORTD     /**< port for RS line         */
11
#define LCD_RS_PIN       2           /**< pin  for RS line         */
12
#define LCD_RW_PORT      PORTD     /**< port for RW line         */
13
#define LCD_RW_PIN       7            /**< pin  for RW line         */
14
#define LCD_E_PORT       PORTD     /**< port for Enable line     */
15
#define LCD_E_PIN        5            /**< pin  for Enable line     */

Vielen Dank im Voraus für eure Hilfe!
Gruß DM

von holger (Gast)


Lesenswert?

>Leider wird bei mir nur die erste Zeile des LCD mit
>ausgefüllten Kästchen gefüllt.

Dann ist das Display nicht initialisiert.

Entweder dein Display Timing passt nicht zu deinem
CPU Takt oder du hast schlicht und ergreifend beim
anschliessen des Displays etwas falsch gemacht.

Mehr kann man dazu nicht sagen.

von D. M. (Gast)


Lesenswert?

Ich habe bisher an der Frequenz nichts geändert, ist noch immer 1MHz.
Mit dieser Anschlussbelegung schaffe ich es mit anderem Code etwas auf 
dem LCD auszugeben. Nur mit dieser Library nicht. Ist diese überhaupt 
für den ATMEGA32 geeignet?

Gruß DM

von holger (Gast)


Lesenswert?

>Mit dieser Anschlussbelegung schaffe ich es mit anderem Code etwas auf
>dem LCD auszugeben.

Dann zeig den anderen Code mal.

>Nur mit dieser Library nicht. Ist diese überhaupt
>für den ATMEGA32 geeignet?

Ja.

von D. M. (Gast)


Lesenswert?

Dieser Code ist zwar 8-Bit anstatt 4-Bit in der Library, jedoch sollte 
das egal sein oder?
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
#define MrLCDsCrib PORTB
5
#define DataDir_MrLCDsCrib DDRB
6
#define MrLCDsControl PORTD
7
#define DataDir_MrLCDsControl DDRD
8
#define LightSwitch 5
9
#define ReadWrite 7
10
#define BiPolarMood 2
11
12
void Check_IF_MrLCD_isBusy(void);
13
void Peek_A_Boo(void);
14
void Send_A_Command(unsigned char command);
15
void Send_A_Character(unsigned char character);
16
//void Send_A_String(char *string);
17
18
int main(void)
19
{
20
DataDir_MrLCDsControl |= 1<<LightSwitch | 1<<ReadWrite | 1<<BiPolarMood;
21
_delay_ms(15);
22
23
Send_A_Command(0x01); //Clear Screen 0x01 = 00000001
24
_delay_ms(2);
25
Send_A_Command(0x38);
26
_delay_us(50);
27
Send_A_Command(0b00001110);
28
_delay_us(50);
29
30
Send_A_Character(0x4E); //N
31
Send_A_Character(0x65); //e
32
Send_A_Character(0x77); //w
33
Send_A_Character(0x62); //b
34
Send_A_Character(0x69); //i
35
Send_A_Character(0x65); //e
36
Send_A_Character(0x48); //H
37
Send_A_Character(0x61); //a
38
Send_A_Character(0x63); //c
39
Send_A_Character(0x6B); //k
40
Send_A_Character(0x2E); //.
41
Send_A_Character(0x63); //c
42
Send_A_Character(0x6F); //o
43
Send_A_Character(0x6D); //m
44
45
//Send_A_String("Patrick");
46
47
while(1)
48
{
49
}
50
}
51
52
void Check_IF_MrLCD_isBusy()
53
{
54
DataDir_MrLCDsCrib = 0;
55
MrLCDsControl |= 1<<ReadWrite;
56
MrLCDsControl &= ~1<<BiPolarMood;
57
58
while (MrLCDsCrib >= 0x80)
59
{
60
Peek_A_Boo();
61
}
62
DataDir_MrLCDsCrib = 0xFF; //0xFF means 0b11111111
63
}
64
65
void Peek_A_Boo()
66
{
67
MrLCDsControl |= 1<<LightSwitch;
68
asm volatile ("nop");
69
asm volatile ("nop");
70
MrLCDsControl &= ~1<<LightSwitch;
71
}
72
73
void Send_A_Command(unsigned char command)
74
{
75
Check_IF_MrLCD_isBusy();
76
MrLCDsCrib = command;
77
MrLCDsControl &= ~ ((1<<ReadWrite)|(1<<BiPolarMood));
78
Peek_A_Boo();
79
MrLCDsCrib = 0;
80
}
81
82
void Send_A_Character(unsigned char character)
83
{
84
Check_IF_MrLCD_isBusy();
85
MrLCDsCrib = character;
86
MrLCDsControl &= ~ (1<<ReadWrite);
87
MrLCDsControl |= 1<<BiPolarMood;
88
Peek_A_Boo();
89
MrLCDsCrib = 0;
90
}

von holger (Gast)


Lesenswert?

Im 4Bit Mode steuerst du das Display über die
Leitungen DB4..7 was bei dir dann Portb4..7 sein müsste.

von D. M. (Gast)


Lesenswert?

holger schrieb:
> Im 4Bit Mode steuerst du das Display über die
> Leitungen DB4..7 was bei dir dann Portb4..7 sein müsste.

Das wars! Vielen Dank! :)
Schönen Abend noch!

Gruß DM

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.