LCD mit ATMEGA32 und Fleury Library

Gast #3602669
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
Gast #3602675
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.
Gast #3602732
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
Gast #3602750
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
}

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