UPDATE:
Only 1 Error
"error: invalid conversion from 'const char*' to 'const unsigned char*"
lcd-m50530.h <--- ..\hardware\libraries\lcd_m50530
#ifndef LCD_M50530_H
#define LCD_M50530_H
#include <avr/delay.h>
/****************************************************************
Ggf. hier den Port anpassen, an dem das LCD angeschlossen ist!
****************************************************************/
// Data-Direction-Register, am dem das LCD angeschlossen ist
#define LCD_DDR DDRD
// Port-Register, am dem das LCD angeschlossen ist
#define LCD_PORT PORTD
// Pin-Register, am dem das LCD angeschlossen ist
#define LCD_PIN PIND
/*************************************************
Ggf. hier die Bits der 4 Steuerleitungen anpassen!
*************************************************/
// Die Datenleitungen des LCDs müssen an den Pins 0-3 anliegen (Data0 auf Pin0, Data1 auf Pin1 usw.)
// Die anderen 4 Steuerleitungen sind hier einzustellen!
// Port-Pin, an dem der RW-Pin des LCDs liegt
#define LCD_RW_PIN 13
// Port-Pin, an dem der EX-Pin des LCDs liegt
#define LCD_EX_PIN 5
// Port-Pin, an dem der OC1-Pin des LCDs liegt
#define LCD_OC1_PIN 6
// Port-Pin, an dem der OC2-Pin des LCDs liegt
#define LCD_OC2_PIN 4
// ein paar Konstanten zur besseren Lesbarkeit des Quelltextes :-)
#define LCD_DISPLAY_ON 16
#define LCD_CURSOR_ON 8
#define LCD_UNDERLINE 4
#define LCD_CURSOR_BLINK 2
#define LCD_CHARACTER_BLINK 1
#define LCD_CURSOR_ADDRESS_NO_CHANGE 64
#define LCD_CURSOR_ADDRESS_INC_RD 72
#define LCD_CURSOR_ADDRESS_INC_WD 80
#define LCD_CURSOR_ADDRESS_INC_RDWD 88
#define LCD_CURSOR_ADDRESS_DEC_RD 104
#define LCD_CURSOR_ADDRESS_DEC_WD 112
#define LCD_CURSOR_ADDRESS_DEC_RDWD 120
#define LCD_DISPLAY_START_ADDRESS_NO_CHANGE 64
#define LCD_DISPLAY_START_ADDRESS_INC_RD 65
#define LCD_DISPLAY_START_ADDRESS_INC_WD 66
#define LCD_DISPLAY_START_ADDRESS_INC_RDWD 67
#define LCD_DISPLAY_START_ADDRESS_DEC_RD 69
#define LCD_DISPLAY_START_ADDRESS_DEC_WD 70
#define LCD_DISPLAY_START_ADDRESS_DEC_RDWD 71
#define LCD_SPECIAL_AE (char)144 // Ä, dezimal 144, oktal 220
#define LCD_SPECIAL_OE (char)145 // Ö, dezimal 145, oktal 221
#define LCD_SPECIAL_UE (char)197 // Ü, dezimal 197, oktal 305
#define LCD_SPECIAL_ae (char)160 // ä, dezimal 160, oktal 240
#define LCD_SPECIAL_oe (char)161 // ö, dezimal 161, oktal 241
#define LCD_SPECIAL_ue (char)17 // ü, dezimal 17, oktal 21
#define LCD_SPECIAL_ss (char)163 // ß, dezimal 163, oktal 243
// sendet den angelegten Befehl zum LCD
// setzt kurzzeitig das EX-Signal und nimmt es anschließend wieder zurück
extern void LCD_execute(void);
// wartet solange bis das Busy-Flag nicht mehr gesetzt ist
// und das LCD weitere Befehle entgegennimmt
extern void LCD_waitReady(void);
// überträgt das übergebene Byte an das LCD
extern void LCD_sendByte(const unsigned char byte, unsigned char control);
// setzt 4-Bit-Mode und initialisiert das LCD
// muss als erstes aufgerufen werden, bevor das LCD angesteuert werden kann
extern void LCD_init(void);
// löscht die Anzeige und setzt die Display + Cursor-Adresse auf 0,0
extern void LCD_clear(void);
// setzt den Entry-Mode des LCDs, also die automatische Erhöhung der Adresse nach einem Lese- oder Schreibbefehl
// man verwende die oben deklarierten Konstanten ;)
#define LCD_setEntryMode(mode) LCD_sendByte(mode, 0)
// schreibt das übergebene Zeichen an die aktuelle Cursor-Position
#define LCD_writeChar(c) LCD_sendByte(c, 1 << LCD_OC2_PIN)
// schreibt die übergebene Zeichenkette an die aktuelle Cursor-Position
extern void LCD_write(const unsigned char * c);
// schreibt die übergebene Zeichenkette an die aktuelle Cursor-Position (für String im ROM)
extern void LCD_write_P(const unsigned char * progmem_string);
// setzt den Display-Modus
// man verwende die oben deklarierten Konstanten ;)
#define LCD_setDisplay(mode) LCD_sendByte(mode | 32, 0)
// setzt den Cursor an die angegebene Adresse
#define LCD_setCursorAddress(address) LCD_sendByte(address, (1<<LCD_OC1_PIN) | (1<<LCD_OC2_PIN))
// setzt den Cursor an die angegebene Position (y = Zeile, x = Spalte)
extern void LCD_setCursorPos(const unsigned char y, const unsigned char x);
#endif
lcd-m50530.c <--- ..\hardware\libraries\lcd_m50530
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "lcd-m50530.h"
#include <stdlib.h>
// sendet den angelegten Befehl zum LCD
// setzt kurzzeitig das EX-Signal und nimmt es anschließend wieder zurück
void LCD_execute(void)
{
_delay_us(2);
// EX-Signal setzen
LCD_PORT |= (1 << LCD_EX_PIN);
_delay_us(2);
// EX-Signal löschen
LCD_PORT &= ~(1 << LCD_EX_PIN);
_delay_us(2);
}
// wartet solange bis das Busy-Flag nicht mehr gesetzt ist
// und das LCD weitere Befehle entgegennimmt
void LCD_waitReady(void)
{
// Datenleitungen auf Eingang schalten
// dazu die Bits der Datenleitungen auf 0 setzen
LCD_DDR &= 240;
// RB-Befehl senden
//LCD_PORT = (1 << LCD_OC1_PIN) | (1 << LCD_OC2_PIN) | (1 << LCD_RW_PIN);
LCD_PORT = 1 << LCD_RW_PIN;
unsigned char flags = 0;
while (1)
{
do
{
_delay_us(2);
// EX-Signal setzen
LCD_PORT |= (1 << LCD_EX_PIN);
_delay_us(2);
// flags einlesen
flags = LCD_PIN;
// EX-Signal löschen
LCD_PORT &= ~(1 << LCD_EX_PIN);
} while (bit_is_set(flags, 3));
if (flags & 6)
// bits 1 oder 2 gesetzt, also entweder sind wie im 8bit-mode oder wir haben gerade den zweiten Teil im 4bit-mode gelesen
break;
}
// alle Leitungen als Ausgänge schalten
LCD_DDR = 0xFF;
}
// überträgt das übergebene Byte an das LCD
void LCD_sendByte(const unsigned char byte, unsigned char control)
{
LCD_waitReady();
// die unteren 5 Bits im Control-Byte ausblenden
control &= 224;
// oberes Nibble übertragen
LCD_PORT = (byte >> 4) | control;
LCD_execute();
// unteres Nibble übertragen
LCD_PORT = (byte & 15) | control;
LCD_execute();
}
// löscht die Anzeige und setzt die Display + Cursor-Adresse auf 0,0
void LCD_clear(void)
{
LCD_sendByte(1, 0); // DB0
_delay_ms(2);
}
// setzt 4-Bit-Mode und initialisiert das LCD
// muss als erstes aufgerufen werden, bevor das LCD angesteuert werden kann
void LCD_init(void)
{
// alle Leitungen auf Ausgang schalten
LCD_DDR = 0xFF;
// auf 4-Bit-Mode umschalten
LCD_sendByte(216, 0); // DB7, DB6, DB4, DB3
LCD_clear();
}
// schreibt die übergebene Zeichenkette an die aktuelle Cursor-Position
void LCD_write(const unsigned char * c)
{
while (*c)
LCD_writeChar(*c++);
}
// schreibt die übergebene Zeichenkette an die aktuelle Cursor-Position (für String im ROM)
void LCD_write_P(const unsigned char * progmem_string)
{
register unsigned char c;
while ((c = pgm_read_byte(progmem_string++)))
LCD_writeChar(c);
}
// setzt den Cursor an die angegebene Position (y = Zeile, x = Spalte)
void LCD_setCursorPos(const unsigned char y, const unsigned char x)
{
// Adresse aus x und y berechnen
// Adressen sind wie folgt: Zeile 0 = 0; Zeile 1 = 64; Zeile 2 = 128; Zeile 3 = 192; Zeile 4 = 0+24; Zeile 5 = 64+24; Zeile 6 = 128+24; Zeile 7 = 192+24
unsigned char address = x + ((y % 4) << 6);
if (y > 3)
address += 24;
LCD_sendByte(address, (1<<LCD_OC1_PIN) | (1<<LCD_OC2_PIN));
}
LCD.pde <--- for testing
#include <avr/io.h>
#include <lcd-m50530.h>
void setup()
{
// wait for power up
delay(250);
// LCD initialisieren
LCD_init();
// ein paar Zeichen ausgeben
LCD_write("LCD - 16x4");
}
void loop()
{
}
does anyone know where the error is?
Is the Arduino Code right?
Or is it some were in the libraries??
Thank for any Help!!