Welcome, guest | Sign In | My Account | Store | Cart
# The shapes of individual elements of a digit.  They were worked out
# with a piece of paper, a calculator and a good deal of head-scratching.
array set lcdshape {
   a {3.0 5 5.2 3 7.0 5 6.0 15 3.8 17 2.0 15}
   b {6.3 2 8.5 0 18.5 0 20.3 2 18.1 4 8.1 4}
   c {19.0 5 21.2 3 23.0 5 22.0 15 19.8 17 18.0 15}
   d {17.4 21 19.6 19 21.4 21 20.4 31 18.2 33 16.4 31}
   e {3.1 34 5.3 32 15.3 32 17.1 34 14.9 36 4.9 36}
   f {1.4 21 3.6 19 5.4 21 4.4 31 2.2 33 0.4 31}
   g {4.7 18 6.9 16 16.9 16 18.7 18 16.5 20 6.5 20}
}
# Which elements are turned on for a given digit?  Note that this is only
# decimal digits, though adding hex digits should be easy enough.
array set llcd {
   0 {a b c d e f}
   1 {c d}
   2 {b c e f g}
   3 {b c d e g}
   4 {a c d g}
   5 {a b d e g}
   6 {a b d e f g}
   7 {b c d}
   8 {a b c d e f g}
   9 {a b c d e g}
   - {g}
   { } {}
}
# Which elements are turned off for a given digit?  Note that you should make
# sure that this is the complement of the digits set in the llcd array...
array set ulcd {
   0 {g}
   1 {a b e f g}
   2 {a d}
   3 {a f}
   4 {b e f}
   5 {c f}
   6 {c}
   7 {a e f g}
   8 {}
   9 {f}
   - {a b c d e f}
   { } {a b c d e f g}
}

# Displays a decimal number using LCD digits in the top-left of the canvas
proc showLCD {
   canvas number {width 5} {colours {#ff8080 #ff0000 #404040 #303030}}
} {
   global llcd ulcd lcdshape
   set lcdoffset 0

   # Remove previous LCD number
   $canvas delete lcd

   # Get colours to draw with
   foreach {onRim onFill offRim offFill} $colours {break}

   # For each digit in the (space-padded) number...
   foreach glyph [split [format %${width}d $number] {}] {
      # ... draw its "on" elements...
      foreach symbol $llcd($glyph) {
         # ... by drawing a polygon and shifting it...
         $canvas move [eval $canvas create polygon $lcdshape($symbol)                  -tags lcd -outline $onRim -fill $onFill] $lcdoffset 0
      }
      # ... and then doing the same thing for the "off" elements
      foreach symbol $ulcd($glyph) {
         $canvas move [eval $canvas create polygon $lcdshape($symbol)                  -tags lcd -outline $offRim -fill $offFill] $lcdoffset 0
      }
      # And now we increase our offset too...
      incr lcdoffset 22
   }
}

History