Projekt: LCDMenuLib / LCDMenuLib2 ( LCDML ) - Menü mit mehreren Ebenen

Vielleicht auch noch ein anderer Fehler:

LCDMenuLib_element(5  , Item         , Item_3        , "Sp\365lung"         , FUNC);                // Bereich_4  Spülung
LCDMenuLib_element(6  , Item_3       , Item_3_1      , "Intervalsp\365len"  , FUNC);                // Submenü Intervalspülen
LCDMenuLib_element(7  , Item_3       , Item_3_1_1    , "Zeit"               , FUNC);                // Spülen nach Uhrzeit
LCDMenuLib_element(8  , Item_3       , Item_3_1_2    , "Wochentag"          , FUNC);                // Spülen nach Wochentag
LCDMenuLib_element(9  , Item_3       , Item_3_1_3    , "Zur\365ck"          , FUNC_back);           // Zurück

Sollte vermutlich so aussehen

LCDMenuLib_element(5  , Item         , Item_3        , "Sp\365lung"         , FUNC);                // Bereich_4  Spülung
LCDMenuLib_element(6  , Item_3       , Item_3_1      , "Intervalsp\365len"  , FUNC);                // Submenü Intervalspülen
LCDMenuLib_element(7  , Item_3_1       , Item_3_1_1    , "Zeit"               , FUNC);                // Spülen nach Uhrzeit
LCDMenuLib_element(8  , Item_3_1       , Item_3_1_2    , "Wochentag"          , FUNC);                // Spülen nach Wochentag
LCDMenuLib_element(9  , Item_3_1       , Item_3_1_3    , "Zur\365ck"          , FUNC_back);           // Zurück

da ansonsten die eine Ebene wegfällt.

Ja,
natürlich,hab`s jetzt so gemacht :blush:
Ich wollte zuerst ein Menü erstellen bevor ich die Funktionen nach und nach einpflege,d.h. wenn ich es irgendwie hinkriege :roll_eyes:

Vielen Dank nochmal für die Hinweise,

Mfg.
Haustechno

Frohes neues an alle :wink:

@jomelo,

Vielen dank für deine Mühe (pm),leider gibt es keine Änderung was das versetzte angeht :frowning:
Wenn es bei dir nicht auftritt,dann kann es ja nur an meinem LCD Liegen .
Jedoch ist es dennoch komisch,denn das gleiche LCD hab ich auch in einem anderem Bausatz gehabt,
und da läuft es ohne probleme.Welche lib dort allerdings eigesetzt ist kann ich leider nicht sagen :frowning:
Ich habe neue Displays bestellt,mal sehen......

Aber da hab ich noch eine Frage,und zwar gibt es ein horizontales menü auch?
Das jetztige ist ja vertikal!

Denn jetzt ist es ja so bei mir:

Hauptmenü

Servotest
Servo_Links
Servo_Rechts
Zurück

Spülung

usw.........

Wäre das acu so machbar ?:

Hauptmenü ==) Servotest ==) Spülung ==) usw...... ==) Zurück
Servo_Links
Servo_Rechts
Zurück

Vielleicht sogar so das die Menüauswahl sich vor und zurück wählen läßt?
Dabei Sollte die Zeile 0 aber immer frei bleiben denn da sollte später mal die Uhr rein

Mfg.
Haustechno

Hi,
diese Funktionalität wird so leider nicht unterstützt. Man kann sich alles selber so schreiben und anpassen, aber da es jeder dann anders haben will ist das so nicht vorgesehen und auch mit einigem Arbeitsaufwand verbunden.

Hallo,
ich experimentiere nun auch schon eine Weile mit dieser Lib und sie macht auch immer, was sie soll. Vielen Dank dafür! Jetzt meine Frage: als Tastatur verwende ich ein Matrix-Keypad (4x4), welches ich mithilfe der Keypad.h ( Arduino Playground - Keypad Library) auslese. Die LCDML_control-Funktion dafür habe ich so angepasst:

/* serial menu control */
void LCDMenuLib_control_keypad()
{ 
    if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time)) 
    {
      switch(kpd.getKey()) 
      {
        case 'E': LCDML.Button_enter(); break;
        case 'U': LCDML.Button_up_down_left_right(_LCDMenuLib_button_up); break;
        case 'D': LCDML.Button_up_down_left_right(_LCDMenuLib_button_down); break;
        case 'L': LCDML.Button_up_down_left_right(_LCDMenuLib_button_left); break;
        case 'B': LCDML.Button_up_down_left_right(_LCDMenuLib_button_right); break;       
        case 'S': LCDML.Button_quit(); break;         
        default: break; 
      }
    }
  
}

Nun würde ich aber auch gern die Zifferntasten der Tastatur zum Einstellen verschiedener Schalt(Uhr)zeiten benutzen.
dazu benutze ich: char key = kpd.getKey();
Das funktioniert, aber ich komme aus der Funktion nicht mehr heraus (über das Abfragen der 6 Steuertasten). LCDML.checkButtons() funktioniert scheinbar nicht, wenn man auch kpd.getKey(); in einer Funktion verwendet. Ich hoffe, ich habe mein Problem verständlich dargestellt, ich möchte also Werte direkt über das Keypad eingeben können und die Funktion zB. mit dem LCDML.Button_quit() verlassen können. hier nochmal der Code der Funktion:

/* callback function - FUNC_LED_standard */
void FUNC_Lightsetting(void)
{ 
    uint8_t button_value=0;  
    uint8_t i=0; 
  /* setup function */       
  if(!LCDML.FuncInit())
  {
    g_button_value=0;

    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Startzeit: ");
    lcd.print(erste_Null(g_hour_start));  
    lcd.print(":");
    lcd.print(erste_Null(g_minute_start));  
  
    lcd.setCursor(0,1);
    lcd.print("Stoppzeit: ");
    lcd.print(erste_Null(g_hour_stopp));  
    lcd.print(":");
    lcd.print(erste_Null(g_minute_stopp));  
    lcd.setCursor(11,0);
    lcd.blink();
  } 
 char key = kpd.getKey(); 
 if(LCDML.checkButtons()) ////////////////////////////////////////Diese Bedingung funktioniert hier so nicht, wenn die vorige Zeile nicht auskommentiert ist
   {
     Serial.println("Button");
   }
   
   
while(i<=7)//8 Ziffern müssen eingegeben werden
   {  
    char key = kpd.getKey();
    if (key != NO_KEY)
      {
        i++;
        switch(i)
             {
             case 1://1. Ziffer///////////////////////////////////////////Eingabe Stunde Start////////
              Serial.println("1. Stelle");
              if(key-48 <=2)
                {
                  lcd.print(key);
                  g_hour_start = 10 * (key-48);
                  lcd.setCursor(12,0);
                }
              else i--;
              break; 
              
             case 2://2. Ziffer
              Serial.println("2. Stelle");
              lcd.print(key);
              g_hour_start = g_hour_start + (key-48);  
              if(g_hour_start<=24) lcd.setCursor(14,0);
              else i--;
              break;///////////////////////////////////////////////////////////////////////////////// 
              
             case 3://3. Ziffer//////////////////////////////////Eingabe Minute Start////////////////
              Serial.println("3. Stelle");
              if(key-48 <=5)
                {
                  lcd.print(key);
                  g_minute_start = 10 * (key-48);
                  lcd.setCursor(15,0);
                }
              else i--;
              break; 
              
             case 4://4. Ziffer
              Serial.println("4. Stelle");
              lcd.print(key);
              g_minute_start = g_minute_start + (key-48);              
              if(g_minute_start<=59) lcd.setCursor(11,1);
              else i--;
              break;///////////////////////////////////////////////////////////////////////////////// 
 
             case 5://1. Ziffer///////////////////////////////////////////Eingabe Stunde Stopp////////
              Serial.println("1. Stelle Stopp");
              if(key-48 <=2)
                {
                  lcd.print(key);
                  g_hour_stopp = 10 * (key-48);
                  lcd.setCursor(12,1);
                }
              else i--;
              break; 
              
             case 6://2. Ziffer
              Serial.println("2. Stelle Stopp");
              lcd.print(key);
              g_hour_stopp = g_hour_stopp + (key-48);  
              if(g_hour_stopp<=24) lcd.setCursor(14,1);
              else i--;
              break;///////////////////////////////////////////////////////////////////////////////// 
              
             case 7://3. Ziffer//////////////////////////////////Eingabe Minute Stopp////////////////
              Serial.println("3. Stelle stopp");
              if(key-48 <=5)
                {
                  lcd.print(key);
                  g_minute_stopp = 10 * (key-48);
                  lcd.setCursor(15,1);
                }
              else i--;
              break; 
              
             case 8://4. Ziffer
              Serial.println("4. Stelle Stopp");
              lcd.print(key);
              g_minute_stopp = g_minute_stopp + (key-48);              
              if(g_minute_stopp<=59) lcd.setCursor(11,2);
              else i--;
              break;///////////////////////////////////////////////////////////////////////////////// 
           
             }              
       }
    }
    

  lcd.print("OK!");
  Serial.println(g_hour_start);
  Serial.println(g_minute_start);

  /* end function for callback */
  if(LCDML.FuncEnd(0, 1, 1, 1, 1, 1))  /* (direct, up, down, left, right) */ 
  {
    lcd.noBlink();
  }
}

Danke für eure Mithilfe,
Gruß
Sascha

Hi,

die Funktion LCDML.checkButtons ist nur für 6 Buttons ausgelegt, daher werden deine eigenen nicht unterstützt. Die Zeile kann daher so direkt nicht funktionieren. Man könnte die Funktion aber Manuel setzen z.B:

//Gloable Variable, diese sollte irgendwo oberhalb der setup() stehen
char   g_save_keypad = 0;
/* callback function - FUNC_LED_standard */
uint8_t g_lightsetting_current_pos = 0;
/* falls noch keine globale timer variabel existiert, muss diese verwendet werden */
unsigned long g_timer_1 = 0;    /* timer variable */



/* serial menu control */
void LCDMenuLib_control_keypad()
{ 
    if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time)) 
    {
         /* minimal verändern */
         char l_key = kpd.getKey();   // das l_  steht für lokale variabel 
      switch(l_key) 
      {
        case 'E': LCDML.Button_enter(); break;
        case 'U': LCDML.Button_up_down_left_right(_LCDMenuLib_button_up); break;
        case 'D': LCDML.Button_up_down_left_right(_LCDMenuLib_button_down); break;
        case 'L': LCDML.Button_up_down_left_right(_LCDMenuLib_button_left); break;
        case 'B': LCDML.Button_up_down_left_right(_LCDMenuLib_button_right); break;       
        case 'S': LCDML.Button_quit(); break; 

        /* neu */
       case 'deine_zahl':  
          // Button Check setzen
          bitWrite(LCDML.button, _LCDMenuLib_button, 1);
          g_save_keypad = l_key;
      break;

      //.. weitere abfragen nach dem gleichen schema      
        default: break; 
      }
    }

Anschließend folgt in deiner Menu Funktion folgendes:

void FUNC_Lightsetting(void)
{  
	/* setup function */       
	if(!LCDML.FuncInit())
	{	
		lcd.clear();
		lcd.setCursor(0,0);
		lcd.print("Startzeit: ");
		lcd.print(erste_Null(g_hour_start));  
		lcd.print(":");
		lcd.print(erste_Null(g_minute_start));  
  
		lcd.setCursor(0,1);
		lcd.print("Stoppzeit: ");
		lcd.print(erste_Null(g_hour_stopp));  
		lcd.print(":");
		lcd.print(erste_Null(g_minute_stopp));  
		lcd.setCursor(11,0);
		lcd.blink();
	} 

	// Die while schleife ist hier eine dumme lösung, da alle anderen funktionen nun darauf warten
	// Weitere verbesserung, du führst die key-48 operation an mehreren stellen aus, an einer wäre angenehmer oder ?
 
	// g_save_keypad >= '0'  liefert einen vergleich mit der zahl 48 die in ascii 0 enspricht
	// g_Save_keypad <= '9'  liefert einen vergleich mit der zahl 57 die in ascii 9 enspricht
	if(LCDML.checkButtons() && g_save_keypad >= '0' && g_save_keypad <= '9' && g_lightsetting_current_pos < 8) 
	{
		Serial.println("Button");	

		Serial.print(g_lightsetting_current_pos+1);
		Serial.print(". Stelle");

		

		switch(g_lightsetting_current_pos)
		{
			//1. Ziffer///////////////////////////////////////////Eingabe Stunde Start////////
			case 0:				  
              if(g_save_keypad-48 <=2)
                {
                  lcd.print(g_save_keypad);
                  g_hour_start = 10 * (g_save_keypad-48);
                  lcd.setCursor(12,0);
				  g_lightsetting_current_pos++;
                }         

				break;

			case 1://2. Ziffer
              
              lcd.print(g_save_keypad);
              g_hour_start = g_hour_start + (g_save_keypad-48);  
              if(g_hour_start<=24) {
				  lcd.setCursor(14,0);
				  g_lightsetting_current_pos++;
			  }
             
              break;///////////////////////////////////////////////////////////////////////////////// 
              
             case 2://3. Ziffer//////////////////////////////////Eingabe Minute Start////////////////
             
              if(g_save_keypad-48 <=5)
                {
                  lcd.print(g_save_keypad);
                  g_minute_start = 10 * (g_save_keypad-48);
                  lcd.setCursor(15,0);
				  g_lightsetting_current_pos++;
                }
             
              break; 
              
             case 3://4. Ziffer
             
              lcd.print(g_save_keypad);
              g_minute_start = g_minute_start + (g_save_keypad-48);              
              if(g_minute_start<=59) {
				  lcd.setCursor(11,1);
				  g_lightsetting_current_pos++;
			  }
            
              break;///////////////////////////////////////////////////////////////////////////////// 
 
             case 4://1. Ziffer///////////////////////////////////////////Eingabe Stunde Stopp////////
             
              if(g_save_keypad-48 <=2)
                {
                  lcd.print(g_save_keypad);
                  g_hour_stopp = 10 * (g_save_keypad-48);
                  lcd.setCursor(12,1);
				  g_lightsetting_current_pos++;
                }
             
              break; 
              
             case 5://2. Ziffer
              
              lcd.print(g_save_keypad);
              g_hour_stopp = g_hour_stopp + (g_save_keypad-48);  
              if(g_hour_stopp<=24) {
				  lcd.setCursor(14,1);
				  g_lightsetting_current_pos++;
			  }
             
              break;///////////////////////////////////////////////////////////////////////////////// 
              
             case 6://3. Ziffer//////////////////////////////////Eingabe Minute Stopp////////////////
             
              if(g_save_keypad-48 <=5)
                {
                  lcd.print(g_save_keypad);
                  g_minute_stopp = 10 * (g_save_keypad-48);
                  lcd.setCursor(15,1);
				  g_lightsetting_current_pos++;
                }
             
              break; 
              
             case 7://4. Ziffer              
              lcd.print(g_save_keypad);
              g_minute_stopp = g_minute_stopp + (g_save_keypad-48);              
              if(g_minute_stopp<=59) {
				  lcd.setCursor(11,2);
				  g_lightsetting_current_pos++;
			  }
            
              break;///////////////////////////////////////////////////////////////////////////////// 

			  default: break;
           
             }  

		
	}

	 

	if(g_lightsetting_current_pos >= 8) 
	{
		// Damit das lcd nicht zuschnell blinkt 
		if(LCDML.Timer(g_timer_1, 1000)) 
		{
			lcd.print("OK!");
			Serial.println(g_hour_start);
			Serial.println(g_minute_start);
		}

		// Abbruch erst erlauben, wenn die 8 Ziffern eingegeben wurden
		 /* end function for callback */
		  if(LCDML.FuncEnd(0, 1, 1, 1, 1, 1))  /* (direct, up, down, left, right) */ 
		  {
			lcd.noBlink();
		  }
	}
}

Ich konnte den Code nicht testen, daher sind vermutlich noch kleine Fehler drin. Die While Schleife hab ich entfernt, da sie nicht mehr benötigt wird.

Im Normalfall sollte man mit Quit die Funktion trotz Zahleneingabe verlassen können.

Hallo Jomelo,
vielen Dank für die schnelle Hilfe, ich konnte deinen code erst jetzt testen, er funktioniert auf Anhieb! Eine Frage habe ich noch zum Verständnis: Was macht dieser Befehl (in der angepassten LCDMenuLib_control_keypad()):

bitWrite(LCDML.button, _LCDMenuLib_button, 1);

Danke
Sascha

Hi, die Funktion sorgt nur dafür das LCDML.checkButtons() funktioniert.
Es wird quasi das benötigte Bit in der Variable LCDML.button gesetzt.

Hi, cooles OS. Versuche gerade ein I2C LCD zum laufen zu bekommen. Typ10 ist es nicht. Alle anderen kompiliert er leider nicht.

Alles was in der LCDMenuLib_class.h für _LCDML_lcd_obj definiert wird, kreidet mir der Kompilierer an. Typ 11 z.B. mit

lcdml_i2c:56: error: '_LCDMenuLib_LCD_backlight' was not declared in this scope

Bei den anderen Typen 12-15 wird's entsprechend noch bunter. Was läuft hier falsch?

BTW, die pinbelegung+adresse meines LCDs kenne ich, hat mir LCD I2C guesser augespuckt. [SOLVED] MJKDZ brand I2C Controller working with 1602 LCD - #12 by bperrybap - Displays - Arduino Forum

Gibt es eine Möglichkeit in deinem OS die Pinbelegung so ganz normal und frei zu konfiurieren, etwas so

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address and pinout

Danke für die Hilfe, bin echt gespannt :smiley:

Hi,
falsch läuft da gar nichts :slight_smile:

Schau dir nochmal Punkt 4 im ersten Beitrag an, vor allem der letzte Satz bevor der Quellcode eingeblendet wird. Dort steht wie man die fehlenden Konstanten definiert.

Unter dem Quellcode steht dann auch was passiert, wenn man diese nicht einbindet XD

Warum sollte ich die Pins denn 2mal definieren? In type 10-15 werden die doch schon definiert. Die Frage ist, warum akzeptiert der Kompiler das nicht?

type10 schreibt immerhin ein "A" in der mitte des Bildschirms, es müssen also Pins definiert sein.

Wenn ich Typ11 versuche, spuckt er mir ja o.g. Fehlermeldung aus. Wenn ich nun

#define _LCDMenuLib_LCD_backlight                 0
#define _LCDMenuLib_LCD_backlight_pol             0

hinzufüge (was überflüssig sein sollte, da es in der für type 11 in der LCDMenuLib_class.h definiert wird) dann sagt er:

lcdml_i2c:59: error: invalid conversion from 'int' to 't_backlighPol'

Hier muss was falsch laufen, er glaubt 't_backlighPol' ist ein Datentyp??

Also die Type 10 - 15 definieren nicht die fehlenden Konstanten. Diese werden dann benötigt, aber nicht festgelegt. Daher müssen sie im Programm festgelegt werden.

Ich hab es gerade nochmals bei mir getestet, ich kann Version 10 - 15 kompilieren ohne Fehlermeldung wenn ich im Arduino Sketch die Konstanten einfüge.

Sieh dir das Bild im Anhang an!

Ok. Es wird also "umdefiniert" sobald ich was anderes als 10 auswähle. Habs noch mal nachgeprüft, alles drüber kopiert usw. Fehler ist noch der selbe. Ich raff es nicht. Habe leider auch noch nix mit Klassen gemacht, deshalb steige ich durch das Programm nicht durch.

Dann liefern wir dem Fehler einfach den Datentyp den er erwartet:

t_backlightPol ist so definiert:

typedef enum { POSITIVE, NEGATIVE } t_backlighPol;

Änder mal das define wie folgt um:

//....
#define _LCDMenuLib_LCD_backlight_pol     POSITIVE  // oder NEGATIVE  so wie dein LCD das benötigt
// ....

Dann wäre es Datentyp technisch korrekt.
Ich weiß nicht wieso er bei mir die "0" annimmt.

Ich hab die Änderung auch in der Beschreibung des ersten Beitrages geändert.

klappt, Danke!

:roll_eyes:

Hi erst mal Respekt vor deiner Arbeit. Mach weiter so.
Danke das du hier soviel Zeit und Mühe investierst.
Ich hab wenig Erfahrung mit Arduino hab ein paar kleine Übungen mit H-Brücken und LCD´s gemacht.

Nun ich möchte ca. 20 Buttons und ca. 20 LED´s und eine H-Brücke + LCD am Arduino UNO betreiben.
Das alles möchte ich über mehrere Schieberegister EIN und AUS lesen. Habe das Panel bereits erfolgreich am Schieberegister mit SPI am laufen. Nun bin ich auf dieses Projekt gestoßen, ich arbeite schon ein paar Tage mit der Libary, jedoch mit Serial Eingabe und das LCD direkt am Arduino.
Jetzt möchte ich die Buttons über Eingangsschieberegister einlesen und in der Menu.lib nutzen. Das LCD + LED + H-Brücke auch über Schieberegister ansteuern. Irgendwie bin ich jetzt an einem Punkt wo ich nicht mehr richtig weiter komme und etwas überfordert bin.

Wie schreibe ich die einzelnen Bits für das LCD + LED´s + H-Brücken in die Schieberegister?

Ich denke ich hab auch noch einen kleinen Fehler in der keywords.txt festgestellt.
In der Zeil 93 steht
_LCDMenuLib_LCD_clk LITERAL1
sollte aber
_LCDMenuLib_LCD_srclk LITERAL1
heißen oder?

Hi,
ich selbst habe noch nicht mit Schieberegistern gearbeitet, wie du nun genau die einzelnen Funktionen aufrufst weiß ich nicht genau. Allgemeine Fragen dazu kann man besser in einem eigenem Thema stellen.

Allgemein LiquidCrystal_SR, LCDMenuLib:
In der LCDMenuLib nutze ich eine externe Lib die eingebunden werden kann. Diese kann die Schieberegister für das LCD passend setzen.
Die Dokumentation zu der Lib findest du hier: https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home
(alte LiquidCrystal an einen Ort außerhalb des Lib Verzeichnis kopieren und die Neue einfügen, anschließend die Arduino Software [alle Instanzen] schließen und neu öffnen)

In meiner Lib müsstest du nun in das Lib Verzeichnis wechseln und die LCDMenuLib___config.h öffnen. Hier kommentierst du die erste Zeile aus (Nummer 0) und die letzte Zeile ein (Nummer 20). Dies aktiviert den Schieberegister Modus.

Anschließend öffnest du z.B. das normale Beispeil aus meiner Lib.

Hier musst bei den Dateien die eingebunden werden die Zeile mit #include <LiquidCrystal.h> durch <LiquidCrystal_SR.h> ersetzen.
Danach müssen noch die Konstanten für das Schieberegister definiert werden

#define _LCDMenuLib_LCD_srdata     0     //data pin    
#define _LCDMenuLib_LCD_srclk        1     //clock pin
#define _LCDMenuLib_LCD_enable     TWO_WIRE

Die Verdrahtung eines Schieberegisters mit dem LCD kann man hier finden:
https://code.google.com/p/arduinoshiftreglcd/

Eine ausführliche Anleitung zur Ansteuerung der Schieberegister findet man auch in den *.h Dateien der neuen LiquidCrystal Lib: Dort stehen viele Information wie z.B.:
für SR Register:

// Connection description:
//
// SR output:
// Bit #0 - N/C - not connected, used to hold a zero
// Bit #1 - N/C
// Bit #2 - connects to RS (Register Select) on the LCD
// Bits #3-6 - connects to LCD data inputs D4 - D7.
// Bit #7 - enables the LCD enable-puls (via the diode-resistor AND "gate")
//
// 2 or 3 Pins required from the Arduino for Data, Clock and (optional) Enable
// If not using Enable, the Data pin will be used for the enable signal.
// 2 wire mode can be indicated by:
// - ommitting the enable pin in constructor
// - defining the same pin for Enable as for Data in constructor
// - by using the token TWO_WIRE for the enable pin.

SR2W:

// 2 Pins required from the Arduino:
// - Data/Enable
// - Clock
// The Data pin is also used to control the enable signal
// LCD RW-pin hardwired to LOW (only writing to LCD).
// Busy Flag (BF, data bit D7) is not read.
//
// Original project homepage: Google Code Archive - Long-term storage for Google Code Project Hosting.
//
// Shift register bits
// Bit #0 - (cannot be used on 74HC595)
// Bit #1 - optional backlight control
// Bit #2 - connects to RS (Register Select) on the LCD
// Bit #3 - connects to LCD data inputs D4
// Bit #4 - connects to LCD data inputs D5
// Bit #5 - connects to LCD data inputs D6
// Bit #6 - connects to LCD data inputs D7
// Bit #7 - enables the LCD enable-puls (via the diode-resistor AND "gate")

SR3W:

// +--------------------------------------------+
// | MCU |
// | IO1 IO2 IO3 |
// +----+-------------+-------------+-----------+
// | | |
// | | |
// +----+-------------+-------------+-----------+
// | Strobe Data Clock |
// | 8-bit shift/latch register | 74HC595N
// | Qa0 Qb1 Qc2 Qd3 Qe4 Qf5 Qg6 Qh7 |
// +----+----+----+----+----+----+----+----+----+
// | | | | | | |
// |11 |12 |13 |14 |6 |5 |4 (LCD pins)
// +----+----+----+----+----+----+----+----+----+
// | DB4 DB5 DB6 DB7 E Rw RS |
// | LCD Module |

Die SR2W und SR3W Versionen der neuen LiquidCrystal sind bisher noch nicht in der Lib eingebunden. Dies könnte ich aber heute Abend umsetzen.

Zur Ansteuerung der LCDMenuLib
Du könntest dir die folgende Funktion so umschreiben, dass das digitalRead durch deine Abfrage des Schieberegisters ersetzt wird. Danach wäre die Ansteuerung schon fertig.

void LCDMenuLib_control_digital_over_sr()
{ 
    if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time)) 
    {
		if(digitalRead(_BUTTON_digital_enter)) 
	    { 
			LCDML.Button_enter(); 
		}
		else if(digitalRead(_BUTTON_digital_up)) 
		{
			LCDML.Button_up_down_left_right(_LCDMenuLib_button_up); 	
		}
		else if(digitalRead(_BUTTON_digital_down)) 
		{ 
			LCDML.Button_up_down_left_right(_LCDMenuLib_button_down); 
		}	
		else if(digitalRead(_BUTTON_digital_left)) 
		{ 
			LCDML.Button_up_down_left_right(_LCDMenuLib_button_left);
		}
		else if(digitalRead(_BUTTON_digital_right)) 
		{ 
			LCDML.Button_up_down_left_right(_LCDMenuLib_button_right);}       
		}
		// Button Quit hat Priorität wenn mehrere Gleichzeitig gedrückt werden
		if(digitalRead(_BUTTON_digital_quit)) 
		{
			LCDML.Button_quit(); 
		}   
	}
}

Ich hoffe das Hilft dir erstmal weiter und danke für den Tipp mit dem KeyFile, dass werde ich wenn ich etwas mehr Zeit habe mal anpassen.

Update 03.02.2014

  • Beispiele überarbeitet bezüglich definierter Konstanten
  • SR Beispiel eingefügt
  • SR2W und SR3W werden nun unterstützt
  • SR2W und SR3W Beispiele eingefügt
  • Konstanten im Keyfile angepasst

Hi Jomelo,

wollte jetzt mal meine Pin-Konfiguration einstellen. Habe entsprechend alle Pins definiertfür 4-bit mode mit I2C, dat4-7

ich bekomme ich wieder Fehler bei LCDMenuLib_createMenu(_LCDMenuLib_cnt);

lcdml_i2c:75: error: expected primary-expression before ',' token

Ich verstehe nicht wo der hercommt.

Was ist denn der 4bit Modus mit I2C ? Einfacher ist es wenn du mir sagst welche Konfiguration du in der LCDMenuLib___config.h eingestellt hast. Ich habs gerade bei mir mit dem Typen 10 - 15 getestet und habe keine Fehlermeldungen beim kompelieren. Definierte Variablen:

/* i2c address */ 
#define _LCDMenuLib_LCD_addr             0x20

#define _LCDMenuLib_LCD_e		0
#define _LCDMenuLib_LCD_rw		1
#define _LCDMenuLib_LCD_rs		2
#define _LCDMenuLib_LCD_dat4              3
#define _LCDMenuLib_LCD_dat5              4
#define _LCDMenuLib_LCD_dat6              5
#define _LCDMenuLib_LCD_dat7              6
#define _LCDMenuLib_LCD_backlight         7
#define _LCDMenuLib_LCD_backlight_pol     POSITIVE // NEGATIVE