# 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 } }