I recently got a cheap 20×4 LCD module on ebay and started playing around with it this weekend. Of course, given that I paid less than 5 pounds for it (incl. shipping from China) it came with no documentation or other information, but I hadn’t expected any. Since most LCD modules use the same protocol as the ubiquitous Hitachi HD44780 controller, that was my first line of attack. However, all of my attempts to initialize the display via the standard HD44780 procedures failed. After a bit of searching I found this site (in German, Google translation here). Towards the bottom of this page the author mentions a few methods of identifying an unknown display, and more importantly, a number of alternative controller chips that are being used and some of their known quirks. I downloaded the datasheets of those controllers and started to take a look.
One thing that’s noticeably different between the chips is their pinout. This, I thought, might be another way of identifying the controller. The Samsung KS0066U and the Sitronix ST7066U have identical pinouts, but the Samsung KS0073 is different, and the Sitronix ST7036 has an entirely different shape and more pins.
The backside of my LCD module looks like this:
The pins on the top are (from right!), 1 = GND, 2 = VDD, 3=V0, 4=RS, 5=RW, 6=E, 7-14 = DB0-7, 14=LEDA, 15=LEDK. Given its proximity to the pins, the device named U1 is most likely the main controller, so let’s take a closer look!
In this image, I labelled the vias which connect directly to the pins above. What’s immediately clear is that RS, RW, E and the data bus lines seem to connect directly to the chip in a straight forward, anti-clockwise manner. Clockwise from RS there are two unknown traces, followed by a connection to VDD (the thick trace), two more unknown traces, and then a number of traces that connect to the 5 identical 2.2k resistors and to V0 at the top, and VDD at the bottom. The next two traces connect to a 91k resistor labelled RF, and trace next to it connects to the ground plane. If we compare this to the pinout of the KS0066U, for instance, we will notice that the arrangement of the traces would match the arrangement of the traces almost perfectly:
RS, RW and E are pads 36-38, DB0 to DB7 are pads 39-46. The two unknown pads next to RS are D (35) and M (34), followed by VDD, two pads labelled CLK1 and CLK2, 5 pads labelled V5 through V1, and then two pads OSC1 and OSC2 (pads 24 and 25). Lastly, pad 23 is a GND pad. The order of the pins therefore seems to match well onto the traces on the module. One apparent inconsistency however is that, according to the traces, DB0-DB2 should be on one side of the IC, and DB3-DB7 on the other, while according to the pinout only DB0 and DB1 are on the same side and DB2 is already on the other side with the rest of the data pins. While it’s not 100% sure that my controller is a KS0066U or a ST7066U it seems to be at least very close to it in design. And once I tried the initialization described in the KS0066U datasheet my module started to work just fine.
One thing I want to do, now that I know a little bit more about the controller, is change the “RF” resistor. The module is sold as a 5V supply voltage device, but the datasheet says it works from lower voltages as well, which I would prefer to use (as I plan to use the display either with my STM32F4-Discovery, or a TI MSP430). It already works with only a 3.3V supply voltage, but the data sheet recommends a 75k resistor between the oscillator pins instead of the 91k resistor currently installed when running it below 4.5V. However, before I do that I think I want to actually do some measurements before and after to see what changes.