Version 2 of LCD hexa panel

Updated 2004-04-23 14:39:30

ulis, 2004-03-13. A LCD hexa panel.

http://perso.wanadoo.fr/maurice.ulis/tcl/LCDhexapanel.png


Digits stuff

  # --------
  # digits stuff
  # --------
  # font description
  array set hexdigits \
  {
    " " {0 0 0 0 0 0 0}
    "0" {1 1 1 0 1 1 1}
    "1" {0 0 1 0 0 1 0}
    "2" {1 0 1 1 1 0 1}
    "3" {1 0 1 1 0 1 1}
    "4" {0 1 1 1 0 1 0}
    "5" {1 1 0 1 0 1 1}
    "6" {1 1 0 1 1 1 1}
    "7" {1 0 1 0 0 1 0}
    "8" {1 1 1 1 1 1 1}
    "9" {1 1 1 1 0 1 1}
    "A" {1 1 1 1 1 1 0}
    "B" {0 1 0 1 1 1 1}
    "C" {1 1 0 0 1 0 1}
    "D" {0 0 1 1 1 1 1}
    "E" {1 1 0 1 1 0 1}
    "F" {1 1 0 1 1 0 0}
  }
  # add a digit to the panel
  proc add:digit {w x y tag} \
  {
    set dx $::(dx)
    set dy $::(dy)
    create:segment $w $tag:0 $x $y 0 0 $dx 0
    create:segment $w $tag:1 $x $y 0 0 0 $dy
    create:segment $w $tag:2 $x $y $dx 0 $dx $dy
    incr y $dy
    create:segment $w $tag:3 $x $y 0 0 $dx 0
    create:segment $w $tag:4 $x $y 0 0 0 $dy
    create:segment $w $tag:5 $x $y $dx 0 $dx $dy
    incr y $dy
    create:segment $w $tag:6 $x $y 0 0 $dx 0
  }
  # add a segment to a digit
  proc create:segment {w tag x y dx0 dy0 dx1 dy1} \
  {
    $w create line \
      [expr {$x + $dx0}] [expr {$y + $dy0}] \
      [expr {$x + $dx1}] [expr {$y + $dy1}] \
      -tags [list $tag $tag] \
      -fill $::(color) -width $::(width)
  }
  # set a digit
  proc set:digit {w tag digit} \
  {
    set n 0
    foreach segment $::hexdigits($digit) \
    {
      $w itemconfig $tag:$n -state [expr {$segment ? "normal" : "hidden"}]
      incr n
    }
  }

Demo

  # --------
  # demo
  # --------
  wm title . "LCD hexa panel"
  # parms
  array set {} \
  {
    dx    15
    dy    15
    color red
    width 3
  }
  # canvas
  pack [canvas .c]
  # digits
  set n 0
  set x 5
  foreach digit [lsort [array names hexdigits]] \
  {
    add:digit .c $x 5 d$n
    set:digit .c d$n $digit
    incr n
    incr x 20
  }
  foreach {- - width height} [.c bbox all] break
  .c config -width $width -height $height

See also 7-segment ASCII graphics


DKF: Here's another version, taken from a game at http://www.man.ac.uk/~zzcgudf/tcl/maze.tcl

 ### LCD NUMBER DISPLAY ENGINE ###

 # The shapes of individual elements of a digit
 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?
 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?
 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 {c number {width 5} {colours {#ff8080 #ff0000 #404040 #303030}}} {
    global llcd ulcd lcdshape
    set lcdoffset 0
    $c delete lcd
    foreach {onRim onFill offRim offFill} $colours {break}
    foreach glyph [split [format %${width}d $number] {}] {
       foreach symbol $llcd($glyph) {
          $c move [eval $c create polygon $lcdshape($symbol) -tags lcd \
                 -outline $onRim -fill $onFill] $lcdoffset 0
       }
       foreach symbol $ulcd($glyph) {
          $c move [eval $c create polygon $lcdshape($symbol) -tags lcd \
                 -outline $offRim -fill $offFill] $lcdoffset 0
       }
       incr lcdoffset 22
    }
 }

 # Simple demo
 pack [canvas .c]
 showLCD .c 123

Category Example