Back in 1998 or so, I wrote a CD player application for Microsoft Windows in Borland Delphi. It was for a magazine tutorial article, and I wanted a cool LCD-like display to show track elapsed and remaining time. There was a good one available for Delphi, called LCDLabel, written by Peter Czidlina (if you’re reading this, thanks once more for your cooperation).
I’ve been thinking about doing a modern version of the LCD display component for several times over the years, and I even got pretty far with one for OS X in 2010, but then abandoned it because of other projects. A few years ago I did some experiments with the LCD font file and wrote a small Python app to test it.
My most recent idea involving simulated LCD displays is to create a custom component for iOS and OS X in Swift. For that, I dug up the most recent Python project and tried to nail down the LCD font file format, so that I could later use it in Swift. I decided to use JSON.
The LCD font consists of character matrices, typically 5 columns by 7 rows, each describing a character on the LCD panel. The value of a matrix cell is one if the dot should be on, and zero if it should be off. I decided to store each cell value as an integer, even if it is a bit wasteful – but it is easy to maintain, and if you squint a bit, you can see the shape of the LCD character.
So the digit zero would be represented as a 2-dimensional matrix like this:
The font consists of as many characters as you like, but you need to identify them somehow. In JSON, you can do this with one-character strings, where the sole character is the Unicode code point of the character. So, with some additional useful information, a font with just the numeric digits 0, 1, and 2 would be represented in JSON like this:
With the font coming along nicely, I wrote a Python script to exercise it, by printing a banner-like message:
mats = 
for ch in message:
output = ''
num_rows = len(mats)
num_cols = len(mats)
for r in range(0, num_rows):
for m in mats:
for c in range(0, num_cols):
if m[r] == 1:
output += 'X'
output += '.'
output += ' '
output += '\n'
font_data = None
with open('lcd-font-hitachi.json') as json_file:
font_data = json.load(json_file)
characters = font_data['characters']
Running this Python script would print out a banner like this one: