adapting LCD driver Mitsubishi Chip M50530

Hi
I've found one driver already. It is originally for some Atmel microcontroller and is written in C.
I want to adapt it to Arduino.
This driver for a LCD with a Mitsubishi Chip M50530.
The "lcd_m50530" Folder come in the "...\hardware\libraries".
"LCD.pde" is my test Project.

Arduino IDE says: " 'PORTA' undeclared " and a lot more... :wink:

"PORTA" is Port A as used in "lcd-m50530.h" and I need o change it an Arduino Pin.
My LCD is connected with 4 DataBus Pins to the Arduino, how can I make out of PORTA 4 Pin?

Sorry for that kind of Questions and if I mixed up some things I'm totally new to Arduino...
First I need my LCD to work, later I can test the other Hardware and display them on the LCD..
The most difficult thing has to be done first

EDIT: I have included the code in my next 2 posts:

In the .zip is the same
http://rapidshare.de/files/48754617/M50530.zip.html

lcd-m50530.h <--- ..\hardware\libraries

/***********************************************************

      LCD-Routinen
      für Samsung 2138a mit M50530-Controller
      24 x 8 Zeichen

      Copyright 2003 by Daniel Jelkmann


      Zur Ansteuerung wird der 4Bit-Mode verwendet.
      Neben den 4 Datenleitungen (Data0-3) werden 4 weitere
      Steuerleitungen (Read/Write, Execute, OC1, OC2)
      benötigt. Damit werden am AVR 8 Pins benötigt.

      
      Anschluss:
      
      Alle 8 LCD-Signale müssen an einem Port des AVR
      angeschlossen werden. Gemäß folgender Tabelle müssen
      die 4 Datenleitungen an den niederwertigsten Bits
      anliegen. Die Reihenfolge der restlichen 4 Steuerleitungen
      und der verwendete Port ist über die Konstanten im 
      Quellcode festgelegt und muss ggf. angepasst werden.
      Die restlichen LCD-Signale sind in folgender Tabelle
      zu finden.

            LCD      Beschreibung            Anschluss
            -------------------------------------------------------------------------
            Pin 01      Masse                  Masse
            Pin 02      Data0                  nicht angeschlossen
            Pin 03      Data1                  nicht angeschlossen
            Pin 04      Data2                  nicht angeschlossen
            Pin 05      Data3                  nicht angeschlossen
            Pin 06      Data4                  AVR Port Bit 0
            Pin 07      Data5                  AVR Port Bit 1
            Pin 08      Data6                  AVR Port Bit 2
            Pin 09      Data7                  AVR Port Bit 3
            Pin 10      EX (Execute)            AVR Port Bit 5*
            Pin 11      R/W (Read/Write)      AVR Port Bit 4*
            Pin 12      OC2                        AVR Port Bit 7*
            Pin 13      OC1                        AVR Port Bit 6*
            Pin 14      Kontrast-Regelung, ungefähr 8,2 Volt, am besten mittels Poti anschließen
            Pin 15      Versorgungsspannung, +5 Volt
            Pin 16      Masse                  Masse


      
      * Die Reihenfolge dieser Leitungen kann über die
      Konstanten im Quellcode angepasst werden.
      
      
      Es wird keine Gewähr für die Vollständigkeit, Korrektheit,
      Funktionsfähigkeit oder für sonstige Eigenschaften des
      Codes übernommen. Haftung ausgeschlossen.
      
*************************************************************/

#ifndef LCD_M50530_H
#define LCD_M50530_H

#include <avr/delay.h>


//#define F_MCU                         5            /* Takt-Frequenz in MHz */


// wartet die angegebene Zeit in Millisekunden
// XTAL_CPU muss entsprechend gesetzt sein
// (benötigt delay.h)
//extern void delay(unsigned int ms);
#define delay(ms)            for (unsigned int i = ms; i > 0; --i)      \
                                          _delay_loop_2(XTAL_CPU / 4000);
//                                          _delay_loop_2(250*F_MCU);


/****************************************************************
Ggf. hier den Port anpassen, an dem das LCD angeschlossen ist! 
****************************************************************/
// Data-Direction-Register, am dem das LCD angeschlossen ist
#define LCD_DDR DDRA
// Port-Register, am dem das LCD angeschlossen ist
#define LCD_PORT PORTA
// Pin-Register, am dem das LCD angeschlossen ist
#define LCD_PIN PINA


/*************************************************
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


// wartet einen kurzen Moment, 4 cycles per loop * 8 = 32 cycles, macht bei 16 MHz 2 µs
#define delay_short()      _delay_loop_2(8)


// 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.pde <--- for testing

#include <avr/io.h>
#include <lcd-m50530.h>


void setup()
{
// wait for power up
      delay(250);

      // LCD initialisieren
      LCD_init();
      // Modus des LCDs ändern
      LCD_setEntryMode(LCD_CURSOR_ADDRESS_INC_WD | LCD_DISPLAY_START_ADDRESS_NO_CHANGE);
      // Cursor einschalten
      LCD_setDisplay(LCD_DISPLAY_ON | LCD_CURSOR_ON | LCD_CURSOR_BLINK | LCD_CHARACTER_BLINK);


      // ein paar Zeichen ausgeben
      LCD_write("LCD - 24x8 characters");
      LCD_setCursorPos(1,5);
      LCD_write("Samsung 2138a");
      LCD_setCursorPos(7, 21);
      LCD_write(":-)");
      LCD_setCursorPos(4, 0);
      LCD_write("test successful");
}

void loop()
{
  pin13=HIGH;
}

lcd-m50530.c <--- ..\hardware\libraries

/***********************************************************

      LCD-Routinen
      für Samsung 2138a mit M50530-Controller
      24 x 8 Zeichen

      Copyright 2003-04 by Daniel Jelkmann


      Zur Ansteuerung wird der 4Bit-Mode verwendet.
      Neben den 4 Datenleitungen (Data0-3) werden 4 weitere
      Steuerleitungen (Read/Write, Execute, OC1, OC2)
      benötigt. Damit werden am AVR 8 Pins benötigt.

      
      Anschluss:
      
      Alle 8 LCD-Signale müssen an einem Port des AVR
      angeschlossen werden. Gemäß folgender Tabelle müssen
      die 4 Datenleitungen an den niederwertigsten Bits
      anliegen. Die Reihenfolge der restlichen 4 Steuerleitungen
      und der verwendete Port ist über die Konstanten im 
      Quellcode festgelegt und muss ggf. angepasst werden.
      Die restlichen LCD-Signale sind in folgender Tabelle
      zu finden.

            LCD      Beschreibung            Anschluss
            -------------------------------------------------------------------------
            Pin 01      Masse                  Masse
            Pin 02      Data0                  nicht angeschlossen
            Pin 03      Data1                  nicht angeschlossen
            Pin 04      Data2                  nicht angeschlossen
            Pin 05      Data3                  nicht angeschlossen
            Pin 06      Data4                  AVR Port Bit 0
            Pin 07      Data5                  AVR Port Bit 1
            Pin 08      Data6                  AVR Port Bit 2
            Pin 09      Data7                  AVR Port Bit 3
            Pin 10      EX (Execute)            AVR Port Bit 4*
            Pin 11      R/W (Read/Write)      AVR Port Bit 5*
            Pin 12      OC2                        AVR Port Bit 7*
            Pin 13      OC1                        AVR Port Bit 6*
            Pin 14      Kontrast-Regelung, ungefähr 8,2 Volt, am besten mittels Poti anschließen
            Pin 15      Versorgungsspannung, +5 Volt
            Pin 16      Masse                  Masse


      
      * Die Reihenfolge dieser Leitungen kann über die
      Konstanten im Quellcode angepasst werden.
      
      
      Es wird keine Gewähr für die Vollständigkeit, Korrektheit,
      Funktionsfähigkeit oder für sonstige Eigenschaften des
      Codes übernommen. Haftung ausgeschlossen.
      
*************************************************************/


#include <avr/io.h>
//#include <avr/delay.h>
#include <avr/pgmspace.h>

#include "lcd-m50530.h"

#include <stdlib.h>


/*
// wartet die angegebene Zeit in Millisekunden
// F_MCU muss entsprechend gesetzt sein
// (benötigt delay.h)
void delay(const unsigned int ms)
{
      for (unsigned char i = ms; i > 0; --i)
            // 4 cycles per loop * 250 = 1.000 cycles; 1.000 x F_MCU = 1 ms
            _delay_loop_2(250*F_MCU);
}*/


// sendet den angelegten Befehl zum LCD
// setzt kurzzeitig das EX-Signal und nimmt es anschließend wieder zurück
void LCD_execute(void)
{
      delay_short();
      // EX-Signal setzen
      LCD_PORT |= (1 << LCD_EX_PIN);
      delay_short();
      // EX-Signal löschen
      LCD_PORT &= ~(1 << LCD_EX_PIN);
      delay_short();
}


// wartet solange bis das Busy-Flag nicht mehr gesetzt ist
// und das LCD weitere Befehle entgegennimmt
void LCD_waitReady(void)
{
      /*
            READ BUSY FLAG & FUNCTION FLAGS (RB)
            input:
                  OC1            0
                  OC2            0
                  RW            1
            output:
                  DB7            busy-flag (1 = busy)
      */

      // 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_short();
                  // EX-Signal setzen
                  LCD_PORT |= (1 << LCD_EX_PIN);
                  delay_short();
                  // 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;
      }
            
      
/*      unsigned char busy;
      do
      {
            delay_short();
            LCD_execute();
            // busy-Signal einlesen
            busy = bit_is_set(LCD_PIN, 3);
            LCD_execute();
      } while (busy);
*/
      
      // 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)
{
      /*
            CLEAR DISPLAY, MOVE DISPLAY/CURSOR ADDRESS HOME
            input:
                  OC1            0
                  OC2            0
                  RW            0
                  DB7-DB1      0
                  DB0            1
      */
      LCD_sendByte(1, 0);      // DB0
      delay(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
      /*
            SET FUNCTION MODE
            input:
                  OC1            0
                  OC2            0
                  RW            0
                  DB7,DB6      1
                  DB5            I/O 8/4      (1 = 8 bit, 0 = 4 bit)
                  DB4            FONT 8/12 (1 = 5x8 fonts, 0 = 5x12 fonts)
                  DB3,DB2      DUTY
                  DB1,DB0      RAM
      */
      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));
}

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!!

When you compile, and an error occurs, the offending line is highlighted in the IDE.

The error means that some function wants an argument that is of type "const unsigned char *" but you have supplied it with an argument of type "const char *".

When you find the function in error, you can cast the argument:

"(const unsigned char*)signedCharPtr"

The error is in the Arduino Code line: "LCD_write("LCD - 16x4");"
But I suspect it must be somewhere in the driver file..
I searched already for every "char" but there is always an "unsigned" before it, so I'm confused..
Any suggestions??

The "char" is right there in front of you:

LCD_write("LCD - 16x4");

The literal character string is a "const char *", not an "const unsigned char *".

Either use a cast before the "LCD - 16x4" string:

LCD_write((const unsigned char *)"LCD - 16x4");

or put the string to print into a variable of the correct type:

const unsigned char msg[] = "LCD - 16x4";
LCD_write(msg);

thanks to PaulS!
It is now compiling...

It still doesn't work.. but first steps are made..

I've been looking for other errors since hours..
I'm about to give up since my possibilities to diagnostics are rare..
Arduino has no debug feature, I'm not even sure if the LCD is hooked up right..
or is just somewhere a bug in the code????? Too many question...

Hello, anyone has a testing program for the M50530 with the Arduino?

nobody? :slight_smile: