MAX7219 tube clock/The clock/10. The colon is a decimal point
The clock · 10 of 12

The colon is a decimal point

There is no colon register. Each clock panel wires its colon to the decimal-point line of its second digit, so on the assembled eight the colons are digits 1 and 5 — and on the other six digits the point bit lights nothing at all.

Bit 7, digit by digit

Bit 7, digit by digit
a colon
Which panels are fitted
Point bit set on digit
Colon digits
1, 5
Byte
0b10001000
Lights
a colon
Digit 1’s point line is the left colon. Each clock panel has one colon between its middle two digits, wired to the second of its four — so on the assembled eight the colons belong to digits 1 and 5. lc.setDigit(0, 1, value, true) lights it, and the “value” part is unaffected: the digit still shows its number.

Step the point bit along the eight digits with colon panels fitted, then switch to decimal panels and do it again. Two of the eight positions do something on a clock panel; all eight do on a decimal one.

The reason is that there is no colon register and no colon pin. The MAX7219 has eight segment outputs per digit — seven bars and a point — and that is all it has. So a colon panel takes the point line of its second digit and wires the two colon LEDs to it instead of to a dot.

Each panel is four digits with one colon. Assembled, the left panel's colon is the point of digit 1 and the right panel's is the point of digit 5.

What that gives you

lc.setDigit(0, 0, 0, false);
lc.setDigit(0, 1, 8, true);    // shows 8, and lights the left colon
lc.setDigit(0, 2, 3, false);
lc.setDigit(0, 3, 0, false);   // 08:30

The point argument and the value argument are independent. Digit 1 shows its 8 whether the colon is lit or not, so blinking the colon once a second costs one register write and does not touch the number.

And what it takes away

Six of the eight digits have a point bit that lights nothing.

That is not a fault and there is no error — the byte is valid, the chip drives its segment output, and there is no LED on the other end of it. If you set the point on digit 3 expecting a decimal point and got silence, this is why, and no change to the sketch will fix it. That half of the display needs a decimal-point panel.

Which is the real reason the two panel styles exist as separate products rather than one panel with both. There are eight segment lines and the eighth is either the points or the colon. Never both.

Verifying it on your own display

The mapping above is what the panels in this kit do, and it is worth knowing how to check it rather than trusting it, because a panel bought elsewhere may differ.

Set every digit to 8, then walk the point bit from 0 to 7 with a second between each, and watch what lights. On a colon pair you will see the left colon at 1 and the right colon at 5 and nothing at the other six. That is the whole test, and it takes about ten seconds:

for (int d = 0; d < 8; d++) {
  for (int i = 0; i < 8; i++) lc.setDigit(0, i, 8, i == d);
  delay(1000);
}

The demo sketch in the Segment-Display repository records the result of that scan as a comment, which is where the digits 1 and 5 in this article come from — that, and the product photograph of it running, where the two colons are lit and no decimal point is.

When it does not work

The colon will not light

Three causes in order. The panel is a decimal-point one and has no colon at all. Or the point bit is on the wrong digit — it is digits 1 and 5, counting from the left, not 0 and 4. Or you are on the digit-panel half of a mixed display, where the point appears as a point.

I set the point on digit 3 and nothing happened

Correct behaviour on a colon panel. That panel spends its point line on the colon, so digits 0, 2 and 3 have no separator to light and setting their bit does nothing — no error, no dot. If you want a decimal point there, that half needs a decimal panel.

The digit under the colon changed when I lit it

It should not have. The point is bit 7 and the character is the low four bits, and they are independent — lc.setDigit(0, 1, 8, true) shows an 8 and lights the colon. If the digit changed, check you are not sending 0x80 as the value instead of as the point.

Can I light both colons independently?

Yes. They are two separate point bits on two separate digits, so digit 1's colon and digit 5's colon are entirely unrelated. Blinking one and holding the other steady is two ordinary register writes.

My display has colons on one half and points on the other

Then it is a mixed build, and that is a supported one — the driver board does not care. Digits 0 to 3 behave as whichever panel is on the left and digits 4 to 7 as whichever is on the right. Keep track of which is which; nothing in software can tell you.

Where this goes next

An ESP32, a time server and the eight digits — including where the seconds actually fit.

A clock in a tube

Edit this page — content/books/max7219-tube-clock/the-colon-is-a-decimal-point.mdx

Community

Questions about this product

See what other owners have asked, and read their solutions.

Ask a question ↗

MAX7219 Vintage Tube LED Clock Kit

Loading discussions…

Discuss this article

Ask about this page. The answer stays here, on the page it belongs to, for whoever hits the same wall next.

Browse Modules and blocks on the forum