Das Wesentliche zum LCD Display auf dem AVR Butterfly
Die Einzelheiten sind beschrieben im doc2530.pdf, dem LCDdriver Dokument von Atmel. Im Beispiel wird gezeigt, wie man Zeichen ins Display bringen kann.
Der ATmega169 hat den Display Treiber integriert. Das Display auf dem AVR Butterfly ist sehr einfach. Es kann 6 Zeichen darstellen, zwei Doppelpunkte und einige Rauf-Runter-Pfeile. Auch einige der Nummernsymbole können angesteuert werden. Folgende Segmente sind angeschlossen (mehr Treiber hat der ATmega169 nicht):
Jedes Zeichen besteht aus 14 Segmenten. Die Zeichen Nr.2 bis Nr.7 können benutzt werden. Wie füttert man das Display auf dem AVR Butterfly? Die Segmente werden einzeln geschaltet von den bits in den LCD Data Registern LCDDR0..18 im ATmega169. Diese Register sind in 4 Gruppen angeordnet, je common backplane eine Gruppe.
Die Zeichen Nr. 3,5,7 werden von den oberen Nibbles, also Bits7..4 eines Data Bytes geschrieben. Die Zeichen Nr.2,4,6 werden mit den unteren, also Bits3..0, geschreiben. Dabei codieren immer 4 Nibbles ein ganzes Zeichen. Die Anordnung der Leitungen auf dem Butterfly hat eine eigenartige Verteilung dieser Nibbles auf die Data Register zur Folge. Vom Basisregister aus sind die Nibbles mit einem Offset von 0,5,10,15 in die folgenden Register zu verteilen.
Beispiel: Das Zeichen Nr.2 wird von den Bits3..0 in den Data Registern LCDDR0, LCDDR5, LCDDR10 und LCDDR15 bestimmt.
Aus einer Segment Code Tabelle kann entnommen werden, welche Segmente an sein müsssen, um ein ASCII-Zeichen darzustellen. Der Segment Code braucht 14 bit. Somit kann ein Datenwort im flash des ATmega169 ein ganzes Zeichen codieren (cell=16bit).
Gesteuert wird der Displayteiber über 4 Control Register im ATmega169.
$E7 constant LCDCCR \ contrast control register \ LCDCCR7..5 = LCDCD CLK driver time disply is on; %111 = 50%. \ LCDCCR4 ist nc \ LCDCCR3..0 = LCDCC Contrast Control; %1111 = 3,35V; %0000 = 2,60V. $E6 constant LCDFRR \ frame rate register \ LCDFRR7 is nc \ LCDFRR6..4 = LCDPS prescaler for clock divide; %0000 = CLK/16. \ LCDFRR3 ist nc \ LCDFRR2..0 = LCDCD clock divide; %110 = 7 is common framerate. $E5 constant LCDCRB \ control register B \ LCDCRB7 = LCDCS clock source; %0 = internal clock. \ LCDCRB6 = LCD2B bias; %1 = 1/3 bias für alle 4 backplanes. \ LCDCRB5..4 = LCDMUX duty cyles; %11 = 1/4 weil es 4 backplanes sind. \ LCDCRB3 ist nc \ LCDCRB2..0 = LCDPM port mask; %111 = alle Segmentleitungen werden benutzt. $E4 constant LCDCRA \ control register A \ LCDCRA7 = LCDEN enable display driver; %1 = on, %0 = off. \ LCDCRA6 = LCDAB low power wave form; %1 = use low power. \ LCDCRA5 is nc \ LCDCRA4 = LCDIF interrupt flag; gesetzt wenn ein frame fertig ist. \ LCDCRA3 = LCDIE interrupt enable; %1 = interrupt enabled. \ LCDCRA2..1 sind nc \ LCDCRA0 = LCDBL blank display; entläd das display über alle Segmenttreiber; data register bleiben erhalten.
Die weitere Gestaltung sei der Fantasie der Leser überlassen. Viel Vergnügen beim ausprobieren und experimentiere.