--- /dev/null
+#!/usr/bin/python3
+# Copyright 2022 by Keith Packard <keithp@keithp.com>. GPLv3
+#
+# Program to emit PCB footprint for NHD-C12864LZ-FSW-FBW-3V3 graphic LCD
+#
+
+# dimensions in mm from NHD-C12864LZ-FSW-FBW-3V3.pdf datasheet
+BodyWidth = 77.4
+BodyHeight = 52.4
+PinDiam = 0.7
+PinSpacing = 1.27
+PinOffset = 1.05
+Pins = 28
+
+ViewWidth = 66.52
+ViewHeight = 33.24
+ViewHCtr = BodyHeight / 2 - (33.24 / 2 + 6.08)
+
+# centered pair of holes for alignment pins
+MntWidth = 72.40
+MntOffset = 3
+MntDiam = 1.6
+
+# contacts for LED backlight
+BLWidth = 60.0
+BLDiam = 1.9 # a 1.9 x 1.0 slot is called for
+BLOffset = 3.79
+
+import sys
+
+# we're going to use the 1/100 of a mil fundamental unit form
+def mm2mils100( mm ):
+ return int( mm / 25.4 * 1000.0 * 100.0 + 0.5 )
+
+print('# author: Keith Packard')
+print('# email: keithp@keithp.com')
+print('# dist-license: GPL 3')
+print('# use-license: unlimited')
+
+print('Element[0x0 "NHD-C12864LZ" "" "" 0 0 0 0 0 100 0x0]')
+print("(")
+
+# pins
+ # pin( x y thickness clearance mask drillhole name number flags)
+for pin in range (0,Pins):
+ if pin == Pins - 1:
+ Flags = '0x0101'
+ else:
+ Flags = '0x0001'
+
+ print(' Pin[',\
+ mm2mils100((13.5 - pin)*PinSpacing), \
+ mm2mils100(-BodyHeight/2+PinOffset), \
+ mm2mils100(PinDiam * 1.75), \
+ 1200, \
+ mm2mils100(PinDiam * 1.75) + 600, \
+ mm2mils100(PinDiam), \
+ '"pin%i"' % (Pins-pin), '"%i"' % (Pins-pin), Flags, ']')
+
+print(' ElementLine[',\
+ -mm2mils100(BodyWidth/2), \
+ -mm2mils100(BodyHeight/2), \
+ mm2mils100(BodyWidth/2), \
+ -mm2mils100(BodyHeight/2), \
+ 500, \
+ ']')
+print(' ElementLine[',\
+ -mm2mils100(BodyWidth/2), \
+ -mm2mils100(BodyHeight/2), \
+ -mm2mils100(BodyWidth/2), \
+ mm2mils100(BodyHeight/2), \
+ 500, \
+ ']')
+print(' ElementLine[',\
+ -mm2mils100(BodyWidth/2), \
+ mm2mils100(BodyHeight/2), \
+ mm2mils100(BodyWidth/2), \
+ mm2mils100(BodyHeight/2), \
+ 500, \
+ ']')
+print(' ElementLine[',\
+ mm2mils100(BodyWidth/2), \
+ mm2mils100(BodyHeight/2), \
+ mm2mils100(BodyWidth/2), \
+ -mm2mils100(BodyHeight/2), \
+ 500, \
+ ']')
+
+# mark viewable area
+
+print(' ElementLine[',\
+ mm2mils100(-ViewWidth/2), \
+ mm2mils100(ViewHCtr + ViewHeight/2), \
+ mm2mils100(ViewWidth/2), \
+ mm2mils100(ViewHCtr + ViewHeight/2), \
+ 500, \
+ ']')
+
+print(' ElementLine[',\
+ mm2mils100(-ViewWidth/2), \
+ mm2mils100(ViewHCtr - ViewHeight/2), \
+ mm2mils100(ViewWidth/2), \
+ mm2mils100(ViewHCtr - ViewHeight/2), \
+ 500, \
+ ']')
+
+print(' ElementLine[',\
+ mm2mils100(-ViewWidth/2), \
+ mm2mils100(ViewHCtr - ViewHeight/2), \
+ mm2mils100(-ViewWidth/2), \
+ mm2mils100(ViewHCtr + ViewHeight/2), \
+ 500, \
+ ']')
+
+print(' ElementLine[',\
+ mm2mils100(ViewWidth/2), \
+ mm2mils100(ViewHCtr - ViewHeight/2), \
+ mm2mils100(ViewWidth/2), \
+ mm2mils100(ViewHCtr + ViewHeight/2), \
+ 500, \
+ ']')
+
+print(' ElementLine[',\
+ mm2mils100(ViewWidth/2), \
+ mm2mils100(ViewHCtr - ViewHeight/2), \
+ mm2mils100(-ViewWidth/2), \
+ mm2mils100(ViewHCtr + ViewHeight/2), \
+ 500, \
+ ']')
+
+print(' ElementLine[',\
+ mm2mils100(-ViewWidth/2), \
+ mm2mils100(ViewHCtr - ViewHeight/2), \
+ mm2mils100(ViewWidth/2), \
+ mm2mils100(ViewHCtr + ViewHeight/2), \
+ 500, \
+ ']')
+
+# holes for alignment pins
+print(' Pin[',\
+ mm2mils100(MntWidth/2), \
+ mm2mils100(-BodyHeight / 2 + MntOffset), \
+ mm2mils100(MntDiam * 1.75), \
+ 1200, \
+ mm2mils100(MntDiam * 1.75) + 600, \
+ mm2mils100(MntDiam), \
+ '"G"', '"G"', '0x0001', ']')
+
+print(' Pin[',\
+ mm2mils100(-MntWidth/2), \
+ mm2mils100(-BodyHeight / 2 + MntOffset), \
+ mm2mils100(MntDiam * 1.75), \
+ 1200, \
+ mm2mils100(MntDiam * 1.75) + 600, \
+ mm2mils100(MntDiam), \
+ '"G"', '"G"', '0x0001', ']')
+
+# backlight pins
+print(' Pin[',\
+ mm2mils100(-BLWidth/2), \
+ mm2mils100(-BodyHeight/2+BLOffset), \
+ mm2mils100(BLDiam * 1.75), \
+ 1200, \
+ mm2mils100(BLDiam * 1.75) + 600, \
+ mm2mils100(BLDiam), \
+ '"K"', '"K"', '0x0001', ']')
+
+print(' Pin[',\
+ mm2mils100(BLWidth/2), \
+ mm2mils100(-BodyHeight/2+BLOffset), \
+ mm2mils100(BLDiam * 1.75), \
+ 1200, \
+ mm2mils100(BLDiam * 1.75) + 600, \
+ mm2mils100(BLDiam), \
+ '"A"', '"A"', '0x0001', ']')
+
+print(")")
--- /dev/null
+v 20220529 2
+T 0 1300 8 10 1 1 0 0 1
+refdes=X?
+T 0 1750 5 10 0 0 0 0 1
+device=LCD
+T 0 1550 5 10 0 0 0 0 1
+footprint=NHD-C12864LZ
+P 200 0 200 300 1 0 0
+{
+T 150 200 5 8 1 1 90 6 1
+pinnumber=1
+T 200 350 9 8 1 1 90 0 1
+pinlabel=/CS1
+T 350 300 5 10 0 1 90 0 1
+pintype=in
+}
+P 600 0 600 300 1 0 0
+{
+T 550 200 5 8 1 1 90 6 1
+pinnumber=2
+T 600 350 9 8 1 1 90 0 1
+pinlabel=/RES
+T 600 350 5 8 0 1 90 2 1
+pintype=in
+}
+P 1400 0 1400 300 1 0 0
+{
+T 1350 200 5 8 1 1 90 6 1
+pinnumber=4
+T 1400 350 9 8 1 1 90 0 1
+pinlabel=/WR
+T 1400 350 5 8 0 1 90 2 1
+pintype=in
+}
+P 1000 0 1000 300 1 0 0
+{
+T 950 200 5 8 1 1 90 6 1
+pinnumber=3
+T 1000 350 9 8 1 1 90 0 1
+pinlabel=A0
+T 1000 350 5 8 0 1 90 2 1
+pintype=in
+}
+P 2200 0 2200 300 1 0 0
+{
+T 2150 200 5 8 1 1 90 6 1
+pinnumber=6
+T 2200 350 9 8 1 1 90 0 1
+pinlabel=DB0
+T 2200 350 5 8 0 1 90 2 1
+pintype=in
+}
+P 2600 0 2600 300 1 0 0
+{
+T 2550 200 5 8 1 1 90 6 1
+pinnumber=7
+T 2600 350 9 8 1 1 90 0 1
+pinlabel=DB1
+T 2600 350 5 8 0 1 90 2 1
+pintype=in
+}
+P 3000 0 3000 300 1 0 0
+{
+T 2950 200 5 8 1 1 90 6 1
+pinnumber=8
+T 3000 350 9 8 1 1 90 0 1
+pinlabel=DB2
+T 3000 350 5 8 0 1 90 2 1
+pintype=in
+}
+P 3400 0 3400 300 1 0 0
+{
+T 3350 200 5 8 1 1 90 6 1
+pinnumber=9
+T 3400 350 9 8 1 1 90 0 1
+pinlabel=DB3
+T 3400 350 5 8 0 1 90 2 1
+pintype=in
+}
+P 3800 0 3800 300 1 0 0
+{
+T 3750 200 5 8 1 1 90 6 1
+pinnumber=10
+T 3800 350 9 8 1 1 90 0 1
+pinlabel=DB4
+T 3800 350 5 8 0 1 90 2 1
+pintype=in
+}
+P 11400 0 11400 300 1 0 0
+{
+T 11350 200 5 8 1 1 90 6 1
+pinnumber=A
+T 11400 350 9 8 1 1 90 0 1
+pinlabel=Anode
+T 11400 350 5 8 0 1 90 2 1
+pintype=pwr
+}
+P 11800 0 11800 300 1 0 0
+{
+T 11750 200 5 8 1 1 90 6 1
+pinnumber=K
+T 11800 350 9 8 1 1 90 0 1
+pinlabel=Cathode
+T 11800 350 5 8 0 1 90 2 1
+pintype=pwr
+}
+B 0 300 12000 900 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+T 0 1950 5 10 0 0 0 0 1
+use-license=unlimited
+T 0 2150 5 10 0 0 0 0 1
+dist-license=GPL3
+T 0 2350 5 10 0 0 0 0 1
+author=Keith Packard <keithp@keithp.com>
+T 0 2550 5 10 0 0 0 0 1
+datasheet=newhaven/NHD-C12864LZ-FSW-FBW-3V3.pdf
+T 4800 1250 9 10 1 0 0 6 1
+NHD 128x64 pixel COG LCD Module
+P 1800 0 1800 300 1 0 0
+{
+T 1750 200 5 8 1 1 90 6 1
+pinnumber=5
+T 1800 350 9 8 1 1 90 0 1
+pinlabel=/RD
+T 1800 350 5 8 0 1 90 2 1
+pintype=in
+}
+P 4200 0 4200 300 1 0 0
+{
+T 4150 200 5 8 1 1 90 6 1
+pinnumber=11
+T 4200 350 9 8 1 1 90 0 1
+pinlabel=DB5
+T 4350 300 5 10 0 1 90 0 1
+pintype=in
+}
+P 4600 0 4600 300 1 0 0
+{
+T 4550 200 5 8 1 1 90 6 1
+pinnumber=12
+T 4600 350 9 8 1 1 90 0 1
+pinlabel=DB6/SCL
+T 4750 300 5 10 0 1 90 0 1
+pintype=in
+}
+P 5400 0 5400 300 1 0 0
+{
+T 5400 350 5 8 0 1 90 2 1
+pintype=pwr
+T 5350 200 5 8 1 1 90 6 1
+pinnumber=14
+T 5400 350 9 8 1 1 90 0 1
+pinlabel=VCC
+}
+P 5000 0 5000 300 1 0 0
+{
+T 5000 350 5 8 0 1 90 2 1
+pintype=in
+T 4950 200 5 8 1 1 90 6 1
+pinnumber=13
+T 5100 350 9 8 1 1 90 0 1
+pinlabel=DB7/SI
+}
+P 6200 0 6200 300 1 0 0
+{
+T 6200 350 5 8 0 1 90 2 1
+pintype=pas
+T 6150 200 5 8 1 1 90 6 1
+pinnumber=16
+T 6200 350 9 8 1 1 90 0 1
+pinlabel=VOUT
+}
+P 6600 0 6600 300 1 0 0
+{
+T 6600 350 5 8 0 1 90 2 1
+pintype=pas
+T 6550 200 5 8 1 1 90 6 1
+pinnumber=17
+T 6600 350 9 8 1 1 90 0 1
+pinlabel=CAP3+
+}
+P 5800 0 5800 300 1 0 0
+{
+T 5800 350 5 8 0 1 90 2 1
+pintype=pwr
+T 5750 200 5 8 1 1 90 6 1
+pinnumber=15
+T 5800 350 9 8 1 1 90 0 1
+pinlabel=GND
+}
+P 7000 0 7000 300 1 0 0
+{
+T 7000 350 5 8 0 1 90 2 1
+pintype=pas
+T 6950 200 5 8 1 1 90 6 1
+pinnumber=18
+T 7000 350 9 8 1 1 90 0 1
+pinlabel=CAP1-
+}
+P 7400 0 7400 300 1 0 0
+{
+T 7400 350 5 8 0 1 90 2 1
+pintype=pas
+T 7350 200 5 8 1 1 90 6 1
+pinnumber=19
+T 7400 350 9 8 1 1 90 0 1
+pinlabel=CAP1+
+}
+P 7800 0 7800 300 1 0 0
+{
+T 7800 350 5 8 0 1 90 2 1
+pintype=pas
+T 7750 200 5 8 1 1 90 6 1
+pinnumber=20
+T 7800 350 9 8 1 1 90 0 1
+pinlabel=CAP2+
+}
+P 8200 0 8200 300 1 0 0
+{
+T 8200 350 5 8 0 1 90 2 1
+pintype=pas
+T 8150 200 5 8 1 1 90 6 1
+pinnumber=21
+T 8200 350 9 8 1 1 90 0 1
+pinlabel=CAP2-
+}
+P 8600 0 8600 300 1 0 0
+{
+T 8750 300 5 10 0 1 90 0 1
+pintype=pas
+T 8550 200 5 8 1 1 90 6 1
+pinnumber=22
+T 8600 350 9 8 1 1 90 0 1
+pinlabel=V4
+}
+P 9000 0 9000 300 1 0 0
+{
+T 9150 300 5 10 0 1 90 0 1
+pintype=pas
+T 8950 200 5 8 1 1 90 6 1
+pinnumber=23
+T 9000 350 9 8 1 1 90 0 1
+pinlabel=V3
+}
+P 9800 0 9800 300 1 0 0
+{
+T 9800 350 5 8 0 1 90 2 1
+pintype=pas
+T 9750 200 5 8 1 1 90 6 1
+pinnumber=25
+T 9800 350 9 8 1 1 90 0 1
+pinlabel=V1
+}
+P 9400 0 9400 300 1 0 0
+{
+T 9400 350 5 8 0 1 90 2 1
+pintype=pas
+T 9350 200 5 8 1 1 90 6 1
+pinnumber=24
+T 9400 350 9 8 1 1 90 0 1
+pinlabel=V2
+}
+P 10600 0 10600 300 1 0 0
+{
+T 10600 350 5 8 0 1 90 2 1
+pintype=in
+T 10550 200 5 8 1 1 90 6 1
+pinnumber=27
+T 10600 350 9 8 1 1 90 0 1
+pinlabel=C86
+}
+P 11000 0 11000 300 1 0 0
+{
+T 11000 350 5 8 0 1 90 2 1
+pintype=in
+T 10950 200 5 8 1 1 90 6 1
+pinnumber=28
+T 11000 350 9 8 1 1 90 0 1
+pinlabel=PS
+}
+P 10200 0 10200 300 1 0 0
+{
+T 10200 350 5 8 0 1 90 2 1
+pintype=pas
+T 10150 200 5 8 1 1 90 6 1
+pinnumber=26
+T 10200 350 9 8 1 1 90 0 1
+pinlabel=V0
+}