20x4 LCD Won't Display Text

Hello,

UPDATE:

Got the LCD to work. My test LCDs had a mating PCB that affected the timing too much so I just took it off. Should have thought of it sooner but oh well. Live and learn. Thanks for anyone that helped.

I'll preface my post by saying I've looked through tons of other posts here and elsewhere regarding this issue and haven't found anything that solves my issue. If there is a post that seems to cover this situation, please point me in the right direction.

I'm struggling to find a reason why my 20x4 LCD (Crystalfontz CFAH2004L-NYG-ET) won't display text using the Arduino Liquid Crystal library. I can see two rows of black boxes and I can control display ON/OFF commands but nothing else at this point. I've tried both 4-bit and 8-bit modes as well as another display which does the same thing (one is new and one is old).

The album below will have my wiring setup. I'm following the Arduino LCD tutorial schematic (minus the backlight since I don't have one). +5V is taken from the Arduino. I can control contrast with my 10K pot. I've tested all the connections for the jumpers and the crimps are all good.

After looking through posts, it seems to may come down to a timing issue with the controller and Arduino but I'm not sure what I should be looking for if I put an O-scope on the databus lines. Even if it is a timing issue, why does the display ON/OFF command work but nothing else.

I'm at the point where I'm going to have to individually write instructions via digitalWrite() so I can test certain functions without the LCD library.

Data lines:

RS = 3
RW = GND
E = 5
D4 = 10
D5 = 11
D6 = 12
D7 = 13

Photos/Video:

Video of display ON/OFF working

Code:

Code is below. Super simple. Initialize. Print Hello. Turn Display ON and OFF

// include the library code:
#include <LiquidCrystal.h>

//LiquidCrystal lcd(rs, enable, d4, d5, d6, d7)
LiquidCrystal lcd(3, 5, 10, 11, 12, 13);

void setup() {
  
  // set up the LCD's number of columns and rows:
  lcd.begin(20, 4); 
  //Print hello
  lcd.print("Hello");
}

void loop() {
 
  // Turn off the display:
  lcd.noDisplay();
  delay(500);
  // Turn on the display:
  lcd.display();
  delay(500);

}

I've tested with another LCD as well (Orient LCD AMC2004BR-B w/ S6A0069 MPU) and both the CrystalFontz and this Orient LCD match the HD44780 controller to my knowledge. Links to datasheets for both are below

CrystalFontz LCD

Orient LCD

Any help is appreciated!

From the video, it isn't clear that the on/off command is actually working.
There does seem to be some sort of change in the pixels going on,
but if off actually worked, all the pixels would turn off.

It looks like you have a PCB under the LCD between the LCD module and the breadboard.
What is that? Does it have components on it?

BTW, EXCELLENT photos.


If you want to try a different library that offers the ability to easily tweak the timing you could try my hd44780 library.
It can be installed using the IDE library manager.
You can read more about it here: GitHub - duinoWitchery/hd44780: Extensible hd44780 LCD library

The i/o class for a LCD controlled with arduino pins is hd44780_pinIO
See/run the examples under that i/o class.
If you want to alter the timing used, you can use the setExecTimes(chUs, insUs) function.
Simply call that before you call begin().
Both arguments are in microseconds the default values being 2000 and 37
If you suspect that the LCD is slower than the hd44780 reference design, bump those values up to see if it fixes your issue.

--- bill

I'm a bit confused on which LCD you are using.
The datasheet for the CFAH2004L-NYG-ET shows 18 pins but the LCD in the photos shows 16.

--- bill

Thanks for the replies Bill!

I'm using both LCDs to test right now.

Good eye on the daughter PCB too.

I have several of these old/unused LCDs at floating around at my work that I asked to take home for this project (one new, one old). These LCDs have a display "driver" in the sense that all it really does is add level shifters for 5V to 3.3V and caps to help with timing with MCU that talks to them. The components on these boards most likely are affecting the timing (which is why I thought this in the first place) but I will desolder them tonight and try to test without these mating PCBs to be sure.

I have a new bare LCD (Orient LCD - AMC2004LBR-B) that does light up with boxes but does not blink like the others. Although admittedly, I haven't soldered these pins and my tests have been done with press fit connections. Not reliable, I know but these are logic level connections, as long as contact is made I should be ok. I will try to solder some headers on to them tonight to rule out that potential kink.

I was confused as well with the 18 vs 16 pin models. According to the datasheet, the CrystalFrontz 18 pin model has NC (no connect) for pins 15-18. The Orient LCD (16 pin) has A and K as pins 15 and 16.

Hope that clears things up.

LCD works. Bill easily suggested the extra PCB was affected the timing, which it was. Bare LCD now works happily.

Thanks again Bill!