New LiquidCrystal library - LCD library

m12lrpv:
There is nothing complicated in what I have posted. It's pretty simple and straight forward and requires no second guessing of my intent.

I don't wish to disagree with you, but I'm not clear what you're after either. I do not think it's clear or straight forward.

Iain

To someone who understands the code segment and functionality that I spoke about it should be quite clear.

I am not here to explain the inner workings of I2C and LCD's to people who just want to argue.
:roll_eyes:

Let me google that for you

m12lrpv:
To someone who understands the code segment and functionality that I spoke about it should be quite clear.

I am not here to explain the inner workings of I2C and LCD's to people who just want to argue.
:roll_eyes:

Let me google that for you

Ah, i see we have a smart ass on our hands.

First, before this post, you never posted any code, any code segments, nor any links to any code.
You only babbled about masks and some not completely clear statements that possibly
could be interpreted as the desire for negative logic to control the backlight circuitry.

2nd what you were talking about has absolutely NOTHING to do with I2C it has to do with setting output pins
to control the backlight circuitry and even that doesn't really have anything to do with LCDs.

3rd, when modifying multi layer API interfaces for these kinds of bit twiddling control,
the changes can have implications beyond just the i2c device layer. The same modifications
can apply to the other interfaces as well which means it should be handled in a generic/common way.
So your thinking about just ic2 expander output bits is way too narrow.

Well after looking at the attiny85 code you so graciously finally provided a link to above, which has nothing to do with fm's code,
I can see that the tiny85 code that you are looking at hard codes the backlight control to bit 7 as well as
uses negative logic for backlight control.

Without seeing actual code, there was no way to know for sure what you were babbling about in your previous posts.

fm's code already allows using any bit for backlight control but presumes positive logic.

So what you were really wanting all this time but were unable to verbalize in a way that
was pretty simple and straight forward and requires no second guessing of your intent
was that you were wanting support for negative logic for backlight control.

Gee, it would have been so much simpler if you would have just come right out and said
that is what you wanted/needed, especially since I even asked if that was what you wanted.

--- bill

Hi Bill, thanks for the hints you've posted. I have noted them down for library improvements on coming versions.

@m12lrpv - I think that we are talking about different libraries. In this particular case (for the New LiquidCrystal), the library, in its I2C configuration does support three main class constructors: only address, address + EN, RS, RW, address + EN, RS, RW + Di (i=1..4).
As for negative logic control, with the current methods it is possible but on the code it will look strange: setBackligh (LOW) -> will change to 0, will switch on the light. setBacklight (HIGH) -> will change to 255, will set the backlight off.

What I posted (the masks) made it very obvious it just lacked your supercilious jargon requirement.

What I had to put up with for someone attempting to contribute something useful is quite frankly disgraceful. A good lesson for others I think.

fm:
As for negative logic control, with the current methods it is possible but on the code it will look strange: setBackligh (LOW) -> will change to 0, will switch on

Hence my post.

To someone who has such a device in their parts box they will have to change their code (rather than their initialisation) in order to switch displays.

I thought that such a suggestion would enable this library to comply better with this goal

fm:

  • Your projects can swap in and out LCDs that use an IO expander board, you are not constraint by library availability with different APIs.

I thought wrong.

I will depart and our friend Bill can live with his smug superiority.

Hi Francisco
Thanks very much for your hard work and this awesome library! I successfully got it working with a Shift Register in 2 and 3 wire mode (totally awesome). I've read back through this post a bit and it seems that you have implemented some backlight control for the i2c expander. Is this possible with the _SR class? The schematics posted in the hardware section don't show which pin of the Shift Register to control the backlight.

Ok, i just had a sneak peak at your RC5 and it looks like you're working on the documentation as we speak, so I'll wait for that.
Thanks again!

You are very welcome, and I am glad that you liked it.

It is not only me working on the library, there has also been the invaluable contribution of bperrybap whose made a significant contribution speeding the library even further, reviewing making suggestions since it started and picasso who was the original tester of the SR library and wrote the fastIO routines.

As for backlight control, it will be added shortly in the schematic section for those LCD drivers that support it. It is still under development and new drivers will be added in the future. I also want to rework a bit the wiki to make it easier to identify what schematic to use for each class and how to create the associated lcd object.

Thanks again for using it and enjoy it.

Thanks Bill! Thanks picasso! Superb work.

Real nice job... my thanks to everyone involved...

Just in case I got it wrong, I best ask... what's the procedure for adding the new version of the library...

@MikeOTool, simply copy the contents of the zip file into the LiquidCrystal library folder of the Arduino IDE. It would be good to copy the LiquidCrystal original files somewhere else for safe keeping and fallback if you need it.

Cheers and enjoy it.

Thanks, taught as much so that's what I did...

Running the test code resulted in two errors ('class LiquidCrystal' has no member named 'setBacklightPin' and 'class LiquidCrystal' has no member named 'setBacklight') so I posted the above...

To continue testing, I commented these out and everything worked fine... now I juts need to fix these...
Mike

Ummm, I'll review the code, but I am fairly sure that the librarwy does support it.

There is one thing that comes to mind, have you removed the old LiquidCrystal library?

I've been looking at the source under rel 1.2.1 and those methods are there, both in the header file and in the c file. So, there are two options, the old LiquidCrystal header file is still there or the zip file of version 1.2.0 in the download section is not correct.

Do let me know to see if I have to fix it, but no one else has raise the problem.

Thanks for that... no problem it should be a breeze to fix... (seems I said that a little quickly ;))

Update...
Assuming it was still loading the old header files (even though I had renamed the folder), I decided to remove it completely and of course it was...
When I tried to compile it reported it could not find the header file... I closed the Arduino console and restarted it... loaded the test code and it compiled perfectly....

The example files work now but the code I was working on (MyHelloWorld_4bit.ino) appears to have been turned into a binary file...
Is it possible the Arduino console compiled MyHelloWorld_4bit.ino and saved it overwriting my file?
Mike

Thanks fm, bperrybap and others for developing this library.

I've installed it and in preparation to begin working my way through its capabilities I tested my IDE 1.0 installation of the new Library with a number of the original LiquidCrystal examples. All worked fine until I struck an odd overload compile error with the Custom Characters sketch.

/*
  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 <heart> 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
 
 created21 Mar 2011
 by Tom Igoe
 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 <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// 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() {
  // 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);  

  // set up the lcd's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the lcd.
  lcd.print("I "); 
  lcd.write(0);
  lcd.print(" Arduino! ");
  lcd.write(1);

}

void loop() {
  // set the cursor to the bottom row, 5th position:
  lcd.setCursor(4, 1);
  // draw the little man, arms down:
  lcd.write(3);
  delay(500);
  lcd.setCursor(4, 1);
  // draw him arms up:
  lcd.write(4);
  delay(500);
}

I get the following compile error which I do not have the Arduino knowledge to resolve:

CustomCharacter.cpp: In function 'void setup()':
CustomCharacter:114: error: call of overloaded 'write(int)' is ambiguous
/Applications/Arduino.app/Contents/Resources/Java/libraries/LiquidCrystal/LCD.h:479: note: candidates are: virtual size_t LCD::write(uint8_t)
/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print.h:49: note: size_t Print::write(const char*)

Umm, everything is possible with SW, but that is a bit odd.

@dweston - did you remove the old library, not just moving it somewhere else. There is an example in the New LiquidCrystal library that uses the creation of custom characters, helloworld_4bit. Give that a shot.

@dweston - the other thing you can do is to change the byte declaration of the character creation variable by int8_t. This should fix it by not having ambiguities in the call.

@fm I followed your advice at Reply #80 "simply copy the contents of the zip file into the LiquidCrystal library folder of the Arduino IDE." The library folder I presumed you mean is the one within the Arduino.app contents package (I'm using MacOSX) i.e. [/Applications/Arduino.app/Contents/Resources/Java/libraries/LiquidCrystal/].

Pardon the embarrassment of my naivety but I don't know how to apply your suggested "change the byte declaration of the character creation variable by int8_t"?

The example "helloworld_4bit" works fine, although I noted a spelling error in line 8:

LiquidCrystal lcd(8, 9, 4, 5, 6, 7, BACKLIGH_PIN, POSITIVE );

should read:

LiquidCrystal lcd(8, 9, 4, 5, 6, 7, BACKLIGHT_PIN, POSITIVE );

The pin number changes reflect the DFRobot-007 LCD Keypad shield I'm using.

dweston,
I want to stress DO NOT use the backlight control on the DFRrobot-007 LCD keypad shield.
That board as a hardware design issue and if you set D10 to high,
it creates a short from D10 to ground.
See this thread for details:
http://arduino.cc/forum/index.php/topic,96747.0.html

In the mean time I'll go off and test the latest zip file ( LiquidCrystal_v1.2.0.zip) with Arduino 1.0.
I've not seen the issue you are seeing, but lately I've only been running
the pre-release version of the library. I'll go try a bone stock Arduino 1.0
with the library from the latest zip and see if there is an issue.

--- bill

Update:
I have downloaded LiquidCrystal_v1.2.0.zip ( https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/LiquidCrystal_v1.2.0.zip )
and used it to replace the LiquidCrystal library in bone stock download of the Arduino 1.0 IDE.
All the included example sketches compile without issue.

In looking closer at the example sketch that got the errors, (should have seen this earlier),
that sketch will not compile with the standard Arduino 1.0
It is a pre 1.0 sketch.
0 (zero) is an ambiguous type in C.
The Arduino Print class use C++ overloading and the Arduino team did not include enough functions
in Arduino 1.0 to catch zero. This is an Arduino library issue. It is easily fixed by either modifying the print class
(which is what Teensyduino has done for the teensy boards) or you can modify your sketch.

To modify your sketch you must type case zero.
So things like:

  lcd.write(0);

need to be:

  lcd.write((char)0);

or

  lcd.print((char)0);

All the examples that come with the new library like Hello_World_4bit.ino have this modification
already in them.

--- bill