A while ago I purchased a CFA533 TTL level serial LCD board from Crystalfontz for use with a project. The board has a 16×2 character LCD and 6 buttons with plastic pads arranged in a Dpad pattern. The unit talks serial at 19200 baud. I am ramping up for a new project so I decided to see what this little unit could do and how easy the command set is. The first order of business was to connect to the unit. I am not a fan of stripping tiny wires and soldering to headers, so I thought I would turn to the trusty CNC and make an adapter board. The LCD has a 5×2 header, takes 3.3v-5v, and since it is TTL it needs to interface with some serial adapter. I have a 5v FTDI 232R USB cable that would fit the bill for this, I also dug out some 10 pin ribbon cable, as well as numerous 5v wall transformers with 2.1mm barrel jacks. The board I came up with it pretty simple, 5V, GND, RX, TX all on a 2cmx3cm board.
The next step was to get it chatting with some software. I had some python code that was used a few weeks ago to talk to a PIC via serial so I thought I would modify that to talk the LCD protocol. The protocol is pretty simple, 1 byte for type/command, 1 byte for length, variable data payload and a 2 byte CRC16. The stumbling block came when I tried to compute the CRC16 for some commands. Python has always been a language where you could “import xxxx” and it just works, not so much with CRCs. The datasheet for the LCD says the polynominal used is 0x8408, I tried to use crcmod to define a generator however I kept getting errors about it being too short. Long story short, it appears that Crystalfontz is using a CRC that isn’t very common, so I took the example C in the LCD datasheet and made a simple python function which did the trick. I wanted to write this post so anyone else looking for this CRC could use it.
The final result is a quick command utility that allows python to control almost anything on the LCD.I also got the python running on a Raspberry Pi with pyserial installed. Here are some pictures of the effort as well as the Python code. py_basic_term.py