Solution found: LCD 20X4 Display Problem - Only top two lines display characters

Thank you for your helpful responses. They were key in helping me to identify the problem. The comment on the "zebra strip compression" led me to the solution. The problem was caused by the LCD polarizing filter peeling up in one area from its base. (definitely a manufacturing problem) The filter needed to be glued back down flush to repair the LCD.

For anybody interested, here is the long answer with the steps that corrected the issue for me:

  1. Connect LCD to Arduino and upload a test script that displays characters in every location. These characters will help in the troubleshooting.
  2. I applied slight squeezing pressure to all sides of the metal bezel while the LCD was connected to the arduino and found that I could cause the problem to lessen or greater by pressing in certain spots. However the problem would not entirely go away and random unwanted boxes would still appear in some places while good characters would disappear in other places.
  3. Remove the LCD from the Arduino to allow for LCD disassemble.
  4. I removed the bezel all together with a pair of needle nose pliers. Gently twist the metal holders on the underside until they aline with 8 slots they go through. This may be different for other LCD models. I am using the 20x4 J204A.
  5. Gently and evenly lift the metal cover from the circuit board. Apply even pressure to the underside of the metal pegs to press the cover off from underneath.
  6. Once the metal cover is off, reconnect LCD to Arduino.
  7. Repeat step 2 by applying slight pressure to top and sides of lcd glass and zebra strips and take note of any changes to the LCD characters. I almost gave up here because the problem always seemed to reappear in the same place (lower right portion of the LCD screen) no matter what I tried. Since the LCD was destined for scrap anyway I continued and found the solution next.
  8. Disconnect the LCD from the Arduino and gently remove the LCD with the zebra strip pads from the circuit board. I was able to leave the zebra strips attached to the LCD glass and remove the pads from the circuit board.
  9. With the LCD removed you can now see the top polarizing filter (the white paper-like rectangle) . This is an extremely important component of the LCD. See the video at Building a liquid crystal display (LCD) - YouTube to learn more.
  10. PROBLEM LOCATED HERE* The top polarizing filter was lifting up in the lower portion which is exactly where I was noticing the problem. This polarizing filter must be firmly attached to the base for it to properly orient the light waves and display characters on the LCD.
  11. I needed to secure the LCD polarizing filter back in place to prevent it from lifting up. I used a small straight edge to press the polarizing filter back in place. With very tiny amounts of hobby glue (similar to Super Glue) I reattached the filter to base. It is important to ensure that the glue does not get underneath or on top of the polarizing filter because the glue can cause polarization interference. Instead, use small amounts of glue from the sides of the polarizing lens.
  12. With the glue dry, remove the straight edge and reattach the LCD to the circuit board. It may be a little tricky to realign the zebra pads and so it is useful to attach the circuit board back to the Arduino and ensure the characters are displayed correctly when pressing down in the right places. I glued small rubber pads to the sides of the circuit board that rested against the zebra pads when they were in the correct position. This helped me to realign the LCD if I jarred it out of place.
  13. Remove the LCD from the Arduino and carefully secure the metal cover to the circuit board and adjust how much downward pressure the metal plate applies to the LCD glass. . It took about 15 minutes of trial and error to get the pressure right with needle nose pliers. I had to reconnect the LCD to the Arduino several times during this process.
  14. Done. Now my LCD works perfectly again.