u4.lisp

(load "micro-graphics/load.lisp")
(load "07.lisp")

Digitální sedmisegmentový displej

Úkolem je naprogramovat digitální displej, který bude složen z tzv. sedminsegmentovek. Sedmisegmentovka obsahuje sedm políček, které je možné individuálně rozsvěcet a zhasínat. Sedmisegmentovka bude schopná zozbrazovat čísla od 0 do 9, hodnota nil se bude interpretovat jako všechny segmenty zhasnuty.

Třída 7-segment

Vytvořte třídu 7-segment, která bude reprezentovat jednu sedmisegmentovku. Třída bude potomek třídy picture a bude mít tyto sloty:

value:

Bude reprezentovat hodnotu, která se má zobrazit.

on-p:

Bude indikovat, zda je sedmisegmentovka zapnutá nebo vypnutá (vypnutná sedmisegmentovka ale má stále hodnotu ve slotu value).

(defclass 7-segment (picture)
  ((value :initform 0)
   (on-p  :initform nil)
   ))
   _____
   __0__
| |     | |
|1|     |2|
| |     | |
   _____
   __3__
| |     | |
|4|     |5|
| |     | |
   _____
   __6__
(defmethod initialize-instance ((self 7-segment) &key)
  ;jsme potomkem picture, do .items nacpeme segmenty
  )

Metody:

segments:

Vrátí segmenty sedmisegmentovky (ta bude reprezentována osmi polygony, tj. sedmi segmenty a podkladovým polygonem).

set-segments:

Nastaví (tj. rozsvítí nebo zhasne) jednotlivé segmenty sedmisegmentovky. Vyberte si, jak budete hodnoty pro jednotlivé segmenty reprezentovat. Jedna možnost je reprezentace seznamem hodnot t a nil, kde každá hodnota odpovídá jednomu segmentu, t značí rozsvícený segment, nil zhasnutý segment.

set-on

set-off

Zapne, resp. vypne sedmisegmentovku

set-value

Nastaví hodnotu, přípustné hodnoty jsou 0-9

Další částí úkolu je vytvořit displej složený se sedmisegmentovek. Displej bude reprezentován třídou segment-display, která bude potomkem třídy picture. Výchozí počet segmentů je šest.

Třída segment-display

Třída segment-display nebude mít žádné sloty (kromě zděděných, pochopitelně).

(defclass segment-display () ;superclass?
  ()
  )

Metody:

segment-count:

Zjistí počet sedmisegmentovek displeje (počet sedmisegmentovek segmentů není třeba ukládat do slotu, dá se dynamicky zjistit z items).

set-segment-count:

Nastaví počet sedmisegmentovek a provede reset.

reset:

Provede reset displeje, tj. nastaví každý sedmisegment na nil

value:

Vrátí seznam hodnot v sedmisegmentech. Nespecifikované sedmisegmenty budou mít hodnotu NIL. Poznámka: opět nemáme slot na hodnotu, kterou dynamicky zjistíme zhodnot jednotlivých sedmisegmentů.

set-value:

Nastaví hodnoty sedmisegmentů podle zadaného seznamu hodnot. Jednotlivé hodnoty seinterpretují zleva doprava, pokud je seznam hodnot kratší než je počet segmentů, pak sezadané hodnoty zarovnají doprava (napříjklad pro seznam hodnot '(1 2 3 4) budou u displeje s šesti sedmisegmenty první dvě (zleva) sedmisegmentovky vypnuté dále budounásledovat hodnoty 1, 2, 3, a 4. Při pokusu o nastavení většího počtu hodnot než displejobsahuje sedmisegmentovek, musí být signalizována chyba.

set-on, set-off: Zapne, resp. vypne displej.

CL-USER 47 > (setf w (make-instance 'window)) #<WINDOW 201088E3>

CL-USER 48 > (set-shape w (make-instance 'segment-display)) #<WINDOW 201088E3>

CL-USER 49 > (redraw w) #<WINDOW 201088E3>

CL-USER 51 > (set-value (shape w) '(1 2 3 4))

#<SEGMENT-DISPLAY 200D922F>

CL-USER 52 > (redraw w) #<WINDOW 201088E3>

CL-USER 53 > (value (shape w)) (NIL NIL 1 2 3 4)

CL-USER 54 > (set-segment-count (shape w) 4) #<SEGMENT-DISPLAY 200D922F>

CL-USER 55 > (redraw w) #<WINDOW 201088E3>

CL-USER 57 > (set-value (shape w) '(9 0)) #<SEGMENT-DISPLAY 200D922F>

CL-USER 58 > (redraw w) #<WINDOW 210C66A7>

CL-USER 59 > (set-off (shape w)) #<SEGMENT-DISPLAY 200D922F>

CL-USER 60 > (redraw w) #<WINDOW 210C66A7>

CL-USER 61 > (set-on (shape w)) #<SEGMENT-DISPLAY 200D922F>

CL-USER 62 > (redraw w) #<WINDOW 210C66A7>

YPP2/u4.lisp.txt · Last modified: 2014/10/22 00:46 (external edit)
CC Attribution-Noncommercial-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0