From 018e981cc1ffeb724a453e4c8cc8b96586a47e22 Mon Sep 17 00:00:00 2001 From: Patrick Valk Date: Mon, 7 Nov 2016 11:38:51 +0100 Subject: [PATCH] init --- README.md | 15 + arduino/LiquidCrystal/README.adoc | 24 + .../examples/Autoscroll/Autoscroll.ino | 74 +++ .../LiquidCrystal/examples/Blink/Blink.ino | 61 ++ .../LiquidCrystal/examples/Cursor/Cursor.ino | 61 ++ .../CustomCharacter/CustomCharacter.ino | 140 +++++ .../examples/Display/Display.ino | 61 ++ .../examples/HelloWorld/HelloWorld.ino | 60 ++ .../LiquidCrystal/examples/Scroll/Scroll.ino | 86 +++ .../examples/SerialDisplay/SerialDisplay.ino | 65 +++ .../examples/TextDirection/TextDirection.ino | 86 +++ .../examples/setCursor/setCursor.ino | 72 +++ arduino/LiquidCrystal/keywords.txt | 38 ++ arduino/LiquidCrystal/library.properties | 9 + arduino/LiquidCrystal/src/LiquidCrystal.cpp | 551 ++++++++++++++++++ arduino/LiquidCrystal/src/LiquidCrystal.h | 116 ++++ arduino/hd44780_40X4-LCDPROC.ino | 163 ++++++ build lcdproc/driver/raspberry pi/hd44780.so | Bin 0 -> 83679 bytes build lcdproc/driver/ubuntu 32/hd44780.so | Bin 0 -> 82772 bytes instructions/LCDd.conf | 153 +++++ instructions/README.md | 14 + instructions/lcdproc.conf | 148 +++++ 22 files changed, 1997 insertions(+) create mode 100644 README.md create mode 100644 arduino/LiquidCrystal/README.adoc create mode 100644 arduino/LiquidCrystal/examples/Autoscroll/Autoscroll.ino create mode 100644 arduino/LiquidCrystal/examples/Blink/Blink.ino create mode 100644 arduino/LiquidCrystal/examples/Cursor/Cursor.ino create mode 100644 arduino/LiquidCrystal/examples/CustomCharacter/CustomCharacter.ino create mode 100644 arduino/LiquidCrystal/examples/Display/Display.ino create mode 100644 arduino/LiquidCrystal/examples/HelloWorld/HelloWorld.ino create mode 100644 arduino/LiquidCrystal/examples/Scroll/Scroll.ino create mode 100644 arduino/LiquidCrystal/examples/SerialDisplay/SerialDisplay.ino create mode 100644 arduino/LiquidCrystal/examples/TextDirection/TextDirection.ino create mode 100644 arduino/LiquidCrystal/examples/setCursor/setCursor.ino create mode 100644 arduino/LiquidCrystal/keywords.txt create mode 100644 arduino/LiquidCrystal/library.properties create mode 100644 arduino/LiquidCrystal/src/LiquidCrystal.cpp create mode 100644 arduino/LiquidCrystal/src/LiquidCrystal.h create mode 100644 arduino/hd44780_40X4-LCDPROC.ino create mode 100644 build lcdproc/driver/raspberry pi/hd44780.so create mode 100644 build lcdproc/driver/ubuntu 32/hd44780.so create mode 100644 instructions/LCDd.conf create mode 100644 instructions/README.md create mode 100644 instructions/lcdproc.conf diff --git a/README.md b/README.md new file mode 100644 index 0000000..9836a98 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# Arduino-USB + +This is a personal driver/controller i wrote for lcdproc to controll a 4x40 hd44780 display through usb. + +I will post the driver module to lcdproc soon. + +It works by sending serial commands to the arduino, and is based on the works of the original `hd44780` driver in lcdproc by Benjamin Tse . + +## Tested on +* Arduino nano. + + +## Dependency +I moddified the original `LiquidCrystal` from Arduino LLC to work with 4x40 hd44780 displays, this means adding a second enable line. +This library is included in this repository. diff --git a/arduino/LiquidCrystal/README.adoc b/arduino/LiquidCrystal/README.adoc new file mode 100644 index 0000000..d51cee7 --- /dev/null +++ b/arduino/LiquidCrystal/README.adoc @@ -0,0 +1,24 @@ += Liquid Crystal Library for Arduino = + +This library allows an Arduino board to control LiquidCrystal displays (LCDs) based on the Hitachi HD44780 (or a compatible) chipset, which is found on most text-based LCDs. + +For more information about this library please visit us at +http://www.arduino.cc/en/Reference/LiquidCrystal + +== License == + +Copyright (c) Arduino LLC. All right reserved. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA diff --git a/arduino/LiquidCrystal/examples/Autoscroll/Autoscroll.ino b/arduino/LiquidCrystal/examples/Autoscroll/Autoscroll.ino new file mode 100644 index 0000000..f70a1a7 --- /dev/null +++ b/arduino/LiquidCrystal/examples/Autoscroll/Autoscroll.ino @@ -0,0 +1,74 @@ +/* + LiquidCrystal Library - Autoscroll + + Demonstrates the use a 16x2 LCD display. The LiquidCrystal + library works with all LCD displays that are compatible with the + Hitachi HD44780 driver. There are many of them out there, and you + can usually tell them by the 16-pin interface. + + This sketch demonstrates the use of the autoscroll() + and noAutoscroll() functions to make new text scroll or not. + + The circuit: + * LCD RS pin to digital pin 12 + * LCD Enable pin to digital pin 11 + * LCD D4 pin to digital pin 5 + * LCD D5 pin to digital pin 4 + * LCD D6 pin to digital pin 3 + * LCD D7 pin to digital pin 2 + * LCD R/W pin to ground + * 10K resistor: + * ends to +5V and ground + * wiper to LCD VO pin (pin 3) + + Library originally added 18 Apr 2008 + by David A. Mellis + library modified 5 Jul 2009 + by Limor Fried (http://www.ladyada.net) + example added 9 Jul 2009 + by Tom Igoe + modified 22 Nov 2010 + by Tom Igoe + + This example code is in the public domain. + + http://www.arduino.cc/en/Tutorial/LiquidCrystalAutoscroll + + */ + +// include the library code: +#include + +// initialize the library with the numbers of the interface pins +LiquidCrystal lcd(12, 11, 5, 4, 3, 2); + +void setup() { + // set up the LCD's number of columns and rows: + lcd.begin(16, 2); +} + +void loop() { + // set the cursor to (0,0): + lcd.setCursor(0, 0); + // print from 0 to 9: + for (int thisChar = 0; thisChar < 10; thisChar++) { + lcd.print(thisChar); + delay(500); + } + + // set the cursor to (16,1): + lcd.setCursor(16, 1); + // set the display to automatically scroll: + lcd.autoscroll(); + // print from 0 to 9: + for (int thisChar = 0; thisChar < 10; thisChar++) { + lcd.print(thisChar); + delay(500); + } + // turn off automatic scrolling + lcd.noAutoscroll(); + + // clear screen for the next loop: + lcd.clear(); +} + diff --git a/arduino/LiquidCrystal/examples/Blink/Blink.ino b/arduino/LiquidCrystal/examples/Blink/Blink.ino new file mode 100644 index 0000000..fea13a3 --- /dev/null +++ b/arduino/LiquidCrystal/examples/Blink/Blink.ino @@ -0,0 +1,61 @@ +/* + LiquidCrystal Library - Blink + + Demonstrates the use a 16x2 LCD display. The LiquidCrystal + library works with all LCD displays that are compatible with the + Hitachi HD44780 driver. There are many of them out there, and you + can usually tell them by the 16-pin interface. + + This sketch prints "Hello World!" to the LCD and makes the + cursor block blink. + + The circuit: + * LCD RS pin to digital pin 12 + * LCD Enable pin to digital pin 11 + * LCD D4 pin to digital pin 5 + * LCD D5 pin to digital pin 4 + * LCD D6 pin to digital pin 3 + * LCD D7 pin to digital pin 2 + * LCD R/W pin to ground + * 10K resistor: + * ends to +5V and ground + * wiper to LCD VO pin (pin 3) + + Library originally added 18 Apr 2008 + by David A. Mellis + library modified 5 Jul 2009 + by Limor Fried (http://www.ladyada.net) + example added 9 Jul 2009 + by Tom Igoe + modified 22 Nov 2010 + by Tom Igoe + + This example code is in the public domain. + + http://www.arduino.cc/en/Tutorial/LiquidCrystalBlink + + */ + +// include the library code: +#include + +// initialize the library with the numbers of the interface pins +LiquidCrystal lcd(12, 11, 5, 4, 3, 2); + +void setup() { + // set up the LCD's number of columns and rows: + lcd.begin(16, 2); + // Print a message to the LCD. + lcd.print("hello, world!"); +} + +void loop() { + // Turn off the blinking cursor: + lcd.noBlink(); + delay(3000); + // Turn on the blinking cursor: + lcd.blink(); + delay(3000); +} + + diff --git a/arduino/LiquidCrystal/examples/Cursor/Cursor.ino b/arduino/LiquidCrystal/examples/Cursor/Cursor.ino new file mode 100644 index 0000000..8699d27 --- /dev/null +++ b/arduino/LiquidCrystal/examples/Cursor/Cursor.ino @@ -0,0 +1,61 @@ +/* + LiquidCrystal Library - Cursor + + Demonstrates the use a 16x2 LCD display. The LiquidCrystal + library works with all LCD displays that are compatible with the + Hitachi HD44780 driver. There are many of them out there, and you + can usually tell them by the 16-pin interface. + + This sketch prints "Hello World!" to the LCD and + uses the cursor() and noCursor() methods to turn + on and off the cursor. + + The circuit: + * LCD RS pin to digital pin 12 + * LCD Enable pin to digital pin 11 + * LCD D4 pin to digital pin 5 + * LCD D5 pin to digital pin 4 + * LCD D6 pin to digital pin 3 + * LCD D7 pin to digital pin 2 + * LCD R/W pin to ground + * 10K resistor: + * ends to +5V and ground + * wiper to LCD VO pin (pin 3) + + Library originally added 18 Apr 2008 + by David A. Mellis + library modified 5 Jul 2009 + by Limor Fried (http://www.ladyada.net) + example added 9 Jul 2009 + by Tom Igoe + modified 22 Nov 2010 + by Tom Igoe + + This example code is in the public domain. + + http://www.arduino.cc/en/Tutorial/LiquidCrystalCursor + + */ + +// include the library code: +#include + +// initialize the library with the numbers of the interface pins +LiquidCrystal lcd(12, 11, 5, 4, 3, 2); + +void setup() { + // set up the LCD's number of columns and rows: + lcd.begin(16, 2); + // Print a message to the LCD. + lcd.print("hello, world!"); +} + +void loop() { + // Turn off the cursor: + lcd.noCursor(); + delay(500); + // Turn on the cursor: + lcd.cursor(); + delay(500); +} + diff --git a/arduino/LiquidCrystal/examples/CustomCharacter/CustomCharacter.ino b/arduino/LiquidCrystal/examples/CustomCharacter/CustomCharacter.ino new file mode 100644 index 0000000..e70a949 --- /dev/null +++ b/arduino/LiquidCrystal/examples/CustomCharacter/CustomCharacter.ino @@ -0,0 +1,140 @@ +/* + LiquidCrystal Library - Custom Characters + + Demonstrates how to add custom characters on an LCD display. + The LiquidCrystal library works with all LCD displays that are + compatible with the Hitachi HD44780 driver. There are many of + them out there, and you can usually tell them by the 16-pin interface. + + This sketch prints "I Arduino!" and a little dancing man + to the LCD. + + The circuit: + * LCD RS pin to digital pin 12 + * LCD Enable pin to digital pin 11 + * LCD D4 pin to digital pin 5 + * LCD D5 pin to digital pin 4 + * LCD D6 pin to digital pin 3 + * LCD D7 pin to digital pin 2 + * LCD R/W pin to ground + * 10K potentiometer: + * ends to +5V and ground + * wiper to LCD VO pin (pin 3) + * 10K poterntiometer on pin A0 + + created 21 Mar 2011 + by Tom Igoe + modified 11 Nov 2013 + by Scott Fitzgerald + + Based on Adafruit's example at + https://github.com/adafruit/SPI_VFD/blob/master/examples/createChar/createChar.pde + + This example code is in the public domain. + http://www.arduino.cc/en/Tutorial/LiquidCrystal + + Also useful: + http://icontexto.com/charactercreator/ + + */ + +// include the library code: +#include + +// initialize the library with the numbers of the interface pins +LiquidCrystal lcd(12, 11, 5, 4, 3, 2); + +// make some custom characters: +byte heart[8] = { + 0b00000, + 0b01010, + 0b11111, + 0b11111, + 0b11111, + 0b01110, + 0b00100, + 0b00000 +}; + +byte smiley[8] = { + 0b00000, + 0b00000, + 0b01010, + 0b00000, + 0b00000, + 0b10001, + 0b01110, + 0b00000 +}; + +byte frownie[8] = { + 0b00000, + 0b00000, + 0b01010, + 0b00000, + 0b00000, + 0b00000, + 0b01110, + 0b10001 +}; + +byte armsDown[8] = { + 0b00100, + 0b01010, + 0b00100, + 0b00100, + 0b01110, + 0b10101, + 0b00100, + 0b01010 +}; + +byte armsUp[8] = { + 0b00100, + 0b01010, + 0b00100, + 0b10101, + 0b01110, + 0b00100, + 0b00100, + 0b01010 +}; + +void setup() { + // initialize LCD and set up the number of columns and rows: + lcd.begin(16, 2); + + // create a new character + lcd.createChar(0, heart); + // create a new character + lcd.createChar(1, smiley); + // create a new character + lcd.createChar(2, frownie); + // create a new character + lcd.createChar(3, armsDown); + // create a new character + lcd.createChar(4, armsUp); + + // Print a message to the lcd. + lcd.print("I "); + lcd.write(byte(0)); // when calling lcd.write() '0' must be cast as a byte + lcd.print(" Arduino! "); + lcd.write((byte) 1); + +} + +void loop() { + // read the potentiometer on A0: + int sensorReading = analogRead(A0); + // map the result to 200 - 1000: + int delayTime = map(sensorReading, 0, 1023, 200, 1000); + // set the cursor to the bottom row, 5th position: + lcd.setCursor(4, 1); + // draw the little man, arms down: + lcd.write(3); + delay(delayTime); + lcd.setCursor(4, 1); + // draw him arms up: + lcd.write(4); + delay(delayTime); +} diff --git a/arduino/LiquidCrystal/examples/Display/Display.ino b/arduino/LiquidCrystal/examples/Display/Display.ino new file mode 100644 index 0000000..90b14f0 --- /dev/null +++ b/arduino/LiquidCrystal/examples/Display/Display.ino @@ -0,0 +1,61 @@ +/* + LiquidCrystal Library - display() and noDisplay() + + Demonstrates the use a 16x2 LCD display. The LiquidCrystal + library works with all LCD displays that are compatible with the + Hitachi HD44780 driver. There are many of them out there, and you + can usually tell them by the 16-pin interface. + + This sketch prints "Hello World!" to the LCD and uses the + display() and noDisplay() functions to turn on and off + the display. + + The circuit: + * LCD RS pin to digital pin 12 + * LCD Enable pin to digital pin 11 + * LCD D4 pin to digital pin 5 + * LCD D5 pin to digital pin 4 + * LCD D6 pin to digital pin 3 + * LCD D7 pin to digital pin 2 + * LCD R/W pin to ground + * 10K resistor: + * ends to +5V and ground + * wiper to LCD VO pin (pin 3) + + Library originally added 18 Apr 2008 + by David A. Mellis + library modified 5 Jul 2009 + by Limor Fried (http://www.ladyada.net) + example added 9 Jul 2009 + by Tom Igoe + modified 22 Nov 2010 + by Tom Igoe + + This example code is in the public domain. + + http://www.arduino.cc/en/Tutorial/LiquidCrystalDisplay + + */ + +// include the library code: +#include + +// initialize the library with the numbers of the interface pins +LiquidCrystal lcd(12, 11, 5, 4, 3, 2); + +void setup() { + // set up the LCD's number of columns and rows: + lcd.begin(16, 2); + // Print a message to the LCD. + lcd.print("hello, world!"); +} + +void loop() { + // Turn off the display: + lcd.noDisplay(); + delay(500); + // Turn on the display: + lcd.display(); + delay(500); +} + diff --git a/arduino/LiquidCrystal/examples/HelloWorld/HelloWorld.ino b/arduino/LiquidCrystal/examples/HelloWorld/HelloWorld.ino new file mode 100644 index 0000000..bf122d9 --- /dev/null +++ b/arduino/LiquidCrystal/examples/HelloWorld/HelloWorld.ino @@ -0,0 +1,60 @@ +/* + LiquidCrystal Library - Hello World + + Demonstrates the use a 16x2 LCD display. The LiquidCrystal + library works with all LCD displays that are compatible with the + Hitachi HD44780 driver. There are many of them out there, and you + can usually tell them by the 16-pin interface. + + This sketch prints "Hello World!" to the LCD + and shows the time. + + The circuit: + * LCD RS pin to digital pin 12 + * LCD Enable pin to digital pin 11 + * LCD D4 pin to digital pin 5 + * LCD D5 pin to digital pin 4 + * LCD D6 pin to digital pin 3 + * LCD D7 pin to digital pin 2 + * LCD R/W pin to ground + * LCD VSS pin to ground + * LCD VCC pin to 5V + * 10K resistor: + * ends to +5V and ground + * wiper to LCD VO pin (pin 3) + + Library originally added 18 Apr 2008 + by David A. Mellis + library modified 5 Jul 2009 + by Limor Fried (http://www.ladyada.net) + example added 9 Jul 2009 + by Tom Igoe + modified 22 Nov 2010 + by Tom Igoe + + This example code is in the public domain. + + http://www.arduino.cc/en/Tutorial/LiquidCrystal + */ + +// include the library code: +#include + +// initialize the library with the numbers of the interface pins +LiquidCrystal lcd(12, 11, 5, 4, 3, 2); + +void setup() { + // set up the LCD's number of columns and rows: + lcd.begin(16, 2); + // Print a message to the LCD. + lcd.print("hello, world!"); +} + +void loop() { + // set the cursor to column 0, line 1 + // (note: line 1 is the second row, since counting begins with 0): + lcd.setCursor(0, 1); + // print the number of seconds since reset: + lcd.print(millis() / 1000); +} + diff --git a/arduino/LiquidCrystal/examples/Scroll/Scroll.ino b/arduino/LiquidCrystal/examples/Scroll/Scroll.ino new file mode 100644 index 0000000..0a4a95f --- /dev/null +++ b/arduino/LiquidCrystal/examples/Scroll/Scroll.ino @@ -0,0 +1,86 @@ +/* + LiquidCrystal Library - scrollDisplayLeft() and scrollDisplayRight() + + Demonstrates the use a 16x2 LCD display. The LiquidCrystal + library works with all LCD displays that are compatible with the + Hitachi HD44780 driver. There are many of them out there, and you + can usually tell them by the 16-pin interface. + + This sketch prints "Hello World!" to the LCD and uses the + scrollDisplayLeft() and scrollDisplayRight() methods to scroll + the text. + + The circuit: + * LCD RS pin to digital pin 12 + * LCD Enable pin to digital pin 11 + * LCD D4 pin to digital pin 5 + * LCD D5 pin to digital pin 4 + * LCD D6 pin to digital pin 3 + * LCD D7 pin to digital pin 2 + * LCD R/W pin to ground + * 10K resistor: + * ends to +5V and ground + * wiper to LCD VO pin (pin 3) + + Library originally added 18 Apr 2008 + by David A. Mellis + library modified 5 Jul 2009 + by Limor Fried (http://www.ladyada.net) + example added 9 Jul 2009 + by Tom Igoe + modified 22 Nov 2010 + by Tom Igoe + + This example code is in the public domain. + + http://www.arduino.cc/en/Tutorial/LiquidCrystalScroll + + */ + +// include the library code: +#include + +// initialize the library with the numbers of the interface pins +LiquidCrystal lcd(12, 11, 5, 4, 3, 2); + +void setup() { + // set up the LCD's number of columns and rows: + lcd.begin(16, 2); + // Print a message to the LCD. + lcd.print("hello, world!"); + delay(1000); +} + +void loop() { + // scroll 13 positions (string length) to the left + // to move it offscreen left: + for (int positionCounter = 0; positionCounter < 13; positionCounter++) { + // scroll one position left: + lcd.scrollDisplayLeft(); + // wait a bit: + delay(150); + } + + // scroll 29 positions (string length + display length) to the right + // to move it offscreen right: + for (int positionCounter = 0; positionCounter < 29; positionCounter++) { + // scroll one position right: + lcd.scrollDisplayRight(); + // wait a bit: + delay(150); + } + + // scroll 16 positions (display length + string length) to the left + // to move it back to center: + for (int positionCounter = 0; positionCounter < 16; positionCounter++) { + // scroll one position left: + lcd.scrollDisplayLeft(); + // wait a bit: + delay(150); + } + + // delay at the end of the full loop: + delay(1000); + +} + diff --git a/arduino/LiquidCrystal/examples/SerialDisplay/SerialDisplay.ino b/arduino/LiquidCrystal/examples/SerialDisplay/SerialDisplay.ino new file mode 100644 index 0000000..ec46ff0 --- /dev/null +++ b/arduino/LiquidCrystal/examples/SerialDisplay/SerialDisplay.ino @@ -0,0 +1,65 @@ +/* + LiquidCrystal Library - Serial Input + + Demonstrates the use a 16x2 LCD display. The LiquidCrystal + library works with all LCD displays that are compatible with the + Hitachi HD44780 driver. There are many of them out there, and you + can usually tell them by the 16-pin interface. + + This sketch displays text sent over the serial port + (e.g. from the Serial Monitor) on an attached LCD. + + The circuit: + * LCD RS pin to digital pin 12 + * LCD Enable pin to digital pin 11 + * LCD D4 pin to digital pin 5 + * LCD D5 pin to digital pin 4 + * LCD D6 pin to digital pin 3 + * LCD D7 pin to digital pin 2 + * LCD R/W pin to ground + * 10K resistor: + * ends to +5V and ground + * wiper to LCD VO pin (pin 3) + + Library originally added 18 Apr 2008 + by David A. Mellis + library modified 5 Jul 2009 + by Limor Fried (http://www.ladyada.net) + example added 9 Jul 2009 + by Tom Igoe + modified 22 Nov 2010 + by Tom Igoe + + This example code is in the public domain. + + http://www.arduino.cc/en/Tutorial/LiquidCrystalSerial + */ + +// include the library code: +#include + +// initialize the library with the numbers of the interface pins +LiquidCrystal lcd(12, 11, 5, 4, 3, 2); + +void setup() { + // set up the LCD's number of columns and rows: + lcd.begin(16, 2); + // initialize the serial communications: + Serial.begin(9600); +} + +void loop() +{ + // when characters arrive over the serial port... + if (Serial.available()) { + // wait a bit for the entire message to arrive + delay(100); + // clear the screen + lcd.clear(); + // read all the available characters + while (Serial.available() > 0) { + // display each character to the LCD + lcd.write(Serial.read()); + } + } +} diff --git a/arduino/LiquidCrystal/examples/TextDirection/TextDirection.ino b/arduino/LiquidCrystal/examples/TextDirection/TextDirection.ino new file mode 100644 index 0000000..c838d81 --- /dev/null +++ b/arduino/LiquidCrystal/examples/TextDirection/TextDirection.ino @@ -0,0 +1,86 @@ +/* +LiquidCrystal Library - TextDirection + +Demonstrates the use a 16x2 LCD display. The LiquidCrystal +library works with all LCD displays that are compatible with the +Hitachi HD44780 driver. There are many of them out there, and you +can usually tell them by the 16-pin interface. + +This sketch demonstrates how to use leftToRight() and rightToLeft() +to move the cursor. + +The circuit: +* LCD RS pin to digital pin 12 +* LCD Enable pin to digital pin 11 +* LCD D4 pin to digital pin 5 +* LCD D5 pin to digital pin 4 +* LCD D6 pin to digital pin 3 +* LCD D7 pin to digital pin 2 +* LCD R/W pin to ground +* 10K resistor: +* ends to +5V and ground +* wiper to LCD VO pin (pin 3) + +Library originally added 18 Apr 2008 +by David A. Mellis +library modified 5 Jul 2009 +by Limor Fried (http://www.ladyada.net) +example added 9 Jul 2009 +by Tom Igoe +modified 22 Nov 2010 +by Tom Igoe + +This example code is in the public domain. + +http://www.arduino.cc/en/Tutorial/LiquidCrystalTextDirection + +*/ + +// include the library code: +#include + +// initialize the library with the numbers of the interface pins +LiquidCrystal lcd(12, 11, 5, 4, 3, 2); + +int thisChar = 'a'; + +void setup() { + // set up the LCD's number of columns and rows: + lcd.begin(16, 2); + // turn on the cursor: + lcd.cursor(); +} + +void loop() { + // reverse directions at 'm': + if (thisChar == 'm') { + // go right for the next letter + lcd.rightToLeft(); + } + // reverse again at 's': + if (thisChar == 's') { + // go left for the next letter + lcd.leftToRight(); + } + // reset at 'z': + if (thisChar > 'z') { + // go to (0,0): + lcd.home(); + // start again at 0 + thisChar = 'a'; + } + // print the character + lcd.write(thisChar); + // wait a second: + delay(1000); + // increment the letter: + thisChar++; +} + + + + + + + + diff --git a/arduino/LiquidCrystal/examples/setCursor/setCursor.ino b/arduino/LiquidCrystal/examples/setCursor/setCursor.ino new file mode 100644 index 0000000..d2dae93 --- /dev/null +++ b/arduino/LiquidCrystal/examples/setCursor/setCursor.ino @@ -0,0 +1,72 @@ +/* + LiquidCrystal Library - setCursor + + Demonstrates the use a 16x2 LCD display. The LiquidCrystal + library works with all LCD displays that are compatible with the + Hitachi HD44780 driver. There are many of them out there, and you + can usually tell them by the 16-pin interface. + + This sketch prints to all the positions of the LCD using the + setCursor() method: + + The circuit: + * LCD RS pin to digital pin 12 + * LCD Enable pin to digital pin 11 + * LCD D4 pin to digital pin 5 + * LCD D5 pin to digital pin 4 + * LCD D6 pin to digital pin 3 + * LCD D7 pin to digital pin 2 + * LCD R/W pin to ground + * 10K resistor: + * ends to +5V and ground + * wiper to LCD VO pin (pin 3) + + Library originally added 18 Apr 2008 + by David A. Mellis + library modified 5 Jul 2009 + by Limor Fried (http://www.ladyada.net) + example added 9 Jul 2009 + by Tom Igoe + modified 22 Nov 2010 + by Tom Igoe + + This example code is in the public domain. + + http://www.arduino.cc/en/Tutorial/LiquidCrystalSetCursor + + */ + +// include the library code: +#include + +// these constants won't change. But you can change the size of +// your LCD using them: +const int numRows = 2; +const int numCols = 16; + +// initialize the library with the numbers of the interface pins +LiquidCrystal lcd(12, 11, 5, 4, 3, 2); + +void setup() { + // set up the LCD's number of columns and rows: + lcd.begin(numCols, numRows); +} + +void loop() { + // loop from ASCII 'a' to ASCII 'z': + for (int thisLetter = 'a'; thisLetter <= 'z'; thisLetter++) { + // loop over the columns: + for (int thisRow = 0; thisRow < numRows; thisRow++) { + // loop over the rows: + for (int thisCol = 0; thisCol < numCols; thisCol++) { + // set the cursor position: + lcd.setCursor(thisCol, thisRow); + // print the letter: + lcd.write(thisLetter); + delay(200); + } + } + } +} + + diff --git a/arduino/LiquidCrystal/keywords.txt b/arduino/LiquidCrystal/keywords.txt new file mode 100644 index 0000000..b6aa7fd --- /dev/null +++ b/arduino/LiquidCrystal/keywords.txt @@ -0,0 +1,38 @@ +####################################### +# Syntax Coloring Map For LiquidCrystal +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +LiquidCrystal KEYWORD1 LiquidCrystal + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +begin KEYWORD2 +clear KEYWORD2 +home KEYWORD2 +print KEYWORD2 +setCursor KEYWORD2 +cursor KEYWORD2 +noCursor KEYWORD2 +blink KEYWORD2 +noBlink KEYWORD2 +display KEYWORD2 +noDisplay KEYWORD2 +autoscroll KEYWORD2 +noAutoscroll KEYWORD2 +leftToRight KEYWORD2 +rightToLeft KEYWORD2 +scrollDisplayLeft KEYWORD2 +scrollDisplayRight KEYWORD2 +createChar KEYWORD2 +setRowOffsets KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### + diff --git a/arduino/LiquidCrystal/library.properties b/arduino/LiquidCrystal/library.properties new file mode 100644 index 0000000..7aa5b52 --- /dev/null +++ b/arduino/LiquidCrystal/library.properties @@ -0,0 +1,9 @@ +name=LiquidCrystal +version=1.0.2 +author=Arduino, Adafruit +maintainer=Arduino +sentence=Allows communication with alphanumerical liquid crystal displays (LCDs). For all Arduino boards. +paragraph=This library allows an Arduino board to control LiquidCrystal displays (LCDs) based on the Hitachi HD44780 (or a compatible) chipset, which is found on most text-based LCDs. The library works with in either 4 or 8 bit mode (i.e. using 4 or 8 data lines in addition to the rs, enable, and, optionally, the rw control lines). +category=Display +url=http://www.arduino.cc/en/Reference/LiquidCrystal +architectures=* diff --git a/arduino/LiquidCrystal/src/LiquidCrystal.cpp b/arduino/LiquidCrystal/src/LiquidCrystal.cpp new file mode 100644 index 0000000..0f9a383 --- /dev/null +++ b/arduino/LiquidCrystal/src/LiquidCrystal.cpp @@ -0,0 +1,551 @@ +#include "LiquidCrystal.h" + +#include +#include +#include +#include "Arduino.h" + +// When the display powers up, it is configured as follows: +// +// 1. Display clear +// 2. Function set: +// DL = 1; 8-bit interface data +// N = 0; 1-line display +// F = 0; 5x8 dot character font +// 3. Display on/off control: +// D = 0; Display off +// C = 0; Cursor off +// B = 0; Blinking off +// 4. Entry mode set: +// I/D = 1; Increment by 1 +// S = 0; No shift +// +// Note, however, that resetting the Arduino doesn't reset the LCD, so we +// can't assume that its in that state when a sketch starts (and the +// LiquidCrystal constructor is called). + +LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, + uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, + uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7) +{ + init(0, rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7); +} + +LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t enable, + uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, + uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7) +{ + init(0, rs, 255, enable, d0, d1, d2, d3, d4, d5, d6, d7); +} + +LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, + uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3) +{ + init(1, rs, rw, enable, d0, d1, d2, d3, 0, 0, 0, 0); +} + +// Custom initializer +LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable1, uint8_t enable2, + uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3) +{ + _enable_pin1 = enable1; + _enable_pin2 = enable2; + _d = 0; + init(1, rs, rw, enable1, d0, d1, d2, d3, 0, 0, 0, 0); +} + +LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t enable, + uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3) +{ + init(1, rs, 255, enable, d0, d1, d2, d3, 0, 0, 0, 0); +} + +void LiquidCrystal::setController(int i) +{ + if (i >= 1) + _enable_pin = _enable_pin2; + else + _enable_pin = _enable_pin1; +} + +void LiquidCrystal::init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable, + uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, + uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7) +{ + _rs_pin = rs; + _rw_pin = rw; + _enable_pin = enable; + + _data_pins[0] = d0; + _data_pins[1] = d1; + _data_pins[2] = d2; + _data_pins[3] = d3; + _data_pins[4] = d4; + _data_pins[5] = d5; + _data_pins[6] = d6; + _data_pins[7] = d7; + + if (fourbitmode) + _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS; + else + _displayfunction = LCD_8BITMODE | LCD_1LINE | LCD_5x8DOTS; + + begin(16, 1); +} + +void LiquidCrystal::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) { + _numlines = lines; + + if (_numlines == 4 && _d == 0) + { + _d = 1; + setController(0); + begin(cols, lines, dotsize); + setController(1); + begin(cols, lines, dotsize); + _d = 0; + return; + } + + if (lines > 1) { + _displayfunction |= LCD_2LINE; + } + + setRowOffsets(0x00, 0x40, 0x00 + cols, 0x40 + cols); + + // for some 1 line displays you can select a 10 pixel high font + if ((dotsize != LCD_5x8DOTS) && (lines == 1)) { + _displayfunction |= LCD_5x10DOTS; + } + + pinMode(_rs_pin, OUTPUT); + // we can save 1 pin by not using RW. Indicate by passing 255 instead of pin# + if (_rw_pin != 255) { + pinMode(_rw_pin, OUTPUT); + } + pinMode(_enable_pin, OUTPUT); + + // Do these once, instead of every time a character is drawn for speed reasons. + for (int i=0; i<((_displayfunction & LCD_8BITMODE) ? 8 : 4); ++i) + { + pinMode(_data_pins[i], OUTPUT); + } + + // SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION! + // according to datasheet, we need at least 40ms after power rises above 2.7V + // before sending commands. Arduino can turn on way before 4.5V so we'll wait 50 + delayMicroseconds(50000); + // Now we pull both RS and R/W low to begin commands + digitalWrite(_rs_pin, LOW); + digitalWrite(_enable_pin, LOW); + if (_rw_pin != 255) { + digitalWrite(_rw_pin, LOW); + } + + //put the LCD into 4 bit or 8 bit mode + if (! (_displayfunction & LCD_8BITMODE)) { + // this is according to the hitachi HD44780 datasheet + // figure 24, pg 46 + + // we start in 8bit mode, try to set 4 bit mode + write4bits(0x03); + delayMicroseconds(4500); // wait min 4.1ms + + // second try + write4bits(0x03); + delayMicroseconds(4500); // wait min 4.1ms + + // third go! + write4bits(0x03); + delayMicroseconds(150); + + // finally, set to 4-bit interface + write4bits(0x02); + } else { + // this is according to the hitachi HD44780 datasheet + // page 45 figure 23 + + // Send function set command sequence + command(LCD_FUNCTIONSET | _displayfunction); + delayMicroseconds(4500); // wait more than 4.1ms + + // second try + command(LCD_FUNCTIONSET | _displayfunction); + delayMicroseconds(150); + + // third go + command(LCD_FUNCTIONSET | _displayfunction); + } + + // finally, set # lines, font size, etc. + command(LCD_FUNCTIONSET | _displayfunction); + + // turn the display on with no cursor or blinking default + _displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF; + display(); + + // clear it off + clear(); + + // Initialize to default text direction (for romance languages) + _displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT; + // set the entry mode + command(LCD_ENTRYMODESET | _displaymode); + +} + +void LiquidCrystal::setRowOffsets(int row0, int row1, int row2, int row3) +{ + _row_offsets[0] = row0; + _row_offsets[1] = row1; + _row_offsets[2] = row2; + _row_offsets[3] = row3; +} + +/********** high level commands, for the user! */ +void LiquidCrystal::clear() +{ + if (_numlines == 4 && _d == 0) + { + _d = 1; + setController(0); + clear(); + setController(1); + clear(); + _d = 0; + return; + } + + command(LCD_CLEARDISPLAY); // clear display, set cursor position to zero + delayMicroseconds(2000); // this command takes a long time! +} + +void LiquidCrystal::home() +{ + if (_numlines == 4 && _d == 0) + { + _d = 1; + setController(0); + home(); + setController(1); + home(); + _d = 0; + return; + } + + command(LCD_RETURNHOME); // set cursor position to zero + delayMicroseconds(2000); // this command takes a long time! +} + +void LiquidCrystal::setCursor(uint8_t col, uint8_t row) +{ + if (row >= 2) + { + _enable_pin = _enable_pin1; + row -= 2; + } + else + _enable_pin = _enable_pin2; + + const size_t max_lines = sizeof(_row_offsets) / sizeof(*_row_offsets); + if ( row >= max_lines ) { + row = max_lines - 1; // we count rows starting w/0 + } + if ( row >= _numlines ) { + row = _numlines - 1; // we count rows starting w/0 + } + + command(LCD_SETDDRAMADDR | (col + _row_offsets[row])); +} + +// Turn the display on/off (quickly) +void LiquidCrystal::noDisplay() { + if (_numlines == 4 && _d == 0) + { + _d = 1; + setController(0); + noDisplay(); + setController(1); + noDisplay(); + _d = 0; + return; + } + + _displaycontrol &= ~LCD_DISPLAYON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} +void LiquidCrystal::display() { + if (_numlines == 4 && _d == 0) + { + _d = 1; + setController(0); + display(); + setController(1); + display(); + _d = 0; + return; + } + + _displaycontrol |= LCD_DISPLAYON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} + +// Turns the underline cursor on/off +void LiquidCrystal::noCursor() { + if (_numlines == 4 && _d == 0) + { + _d = 1; + setController(0); + noCursor(); + setController(1); + noCursor(); + _d = 0; + return; + } + + _displaycontrol &= ~LCD_CURSORON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} +void LiquidCrystal::cursor() { + if (_numlines == 4 && _d == 0) + { + _d = 1; + setController(0); + cursor(); + setController(1); + cursor(); + _d = 0; + return; + } + + _displaycontrol |= LCD_CURSORON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} + +// Turn on and off the blinking cursor +void LiquidCrystal::noBlink() { + if (_numlines == 4 && _d == 0) + { + _d = 1; + setController(0); + noBlink(); + setController(1); + noBlink(); + _d = 0; + return; + } + + _displaycontrol &= ~LCD_BLINKON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} +void LiquidCrystal::blink() { + if (_numlines == 4 && _d == 0) + { + _d = 1; + setController(0); + blink(); + setController(1); + blink(); + _d = 0; + return; + } + + _displaycontrol |= LCD_BLINKON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} + +// These commands scroll the display without changing the RAM +void LiquidCrystal::scrollDisplayLeft(void) { + if (_numlines == 4 && _d == 0) + { + _d = 1; + setController(0); + scrollDisplayLeft(); + setController(1); + scrollDisplayLeft(); + _d = 0; + return; + } + + command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT); +} +void LiquidCrystal::scrollDisplayRight(void) { + if (_numlines == 4 && _d == 0) + { + _d = 1; + setController(0); + scrollDisplayRight(); + setController(1); + scrollDisplayRight(); + _d = 0; + return; + } + + command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT); +} + +// This is for text that flows Left to Right +void LiquidCrystal::leftToRight(void) { + if (_numlines == 4 && _d == 0) + { + _d = 1; + setController(0); + leftToRight(); + setController(1); + leftToRight(); + _d = 0; + return; + } + + _displaymode |= LCD_ENTRYLEFT; + command(LCD_ENTRYMODESET | _displaymode); +} + +// This is for text that flows Right to Left +void LiquidCrystal::rightToLeft(void) { + if (_numlines == 4 && _d == 0) + { + _d = 1; + setController(0); + rightToLeft(); + setController(1); + rightToLeft(); + _d = 0; + return; + } + + _displaymode &= ~LCD_ENTRYLEFT; + command(LCD_ENTRYMODESET | _displaymode); +} + +// This will 'right justify' text from the cursor +void LiquidCrystal::autoscroll(void) { + if (_numlines == 4 && _d == 0) + { + _d = 1; + setController(0); + autoscroll(); + setController(1); + autoscroll(); + _d = 0; + return; + } + + _displaymode |= LCD_ENTRYSHIFTINCREMENT; + command(LCD_ENTRYMODESET | _displaymode); +} + +// This will 'left justify' text from the cursor +void LiquidCrystal::noAutoscroll(void) { + if (_numlines == 4 && _d == 0) + { + _d = 1; + setController(0); + noAutoscroll(); + setController(1); + noAutoscroll(); + _d = 0; + return; + } + + _displaymode &= ~LCD_ENTRYSHIFTINCREMENT; + command(LCD_ENTRYMODESET | _displaymode); +} + +// Allows us to fill the first 8 CGRAM locations +// with custom characters +void LiquidCrystal::createChar(uint8_t location, uint8_t charmap[]) { + if (_numlines == 4 && _d == 0) + { + _d = 1; + setController(0); + createChar(location, charmap); + setController(1); + createChar(location, charmap); + _d = 0; + return; + } + + location &= 0x7; // we only have 8 locations 0-7 + command(LCD_SETCGRAMADDR | (location << 3)); + for (int i=0; i<8; i++) { + write(charmap[i]); + } +} + +/*********** mid level commands, for sending data/cmds */ + +inline void LiquidCrystal::command(uint8_t value) +{ + if (_numlines == 4 && _d == 0) + { + _d = 1; + setController(0); + command(value); + setController(1); + command(value); + _d = 0; + return; + } + send(value, LOW); +} + +inline size_t LiquidCrystal::write(uint8_t value) +{ + if (_numlines == 4 && _d == 0) + { + _d = 1; + setController(0); + write(value); + setController(1); + write(value); + _d = 0; + return; + } + send(value, HIGH); + return 1; // assume sucess +} + +/************ low level data pushing commands **********/ + +// write either command or data, with automatic 4/8-bit selection +void LiquidCrystal::send(uint8_t value, uint8_t mode) { + digitalWrite(_rs_pin, mode); + + // if there is a RW pin indicated, set it low to Write + if (_rw_pin != 255) { + digitalWrite(_rw_pin, LOW); + } + + if (_displayfunction & LCD_8BITMODE) { + write8bits(value); + } else { + write4bits(value>>4); + write4bits(value); + } +} + +void LiquidCrystal::pulseEnable(void) { + digitalWrite(_enable_pin, LOW); + delayMicroseconds(1); + digitalWrite(_enable_pin, HIGH); + delayMicroseconds(1); // enable pulse must be >450ns + digitalWrite(_enable_pin, LOW); + delayMicroseconds(100); // commands need > 37us to settle +} + +void LiquidCrystal::write4bits(uint8_t value) { + for (int i = 0; i < 4; i++) { + digitalWrite(_data_pins[i], (value >> i) & 0x01); + } + + pulseEnable(); +} + +void LiquidCrystal::write8bits(uint8_t value) { + for (int i = 0; i < 8; i++) { + digitalWrite(_data_pins[i], (value >> i) & 0x01); + } + + pulseEnable(); +} diff --git a/arduino/LiquidCrystal/src/LiquidCrystal.h b/arduino/LiquidCrystal/src/LiquidCrystal.h new file mode 100644 index 0000000..dbab221 --- /dev/null +++ b/arduino/LiquidCrystal/src/LiquidCrystal.h @@ -0,0 +1,116 @@ +#ifndef LiquidCrystal_h +#define LiquidCrystal_h + +#include +#include "Print.h" + +// commands +#define LCD_CLEARDISPLAY 0x01 +#define LCD_RETURNHOME 0x02 +#define LCD_ENTRYMODESET 0x04 +#define LCD_DISPLAYCONTROL 0x08 +#define LCD_CURSORSHIFT 0x10 +#define LCD_FUNCTIONSET 0x20 +#define LCD_SETCGRAMADDR 0x40 +#define LCD_SETDDRAMADDR 0x80 + +// flags for display entry mode +#define LCD_ENTRYRIGHT 0x00 +#define LCD_ENTRYLEFT 0x02 +#define LCD_ENTRYSHIFTINCREMENT 0x01 +#define LCD_ENTRYSHIFTDECREMENT 0x00 + +// flags for display on/off control +#define LCD_DISPLAYON 0x04 +#define LCD_DISPLAYOFF 0x00 +#define LCD_CURSORON 0x02 +#define LCD_CURSOROFF 0x00 +#define LCD_BLINKON 0x01 +#define LCD_BLINKOFF 0x00 + +// flags for display/cursor shift +#define LCD_DISPLAYMOVE 0x08 +#define LCD_CURSORMOVE 0x00 +#define LCD_MOVERIGHT 0x04 +#define LCD_MOVELEFT 0x00 + +// flags for function set +#define LCD_8BITMODE 0x10 +#define LCD_4BITMODE 0x00 +#define LCD_2LINE 0x08 +#define LCD_1LINE 0x00 +#define LCD_5x10DOTS 0x04 +#define LCD_5x8DOTS 0x00 + +class LiquidCrystal : public Print { +public: + LiquidCrystal(uint8_t rs, uint8_t enable, + uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, + uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7); + LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, + uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, + uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7); + LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, + uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3); + LiquidCrystal(uint8_t rs, uint8_t enable, + uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3); + LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable1, uint8_t enable2, + uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3); + + void init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable, + uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, + uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7); + + void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS); + + void clear(); + void home(); + + void noDisplay(); + void display(); + void noBlink(); + void blink(); + void noCursor(); + void cursor(); + void scrollDisplayLeft(); + void scrollDisplayRight(); + void leftToRight(); + void rightToLeft(); + void autoscroll(); + void noAutoscroll(); + + void setRowOffsets(int row1, int row2, int row3, int row4); + void createChar(uint8_t, uint8_t[]); + void setCursor(uint8_t, uint8_t); + virtual size_t write(uint8_t); + void command(uint8_t); + void setController(int i); + + using Print::write; +private: + + void send(uint8_t, uint8_t); + void write4bits(uint8_t); + void write8bits(uint8_t); + void pulseEnable(); + + uint8_t _rs_pin; // LOW: command. HIGH: character. + uint8_t _rw_pin; // LOW: write to LCD. HIGH: read from LCD. + uint8_t _enable_pin; // activated by a HIGH pulse. + uint8_t _enable_pin1; // activated by a HIGH pulse. + uint8_t _enable_pin2; // activated by a HIGH pulse. + uint8_t _data_pins[8]; + + uint8_t _displayfunction; + uint8_t _displaycontrol; + uint8_t _displaymode; + + uint8_t _initialized; + + uint8_t _numlines; + uint8_t _row_offsets[4]; + + uint8_t _d; +}; + +#endif diff --git a/arduino/hd44780_40X4-LCDPROC.ino b/arduino/hd44780_40X4-LCDPROC.ino new file mode 100644 index 0000000..eb44a24 --- /dev/null +++ b/arduino/hd44780_40X4-LCDPROC.ino @@ -0,0 +1,163 @@ +#include + +LiquidCrystal lcd(9, 8, 7, 6, 5, 4, 3, 2); + +int row = 0; +int line = 0; +bool controller = false; + +void setup() { + Serial.begin(115200); + // set up the LCD's number of columns and rows: + lcd.begin(40, 4); + lcd.clear(); + lcd.home(); +} + +#define LCDSERIALIZER_LCDI 0xFE + +byte serial_getch() { + int incoming; + while (Serial.available() == 0) { + } + // read the incoming byte: + incoming = Serial.read(); + //Serial.write(incoming); + + return (incoming & 0xff); +} + +void loop() { + byte rxbyte = serial_getch(); // Fetch byte + + if (rxbyte == LCDSERIALIZER_LCDI) // If LCD instruction + { + //Serial.write("[CMD]"); + + rxbyte = serial_getch(); // Fetch byte + + if (rxbyte == 0x01) + { + Serial.println("Clear screen"); + } + else if (rxbyte == 0x0c) + { + Serial.println("Restore the display (with cursor hidden)"); + } + else if (rxbyte == 0x08) + { + Serial.println("Blank the display (without clearing)"); + } + else if (rxbyte == 0x0c) + { + Serial.println("Make cursor invisible"); + } + else if (rxbyte == 0x0f) + { + Serial.println("Turn on visible blinking-block cursor"); + } + else if (rxbyte == 0x0e) + { + Serial.println("Turn on visible underline cursor"); + } + else if (rxbyte == 0x10) + { + Serial.println("Move cursor one character left"); + } + else if (rxbyte == 0x14) + { + Serial.println("Move cursor one character right"); + } + else if (rxbyte == 0x15) + { + Serial.println("(15)Move cursor one character right"); + } + else if (rxbyte == 0x02) + { + Serial.println("Home (move cursor to top/left character position)"); + } + else if (rxbyte == 0x18) + { + Serial.println("Scroll display one character left (all lines)"); + } + else if (rxbyte == 0x1e) + { + Serial.println("Scroll display one character right (all lines)"); + } + else if (rxbyte == 0x20) + { + Serial.println("Function set (4-bit interface, 1 line, 5*7 Pixels)"); + } + else if (rxbyte == 0x28) + { + Serial.println("Function set (4-bit interface, 2 lines, 5*7 Pixels)"); + } + else if (rxbyte == 0x30) + { + Serial.println("Function set (8-bit interface, 1 line, 5*7 Pixels)"); + } + else if (rxbyte == 0x38) + { + Serial.println("Function set (8-bit interface, 2 lines, 5*7 Pixels)"); + } + else if (rxbyte == 0x80) // set ddram address command. + { + serial_getch(); // instruction + row = serial_getch(); + serial_getch(); // instruction + line = serial_getch(); + + lcd.setCursor(line, row); + + Serial.println("Set Cursor to " + String(row) + "," + String(line)); + + return; + } + else if (rxbyte & 0x40) // set cgram address, cgram is custom character ram. + { + Serial.println("Set pointer in character-generator RAM (CG RAM address)"); + Serial.println("["); + + lcd.setController(0); + lcd.command(rxbyte); + lcd.setController(1); + lcd.command(rxbyte); + + // get custom char + for (int i = 0; i < 8; i++) + { + rxbyte = serial_getch(); // Fetch byte + + String thisString = String(rxbyte, HEX); + Serial.println(thisString); + + lcd.setController(0); + lcd.write(rxbyte); + lcd.setController(1); + lcd.write(rxbyte); + } + + Serial.println("]"); + + return; + } + else + { + // print byte. + String thisString = String(rxbyte, HEX); + Serial.println("UNKNOWN " + thisString); + } + + lcd.command(rxbyte); + } + else + { + // print byte. + //String thisString = String(rxbyte, HEX); + //Serial.println(thisString); + //Serial.println("position " + String(row) + " " + String(line)); + + lcd.write(rxbyte); + // line++; + } +} diff --git a/build lcdproc/driver/raspberry pi/hd44780.so b/build lcdproc/driver/raspberry pi/hd44780.so new file mode 100644 index 0000000000000000000000000000000000000000..aa7006434c6f357cca5ff4103f60349da6a33258 GIT binary patch literal 83679 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 z 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

2!H01Iy2~f!0|L=yGD&>9}6dbh)5AQJ&N< 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 a{G(VYhv=ZRH7~tEKE`;TWa1c2?|%S+^ENC1 literal 0 HcmV?d00001 diff --git a/instructions/LCDd.conf b/instructions/LCDd.conf new file mode 100644 index 0000000..fb8ec8c --- /dev/null +++ b/instructions/LCDd.conf @@ -0,0 +1,153 @@ +# LCDd.conf +# +# This file contains the configuration for the LCDd server. +# +# The format is ini-file-like. It is divided into sections that start at +# markers that look like [section]. Comments are all line-based comments, +# and are lines that start with '#' or ';'. +# +# The server has a 'central' section named [server]. For the menu there is +# a section called [menu]. Further each driver has a section which +# defines how the driver acts. +# +# The drivers are activated by specifiying them in a driver= line in the +# server section, like: +# +# Driver=curses +# +# This tells LCDd to use the curses driver. +# The first driver that is loaded and is capable of output defines the +# size of the display. The default driver to use is curses. +# If -d is specified on the command line, the Driver= options in the +# config file are ignored. +# +# The drivers read their own options from the respective sections. + + +## Server section with all kinds of settings for the LCDd server ## +[server] + +# Tells the server to load the given drivers. Multiple lines can be given. +# The name of the driver is exactly the same as the name of the driver +# module that is to be loaded, including the case of the letters ! +# (That is: unless a file= option is given in the driver section) +Driver=hd44780 + +# Tells the driver to bind to the given interface +Bind=127.0.0.1 + +# Listen on this specified port; defaults to 13666. +Port=13666 + +# Sets the reporting level; defaults to 2 (warnings and errors only). +#ReportLevel=3 + +# Should we report to syslog instead of stderr ? Default: no +#ReportToSyslog=yes + +# Sets the default time in seconds to displays a screen. +WaitTime=8 + +# User to run as. LCDd will drop its root priviledges, +# if any, and run as this user instead. +User=nobody + +# If yes, the the serverscreen will be rotated as a usual info screen. If no, +# it will be a background screen, only visible when no other screens are +# active. +ServerScreen=no + +# The server will stay in the foreground if set to true. +#Foreground=no + +# Where can we find the driver modules ? +# IMPORTANT: Make sure to change this setting to reflect your +# specific setup! Otherwise LCDd won't be able to find +# the driver modules and will thus not be able to +# function properly. +# NOTE: Always place a slash as last character ! +DriverPath=/usr/local/lib/lcdproc/ + +# The "...Key=" lines define what the server does with keypresses that +# don't go to any client. +# These are the defaults: +ToggleRotateKey=Enter +PrevScreenKey=Left +NextScreenKey=Right +#ScrollUpKey=Up +#ScrollDownKey=Down + +# If you have only 4 keys, you can choose to use this: +#ToggleRotateKey=Enter +#PrevScreenKey=Up +#NextScreenKey=Down + +# If you have only 3 keys, you can choose to use this: +#ToggleRotateKey=Enter +#PrevScreenKey=Up + + + +## The menu section. The menu is an internal LCDproc client. ## +[menu] +# You can configure what keys the menu should use. Note that the MenuKey +# will be reserved exclusively, the others work in shared mode. + +# The following works excellent with 4 keys or more. +MenuKey=Escape +EnterKey=Enter +UpKey=Up +DownKey=Down +# If you have 6 keys you may define these as well +#LeftKey=Left +#RightKey=Right + +# If you have only 3 keys, you could use something like this: +#MenuKey=Escape +#EnterKey=Enter +#DownKey=Down + + + +### Driver sections are below this line, in alphabetical order ### +## Hitachi HD44780 driver ## +[hd44780] + +# Port where the LPT is. Usual values are 0x278, 0x378 and 0x3BC +#Port=0x378 + +Device=/dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0 + +# Select what type of connection. See documentation for types. +connectionType=lcdserializer +#connectionType=picanlcd + + +Speed=115200 + +RefreshDisplay=1 + +# Specifies the size of the LCD. +# In case of multiple combined displays, this should be the total size. +Size=40x4 + +# For multiple combined displays: how many lines does each display have. +# Vspan=2,2 means both displays have 2 lines. +#vspan=2,2 + +# If you have a KS0073 or an other 'almost HD44780-compatible', set this +# flag to get into extended mode (4-line linear). +# This flag is NOT the old obsolete Extended option. +#ExtendedMode=yes + +# If your display is slow and cannot keep up with the flow of data from +# LCDd, garbage can appear on the LCDd. Set this delay factor to 2 or 4 +# to increase the delays. Default: 1. +DelayMult=12 + +# You can reduce the inserted delays by setting this to false. +# On fast PCs it is possible your LCD does not respond correctly. +# Default: true. +DelayBus=false + +# EOF diff --git a/instructions/README.md b/instructions/README.md new file mode 100644 index 0000000..b1fc154 --- /dev/null +++ b/instructions/README.md @@ -0,0 +1,14 @@ +# copy/git lcdproc to server + +cd ./lcdproc +sudo apt-get install autoconf automake make build-essential pkg-config +sudo sh autogen.sh +./configure --prefix=/usr/local --enable-drivers=all +sudo make +sudo make install + + +# LCDd.conf driverpath= whereis lcdproc +copy /LCDd.conf to /usr/local/etc/ # whereis LCDd.conf +sudo LCDd +sudo lcdproc K \ No newline at end of file diff --git a/instructions/lcdproc.conf b/instructions/lcdproc.conf new file mode 100644 index 0000000..6c7c33d --- /dev/null +++ b/instructions/lcdproc.conf @@ -0,0 +1,148 @@ +# LCDproc client configuration file + +## general options ## +[lcdproc] +# address of the LCDd server to connect to +Server=localhost + +# Port of the server to connect to +Port=13666 + +# set reporting level +ReportLevel=2 + +# report to to syslog ? +ReportToSyslog=false + +# run in foreground [default: false; legal: true, false] +#Foreground=true + +# PidFile location when running as daemon [default: /var/run/lcdproc.pid] +#PidFile=/var/run/lcdproc.pid + +# slow down initial announcement of modes (in 1/100s) +#delay=2 + +# display name for the main menu [default: LCDproc HOST] +#DisplayName=lcdproc + + +## screen specific configuration options ## + +[CPU] +# Show screen +Active=True +OnTime=1 +OffTime=2 +ShowInvisible=false + + +[Iface] +# Show screen +Active=True + +# Show stats for Interface0 +Interface0=eth0 +# Interface alias name to display [default: ] +Alias0=ETH0 + +# Show stats for Interface1 +#Interface1=eth1 +#Alias1=WAN + +# Show stats for Interface2 +#Interface2=eth2 +#Alias2=MGMT + +# for more than 3 interfaces change MAX_INTERFACES in iface.h and rebuild + +# Units to display [default: byte; legal: byte, bit, packet] +unit=byte + +# add screen with transferred traffic +#transfer=TRUE + + +[Memory] +# Show screen +Active=True + + +[Load] +# Show screen +Active=True +# Min Load Avg at which the backlight will be turned off [default: 0.05] +LowLoad=0.05 +# Max Load Avg at which the backlight will start blinking [default: 1.3] +HighLoad=1.3 + + +[TimeDate] +# Show screen +Active=True +# time format [default: %H:%M:%S; legal: see strftime(3)] +TimeFormat="%H:%M:%S" +# date format [default: %x; legal: see strftime(3)] +DateFormat="%x" + + +[About] +# Show screen +Active=true + + +[SMP-CPU] +# Show screen +Active=true + + +[OldTime] +# Show screen +Active=false +# time format [default: %H:%M:%S; legal: see strftime(3)] +TimeFormat="%H:%M:%S" +# date format [default: %x; legal: see strftime(3)] +DateFormat="%x" +# Display the title bar in two-line mode. Note that with four lines or more +# the title is always shown. [default: true; legal: true, false] +#ShowTitle=false + + +[BigClock] +# Show screen +Active=true + + +[Uptime] +# Show screen +Active=true + + +[Battery] +# Show screen +Active=false + + +[CPUGraph] +# Show screen +Active=true + + +[ProcSize] +# Show screen +Active=true + + +[Disk] +# Show screen +Active=true + + +[MiniClock] +# Show screen +Active=false +# time format [default: %H:%M; legal: see strftime(3)] +TimeFormat="%H:%M" + + +# EOF