gokul/six-digit-logic-clock
This code defines the physical layout and schematic connections for a multi-layer PCB featuring components like RTC modules (DS3231MZ), microcontroller (ATMEGA328P), LED display driver (MAX7219), and various passive and discrete components, with detailed footprints, pinouts, and placement for a clock and control interface.
- Version
- 0.1.2
- License
- unset
- Stars
- 0
index.circuit.tsx
PCB
Schematic
import { FJ3191AH } from "./imports/c44296"
import { YTSPS_22E58LM } from "./imports/c2941005"
const segments = ["A", "B", "C", "D", "E", "F", "G"] as const
const jlc = (partNumber: string) => ({ jlcpcb: [partNumber] })
const digits = [
{ display: "DS1", role: "H10", x: -47.5, bcd: "H10" },
{ display: "DS2", role: "H1", x: -32.5, bcd: "H1" },
{ display: "DS3", role: "M10", x: -7.5, bcd: "M10" },
{ display: "DS4", role: "M1", x: 7.5, bcd: "M1" },
{ display: "DS5", role: "S10", x: 32.5, bcd: "S10" },
{ display: "DS6", role: "S1", x: 47.5, bcd: "S1" },
] as const
const digitSchPositionByRole = {
H10: { x: -8, y: 4 }, H1: { x: -8, y: -4 },
M10: { x: 0, y: 4 }, M1: { x: 0, y: -4 },
S10: { x: 8, y: 4 }, S1: { x: 8, y: -4 },
} as const
const decoderPinLabels = {
pin1: ["B"], pin2: ["C"], pin3: ["LT_N"], pin4: ["BI_N"],
pin5: ["LE"], pin6: ["D"], pin7: ["A"], pin8: ["GND"],
pin9: ["SEG_E"], pin10: ["SEG_D"], pin11: ["SEG_C"], pin12: ["SEG_B"],
pin13: ["SEG_A"], pin14: ["SEG_G"], pin15: ["SEG_F"], pin16: ["VCC"],
} as const
function DisplayDigit({ display, role, x, bcd }: (typeof digits)[number]) {
const resistorX = [x - 4.5, x - 1.5, x + 1.5, x + 4.5]
const decoderConnections = {
A: "net." + bcd + "_A", B: "net." + bcd + "_B",
C: "net." + bcd + "_C", D: "net." + bcd + "_D",
LT_N: "net.VLOGIC", BI_N: "net.VLOGIC", LE: "net.GND",
GND: "net.GND", VCC: "net.VLOGIC",
SEG_A: "net." + display + "_RAW_A", SEG_B: "net." + display + "_RAW_B",
SEG_C: "net." + display + "_RAW_C", SEG_D: "net." + display + "_RAW_D",
SEG_E: "net." + display + "_RAW_E", SEG_F: "net." + display + "_RAW_F",
SEG_G: "net." + display + "_RAW_G",
}
return (
<>
<FJ3191AH
name={display}
pcbX={x}
pcbY={0}
pcbRotation="270deg"
schX={digitSchPositionByRole[role].x}
schY={digitSchPositionByRole[role].y}
schSheetName="display_digits"
noConnect={["dp"]}
connections={{
GND1: "net.GND", GND2: "net.GND",
a: "net." + display + "_A", b: "net." + display + "_B",
c: "net." + display + "_C", d: "net." + display + "_D",
e: "net." + display + "_E", f: "net." + display + "_F",
g: "net." + display + "_G",
}}
/>
<chip
name={"U_DEC_" + display}
manufacturerPartNumber="CD74HC4511M"
supplierPartNumbers={jlc("C507225")}
footprint="soic16"
pinLabels={decoderPinLabels}
pcbX={x}
pcbY={8}
layer="bottom"
schX={digitSchPositionByRole[role].x}
schY={digitSchPositionByRole[role].y - 6}
schSheetName="display_decoders"
connections={decoderConnections}
/>
{segments.map((segment, index) => (
<resistor
key={display + "-" + segment}
name={"R_" + display + "_" + segment}
resistance="1kohm"
supplierPartNumbers={jlc("C21190")}
footprint="0603"
pcbX={resistorX[index % 4]}
pcbY={index < 4 ? 12 : -12}
layer="top"
schX={digitSchPositionByRole[role].x + index * 0.65 - 2}
schY={digitSchPositionByRole[role].y - 2}
schSheetName="display_decoders"
connections={{ pin1: "net." + display + "_RAW_" + segment, pin2: "net." + display + "_" + segment }}
/>
))}
</>
)
}
const counterPinLabels = {
pin1: ["C1_CLK0"], pin2: ["C1_RESET"], pin3: ["C1_Q0"], pin4: ["C1_Q3"],
pin5: ["C1_Q2"], pin6: ["C1_Q1"], pin7: ["GND"], pin8: ["C2_Q1"],
pin9: ["C2_Q2"], pin10: ["C2_Q3"], pin11: ["C2_Q0"], pin12: ["C2_RESET"],
pin13: ["C2_CLK0"], pin14: ["C2_CLK1"], pin15: ["VCC"], pin16: ["C1_CLK1"],
} as const
const andPinLabels = {
pin1: ["1A"], pin2: ["1B"], pin3: ["1Y"], pin4: ["2A"], pin5: ["2B"], pin6: ["2Y"],
pin7: ["GND"], pin8: ["3Y"], pin9: ["3A"], pin10: ["3B"], pin11: ["4Y"],
pin12: ["4A"], pin13: ["4B"], pin14: ["VCC"],
} as const
const orPinLabels = andPinLabels
const schmittPinLabels = {
pin1: ["1A"], pin2: ["1Y"], pin3: ["2A"], pin4: ["2Y"], pin5: ["3A"], pin6: ["3Y"],
pin7: ["GND"], pin8: ["4Y"], pin9: ["4A"], pin10: ["5Y"], pin11: ["5A"],
pin12: ["6Y"], pin13: ["6A"], pin14: ["VCC"],
} as const
const oscPinLabels = {
pin1: ["Q12"], pin2: ["Q13"], pin3: ["Q14"], pin4: ["Q6"],
pin5: ["Q5"], pin6: ["Q7"], pin7: ["Q4"], pin8: ["GND"],
pin9: ["OSC1"], pin10: ["OSC2"], pin11: ["OSC3"], pin12: ["RESET"],
pin13: ["Q9"], pin14: ["Q8"], pin15: ["Q10"], pin16: ["VCC"],
} as const
const dffPinLabels = {
pin1: ["CLR1_N"], pin2: ["D1"], pin3: ["CLK1"], pin4: ["PRE1_N"],
pin5: ["Q1"], pin6: ["NQ1"], pin7: ["GND"], pin8: ["NQ2"],
pin9: ["Q2"], pin10: ["PRE2_N"], pin11: ["CLK2"], pin12: ["D2"],
pin13: ["CLR2_N"], pin14: ["VCC"],
} as const
export default function ClockBoard() {
return (
<board
name="CLOCKBOARD"
width="120mm"
height="45mm"
borderRadius="20mm"
layers={4}
thickness="1.6mm"
title="Six Digit Logic IC Clock - 1S Li-ion"
minViaHoleDiameter="0.3mm"
minViaPadDiameter="0.6mm"
minViaEdgeToPadEdgeClearance="0.09mm"
minTraceToPadEdgeClearance="0.07mm"
defaultTraceWidth="0.2mm"
schLayout={{ layoutMode: "relative" }}
schTraceAutoLabelEnabled
schMaxTraceDistance={0.5}
autorouter={{
preset: "tscircuit_beta",
allowViaInPad: false,
traceClearance: "0.2mm",
serverCacheEnabled: false,
}}
>
<schematicsheet name="power" displayName="1 - 3.7V Li-ion Input" sheetIndex={0}>
<schematicsection name="entry" displayName="1S LI-ION HEADER, SWITCH AND PROTECTION" />
<pinheader
name="J_POWER"
pinCount={2}
pitch="2.54mm"
footprint="pinrow2_p2.54"
pcbX={0}
pcbY={20}
schX={-7}
schY={2}
schSectionName="entry"
connections={{ pin1: "net.LI_BAT_RAW", pin2: "net.GND" }}
/>
<YTSPS_22E58LM
name="SW_POWER"
pcbX={0}
pcbY={-18}
layer="top"
schX={-3}
schY={2}
schSectionName="entry"
noConnect={["pin3", "pin6"]}
connections={{ pin2: "net.LI_BAT_RAW", pin5: "net.LI_BAT_RAW", pin1: "net.LI_BAT_SW", pin4: "net.LI_BAT_SW" }}
/>
<chip
name="Q_REVERSE"
manufacturerPartNumber="AO3401A"
supplierPartNumbers={jlc("C15127")}
footprint="sot23"
pinLabels={{ pin1: ["G"], pin2: ["S"], pin3: ["D"] }}
pcbX={1}
pcbY={16}
layer="bottom"
schX={1}
schY={2}
schSectionName="entry"
connections={{ G: "net.GND", D: "net.LI_BAT_SW", S: "net.VLOGIC" }}
/>
<capacitor name="C_POWER_BULK" capacitance="100uF" footprint="1206" pcbX={2} pcbY={13} layer="bottom" schX={5} schY={2} schSectionName="entry" connections={{ pin1: "net.VLOGIC", pin2: "net.GND" }} />
<capacitor name="C_POWER_HF" capacitance="1uF" supplierPartNumbers={jlc("C15849")} footprint="0805" pcbX={-14} pcbY={10} layer="bottom" schX={5} schY={-2} schSectionName="entry" connections={{ pin1: "net.VLOGIC", pin2: "net.GND" }} />
</schematicsheet>
<schematicsheet name="timebase" displayName="2 - Crystal Timebase and Controls" sheetIndex={1}>
<schematicsection name="clock" displayName="32.768 kHz OSCILLATOR AND 1 Hz DIVIDER" />
<schematicsection name="controls" displayName="SCHMITT-DEBOUNCED SET BUTTONS" />
<chip
name="U_XO"
manufacturerPartNumber="ASDMB-32.768KHZ-LC-T"
footprint="soic8"
pinLabels={{ pin1: ["EN"], pin2: ["NC2"], pin3: ["NC3"], pin4: ["GND"], pin5: ["OUT"], pin6: ["NC6"], pin7: ["NC7"], pin8: ["VCC"] }}
pcbX={-38}
pcbY={18}
layer="bottom"
schX={-11}
schY={3}
schSectionName="clock"
noConnect={["NC2", "NC3", "NC6", "NC7"]}
connections={{ EN: "net.VLOGIC", GND: "net.GND", OUT: "net.CLK_32K", VCC: "net.VLOGIC" }}
/>
<chip
name="U_OSC"
manufacturerPartNumber="CD74HC4060M"
supplierPartNumbers={jlc("C507245")}
footprint="soic16"
pinLabels={oscPinLabels}
pcbX={-24}
pcbY={14}
layer="bottom"
schX={-7}
schY={3}
schSectionName="clock"
noConnect={["Q4", "Q5", "Q6", "Q7", "Q8", "Q9", "Q10", "Q12", "Q13", "OSC2", "OSC3"]}
connections={{ Q14: "net.CLK_2HZ", OSC1: "net.CLK_32K", RESET: "net.RESET_GLOBAL", GND: "net.GND", VCC: "net.VLOGIC" }}
/>
<chip
name="U_DIV2"
manufacturerPartNumber="74HC74D"
supplierPartNumbers={jlc("C5606")}
footprint="soic14"
pinLabels={dffPinLabels}
pcbX={-8}
pcbY={18}
layer="bottom"
schX={6}
schY={3}
schSectionName="clock"
noConnect={["Q2", "NQ2"]}
connections={{ CLR1_N: "net.VLOGIC", D1: "net.CLK_1HZ_N", CLK1: "net.CLK_2HZ", PRE1_N: "net.VLOGIC", Q1: "net.CLK_1HZ", NQ1: "net.CLK_1HZ_N", GND: "net.GND", PRE2_N: "net.VLOGIC", CLK2: "net.GND", D2: "net.GND", CLR2_N: "net.VLOGIC", VCC: "net.VLOGIC" }}
/>
<resistor name="R_POR" resistance="100kohm" footprint="0603" pcbX={6} pcbY={20} layer="bottom" schX={-8} schY={-5} schSectionName="controls" connections={{ pin1: "net.VLOGIC", pin2: "net.POR_RC" }} />
<capacitor name="C_POR" capacitance="1uF" footprint="0805" pcbX={12} pcbY={20} layer="bottom" schX={-5} schY={-5} schSectionName="controls" connections={{ pin1: "net.POR_RC", pin2: "net.GND" }} />
<chip
name="U_NOT"
manufacturerPartNumber="74HC14D"
supplierPartNumbers={jlc("C5604")}
footprint="soic14"
pinLabels={schmittPinLabels}
pcbX={22}
pcbY={17}
layer="bottom"
schX={0}
schY={-4}
schSectionName="controls"
noConnect={["4Y", "5Y", "6Y"]}
connections={{ "1A": "net.POR_RC", "1Y": "net.RESET_GLOBAL", "2A": "net.MINUTE_BUTTON", "2Y": "net.MINUTE_PULSE", "3A": "net.HOUR_BUTTON", "3Y": "net.HOUR_PULSE", "4A": "net.GND", "5A": "net.GND", "6A": "net.GND", GND: "net.GND", VCC: "net.VLOGIC" }}
/>
<pushbutton name="SW_HOUR" footprint="pushbutton_id1.3mm_od2mm" pcbX={-20} pcbY={-18} layer="top" schX={-8} schY={-9} schSectionName="controls" noConnect={["pin3", "pin4"]} connections={{ pin1: "net.HOUR_BUTTON", pin2: "net.GND" }} />
<resistor name="R_SET_HOUR" resistance="100kohm" footprint="0603" pcbX={-27} pcbY={-18} layer="top" schX={-11} schY={-9} schSectionName="controls" connections={{ pin1: "net.VLOGIC", pin2: "net.HOUR_BUTTON" }} />
<capacitor name="C_SET_HOUR" capacitance="100nF" footprint="0603" pcbX={-31} pcbY={-18} layer="top" schX={-8} schY={-12} schSectionName="controls" connections={{ pin1: "net.HOUR_BUTTON", pin2: "net.GND" }} />
<pushbutton name="SW_MINUTE" footprint="pushbutton_id1.3mm_od2mm" pcbX={20} pcbY={-18} layer="top" schX={2} schY={-9} schSectionName="controls" noConnect={["pin3", "pin4"]} connections={{ pin1: "net.MINUTE_BUTTON", pin2: "net.GND" }} />
<resistor name="R_SET_MINUTE" resistance="100kohm" footprint="0603" pcbX={27} pcbY={-18} layer="top" schX={-1} schY={-9} schSectionName="controls" connections={{ pin1: "net.VLOGIC", pin2: "net.MINUTE_BUTTON" }} />
<capacitor name="C_SET_MINUTE" capacitance="100nF" footprint="0603" pcbX={31} pcbY={-18} layer="top" schX={2} schY={-12} schSectionName="controls" connections={{ pin1: "net.MINUTE_BUTTON", pin2: "net.GND" }} />
</schematicsheet>
<schematicsheet name="counter_logic" displayName="3 - Seconds, Minutes and Hours Logic" sheetIndex={2}>
<schematicsection name="counters" displayName="DUAL BCD RIPPLE COUNTERS" />
<schematicsection name="gates" displayName="MOD-60, MOD-24 AND MANUAL ADVANCE" />
<chip
name="U_CNT_SEC" manufacturerPartNumber="74HC390D" supplierPartNumbers={jlc("C5384")} footprint="soic16" pinLabels={counterPinLabels}
pcbX={-48} pcbY={-12} layer="bottom" schX={-9} schY={4} schSectionName="counters"
connections={{ C1_CLK0: "net.CLK_1HZ", C1_RESET: "net.RESET_GLOBAL", C1_Q0: "net.S1_A", C1_Q1: "net.S1_B", C1_Q2: "net.S1_C", C1_Q3: "net.S1_D", C1_CLK1: "net.S1_A", C2_CLK0: "net.S1_D", C2_RESET: "net.SEC_TENS_RESET", C2_Q0: "net.S10_A", C2_Q1: "net.S10_B", C2_Q2: "net.S10_C", C2_Q3: "net.S10_D", C2_CLK1: "net.S10_A", GND: "net.GND", VCC: "net.VLOGIC" }}
/>
<chip
name="U_CNT_MIN" manufacturerPartNumber="74HC390D" supplierPartNumbers={jlc("C5384")} footprint="soic16" pinLabels={counterPinLabels}
pcbX={-6} pcbY={-12} layer="bottom" schX={0} schY={4} schSectionName="counters"
connections={{ C1_CLK0: "net.MINUTE_CLOCK", C1_RESET: "net.RESET_GLOBAL", C1_Q0: "net.M1_A", C1_Q1: "net.M1_B", C1_Q2: "net.M1_C", C1_Q3: "net.M1_D", C1_CLK1: "net.M1_A", C2_CLK0: "net.M1_D", C2_RESET: "net.MIN_TENS_RESET", C2_Q0: "net.M10_A", C2_Q1: "net.M10_B", C2_Q2: "net.M10_C", C2_Q3: "net.M10_D", C2_CLK1: "net.M10_A", GND: "net.GND", VCC: "net.VLOGIC" }}
/>
<chip
name="U_CNT_HOUR" manufacturerPartNumber="74HC390D" supplierPartNumbers={jlc("C5384")} footprint="soic16" pinLabels={counterPinLabels}
pcbX={48} pcbY={-12} layer="bottom" schX={9} schY={4} schSectionName="counters"
connections={{ C1_CLK0: "net.HOUR_CLOCK", C1_RESET: "net.HOUR_RESET", C1_Q0: "net.H1_A", C1_Q1: "net.H1_B", C1_Q2: "net.H1_C", C1_Q3: "net.H1_D", C1_CLK1: "net.H1_A", C2_CLK0: "net.H1_D", C2_RESET: "net.HOUR_RESET", C2_Q0: "net.H10_A", C2_Q1: "net.H10_B", C2_Q2: "net.H10_C", C2_Q3: "net.H10_D", C2_CLK1: "net.H10_A", GND: "net.GND", VCC: "net.VLOGIC" }}
/>
<chip
name="U_AND" manufacturerPartNumber="74HC08D" supplierPartNumbers={jlc("C5600")} footprint="soic14" pinLabels={andPinLabels}
pcbX={-33} pcbY={-11} layer="bottom" schX={-2} schY={-5} schSectionName="gates" noConnect={["4Y"]}
connections={{ "1A": "net.S10_B", "1B": "net.S10_C", "1Y": "net.SEC_AT_6", "2A": "net.M10_B", "2B": "net.M10_C", "2Y": "net.MIN_AT_6", "3A": "net.H10_B", "3B": "net.H1_C", "3Y": "net.HOUR_AT_24", "4A": "net.GND", "4B": "net.GND", GND: "net.GND", VCC: "net.VLOGIC" }}
/>
<chip
name="U_OR" manufacturerPartNumber="74HC32D" supplierPartNumbers={jlc("C5601")} footprint="soic14" pinLabels={orPinLabels}
pcbX={18} pcbY={-10} layer="bottom" schX={5} schY={-5} schSectionName="gates"
connections={{ "1A": "net.S10_C", "1B": "net.MINUTE_PULSE", "1Y": "net.MINUTE_CLOCK", "2A": "net.M10_C", "2B": "net.HOUR_PULSE", "2Y": "net.HOUR_CLOCK", "3A": "net.RESET_GLOBAL", "3B": "net.SEC_AT_6", "3Y": "net.SEC_TENS_RESET", "4A": "net.RESET_GLOBAL", "4B": "net.MIN_AT_6", "4Y": "net.MIN_TENS_RESET", GND: "net.GND", VCC: "net.VLOGIC" }}
/>
<chip
name="U_OR_RESET" manufacturerPartNumber="74HC32D" supplierPartNumbers={jlc("C5601")} footprint="soic14" pinLabels={orPinLabels}
pcbX={36} pcbY={-10} layer="bottom" schX={10} schY={-5} schSectionName="gates" noConnect={["2Y", "3Y", "4Y"]}
connections={{ "1A": "net.RESET_GLOBAL", "1B": "net.HOUR_AT_24", "1Y": "net.HOUR_RESET", "2A": "net.GND", "2B": "net.GND", "3A": "net.GND", "3B": "net.GND", "4A": "net.GND", "4B": "net.GND", GND: "net.GND", VCC: "net.VLOGIC" }}
/>
</schematicsheet>
<schematicsheet name="display_decoders" displayName="4 - BCD to Seven-Segment Drivers" sheetIndex={3}>
<schematicsection name="drivers" displayName="SIX STATIC CMOS DECODERS AND CURRENT LIMITING" />
{digits.map((digit) => <DisplayDigit key={digit.display} {...digit} />)}
</schematicsheet>
<schematicsheet name="display_digits" displayName="5 - Six-Digit LED Display" sheetIndex={4}>
<schematictext text="HOURS" schX={-8} schY={8} fontSize={0.45} />
<schematictext text="MINUTES" schX={0} schY={8} fontSize={0.45} />
<schematictext text="SECONDS" schX={8} schY={8} fontSize={0.45} />
</schematicsheet>
<capacitor name="C_LOGIC_1" capacitance="100nF" footprint="0603" pcbX={-20} pcbY={-5} layer="bottom" connections={{ pin1: "net.VLOGIC", pin2: "net.GND" }} />
<capacitor name="C_LOGIC_3" capacitance="100nF" footprint="0603" pcbX={-42} pcbY={-19} layer="bottom" connections={{ pin1: "net.VLOGIC", pin2: "net.GND" }} />
<capacitor name="C_LOGIC_4" capacitance="100nF" footprint="0603" pcbX={-6} pcbY={-19} layer="bottom" connections={{ pin1: "net.VLOGIC", pin2: "net.GND" }} />
<capacitor name="C_LOGIC_5" capacitance="100nF" footprint="0603" pcbX={42} pcbY={-19} layer="bottom" connections={{ pin1: "net.VLOGIC", pin2: "net.GND" }} />
<capacitor name="C_LOGIC_6" capacitance="100nF" footprint="0603" pcbX={-33} pcbY={-17} layer="bottom" connections={{ pin1: "net.VLOGIC", pin2: "net.GND" }} />
<capacitor name="C_LOGIC_7" capacitance="100nF" footprint="0603" pcbX={25} pcbY={-5} layer="bottom" connections={{ pin1: "net.VLOGIC", pin2: "net.GND" }} />
<capacitor name="C_LOGIC_8" capacitance="100nF" footprint="0603" pcbX={34} pcbY={-16} layer="bottom" connections={{ pin1: "net.VLOGIC", pin2: "net.GND" }} />
<silkscreentext text="HH" pcbX={-40} pcbY={17} fontSize="1mm" />
<silkscreentext text="MM" pcbX={0} pcbY={17} fontSize="1mm" />
<silkscreentext text="SS" pcbX={40} pcbY={17} fontSize="1mm" />
<silkscreentext text="HOUR" pcbX={-20} pcbY={-21} fontSize="0.7mm" />
<silkscreentext text="MIN" pcbX={20} pcbY={-21} fontSize="0.7mm" />
<silkscreentext text="1S LI-ION 3.7V" pcbX={0} pcbY={17} fontSize="0.7mm" />
<silkscreentext text="LOGIC IC CLOCK - NO MCU" pcbX={0} pcbY={-21} layer="bottom" fontSize="0.7mm" />
<silkscreentext text="J1: + 3.0-4.2V / GND" pcbX={0} pcbY={12} layer="bottom" fontSize="0.7mm" />
<copperpour connectsTo="net.GND" layer="top" clearance="0.2mm" boardEdgeMargin="0.3mm" />
<copperpour connectsTo="net.GND" layer="bottom" clearance="0.2mm" boardEdgeMargin="0.3mm" />
</board>
)
}