7-Segment-Emulation

Der Ansatz ist eine 7-Segment-Emulation. Das Array 7seg wandelt Ziffern in 7-Segment-Codes, und lines gibt an, welches Bit wo schaltet.

\        5   
\       7 2
\        4
\       6 1
\        30
 
Create 7seg $EE c, $06 c, $7C c, $3E c, $96 c, 
            $BA c, $FA c, $26 c, $FE c, $BE c,
 
Create lines   0 c, $20 c,  0 c,
             $80 c,   0 c,  4 c,
               0 c, $10 c,  0 c,
             $40 c,   0 c,  2 c,
               0 c,   8 c,  1 c,  
 
2 value size
 
: >size ( line -- size )  1 and IF size ELSE 1 THEN ;
 
: set? ( digit i -- digit i flag )  2dup lines + c@ and ;
 
: .seg| ( digit i -- digit i' )
  set? IF '| ELSE bl THEN emit 1+ ;
 
: .seg- ( digit i -- digit i' )
   set? IF '- ELSE bl THEN emit 1+ ;
 
: 7seg-line ( dig line -- )
   7seg + c@ swap 3 * .seg| size 0 ?DO .seg- 1- LOOP 1+ .seg| space 2drop ;
 
: .lcd-line ( addr u -- addr u )
   cr >r 2dup r> -rot bounds ?DO
      dup I c@ '0 - 7seg-line
   LOOP ;
 
: .lcd-lines ( addr u line -- addr u )
  dup >size
  0 ?DO  .lcd-line  LOOP  drop ;
 
: .lcd-string ( addr u -- )
  5 0 DO  I .lcd-lines  LOOP  2drop ;
 
: .lcd ( x -- )
    0 <# #s #>  .lcdstring ;