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