Nike622000

Zwischenprüfung

Feb 27th, 2018
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 175.14 KB | None | 0 0
  1. // 20160825
  2.  
  3. #include"Wire.h"
  4.  
  5. void ZeigeUhrZufaellig(byte Zufall=0xFF);
  6. void ZeigeTemperaturZufaellig(byte Zufall=0xFF);
  7. void ZeigeIntermezzoZufaellig(byte Zufall=0xFF);
  8.  
  9. const char MaxGleich=60;
  10. const char MaxUhrzeit=MaxGleich+17;
  11. const char MaxTemperatur=MaxGleich+17;
  12. const char MaxIntermezzo=18;
  13.  
  14.  
  15. // Konstanten
  16. const char LM75_I2C_SlaveAdr=0x4F;
  17. const char DS1307_I2C_SlaveAdr=0x68;
  18.  
  19. const char ZeitRaffer=1; // zum testen
  20. const char ZeitLupe=1;   // zum testen
  21.  
  22. // Nummern der Zeilen und Spalten
  23. // 0 1 2 3 4 5 6
  24. // 1
  25. // 2
  26. // 3
  27. // 4
  28. // 5 (automatischer Abstand bei hoch/runter schieben)
  29.  
  30. // Nummern der Leds
  31. //  0  1  2  3  4  5  6
  32. //  7  8  9 10 11 12 13
  33. // 14 15 16 17 18 19 20
  34. // 21 22 23 24 25 26 27
  35. // 28 29 30 31 32 33 34
  36.  
  37. // Pinbelegung Arduino
  38.  
  39. const char AnzahlSpalten=7;
  40. const char AnzahlZeilen=5;
  41.  
  42. const byte ZeilenPins[AnzahlZeilen]={7, 6, 5, 4, 3};
  43. const byte DecoderPins[3]={8, 9, 10};
  44. const byte TastenPin=11;
  45. const byte WeckerPin=13;
  46.  
  47. const char AnzahlLeds=AnzahlSpalten*AnzahlZeilen;
  48.  
  49. const char Schreibzahl[] PROGMEM={ // wie von Hand geschrieben
  50.   2,  1,  0,  7, 14, 21, 28, 29, 30, 23, 16,  9, 99, 99,  // 0 (99 = Dummy-Led)
  51.   7,  1,  8, 15, 22, 28, 29, 30, 99, 99, 99, 99, 99, 99,  // 1
  52.   0,  1,  2,  9, 16, 15, 14, 21, 28, 29, 30, 99, 99, 99,  // 2
  53.   0,  1,  2,  9, 16, 15, 23, 30, 29, 28, 99, 99, 99, 99,  // 3
  54.   0,  7, 14, 15,  2,  9, 16, 23, 30, 99, 99, 99, 99, 99,  // 4
  55.   2,  1,  0,  7, 14, 15, 16, 23, 30, 29, 28, 99, 99, 99,  // 5
  56.   2,  1,  0,  7, 14, 21, 28, 29, 30, 23, 16, 15, 99, 99,  // 6
  57.   0,  1,  2,  9, 15, 22, 29, 99, 99, 99, 99, 99, 99, 99,  // 7
  58.   9,  2,  1,  0,  7, 14, 15, 16, 23, 30, 29, 28, 21, 99,  // 8
  59.  15, 14,  7,  0,  1,  2,  9, 16, 23, 30, 29, 28, 99, 99,  // 9
  60.   2,  1,  0,  7, 14, 15, 16,  9, 99, 99, 99, 99, 99, 99,  // Grad
  61.   2,  1,  7, 14, 21, 29, 30, 99, 99, 99, 99, 98, 99, 99}; // C
  62.  
  63. const char AnzahlEnfachSpiralen=9;
  64. const char AnzahlDoppletSpiralen=4;
  65. const char Spiralen[(AnzahlEnfachSpiralen+AnzahlDoppletSpiralen)*AnzahlLeds] PROGMEM={
  66.   0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34, // waagerecht
  67.   0, 7,14,21,28, 1, 8,15,22,29, 2, 9,16,23,30, 3,10,17,24,31, 4,11,18,25,32, 5,12,19,26,33, 6,13,20,27,34, // senkrecht
  68.   0, 1, 2, 3, 4, 5, 6,13,12,11,10, 9, 8, 7,14,15,16,17,18,19,20,27,26,25,24,23,22,21,28,29,30,31,32,33,34, // waagerecht, hin und her
  69.   0, 7,14,21,28,29,22,15, 8, 1, 2, 9,16,23,30,31,24,17,10, 3, 4,11,18,25,32,33,26,19,12, 5, 6,13,20,27,34, // senkrecht, hin und her
  70.   0, 1, 2, 3, 4, 5, 6,13,20,27,34,33,32,31,30,29,28,21,14, 7, 8, 9,10,11,12,19,26,25,24,23,22,15,16,17,18, // spiralfoermig, erst waageecht
  71.   0, 7,14,21,28,29,30,31,32,33,34,27,20,13, 6, 5, 4, 3, 2, 1, 8,15,22,23,24,25,26,19,12,11,10, 9,16,17,18, // spiralfoermig, erst senkrecht
  72.   0, 7, 1,14, 8, 2,21,15, 9, 3,28,22,16,10, 4,29,23,17,11, 5,30,24,18,12, 6,31,25,19,13,32,26,20,33,27,34, // diaginal
  73.   0, 1, 7,14, 8, 2, 3, 9,15,21,28,22,16,10, 4, 5,11,17,23,29,30,24,18,12, 6,13,19,25,31,32,26,20,27,33,34, // diagonal, hin un her
  74.  22,15, 8, 9,16,23,30,29,28,21,14, 7, 0, 1, 2, 3,10,17,24,31,32,33,34,27,20,13, 6, 5, 4,11,18,25,26,19,12, // Schnecke Zehner, Einer
  75.  35, 4,36, 5,37, 6,44,13,51,20,58,27,65,34,64,33,63,32,56,25,49,18,42,11,43,12,50,19,57,26,99,99,99,99,99, // Doppelspirale
  76.  35, 6,36, 5,37, 4,44,11,51,18,58,25,65,32,64,33,63,34,56,27,49,20,42,13,43,12,50,19,57,26,99,99,99,99,99, // dito
  77.  37, 4,36, 5,35, 6,42,13,49,20,56,27,63,34,64,33,65,32,58,25,51,18,44,11,43,12,50,19,57,26,99,99,99,99,99, // dito
  78.  35,34,36,33,37,32,38,31,39,30,40,29,41,28,48,21,55,14,62, 7,61, 8,60, 9,59,10,58,11,57,12,50,19,51,18,17  // dito
  79. };
  80.  
  81. const char CodeTab[] PROGMEM={
  82.   0x1F, 0x11, 0x1F,   // 0
  83.   0x12, 0x1F, 0x10,   // 1
  84.   0x1D, 0x15, 0x17,   // 2
  85.   0x11, 0x15, 0x1F,   // 3
  86.   0x07, 0x04, 0x1F,   // 4
  87.   0x17, 0x15, 0x1D,   // 5
  88.   0x1F, 0x15, 0x1D,   // 6
  89.   0x01, 0x1D, 0x03,   // 7
  90.   0x1F, 0x15, 0x1F,   // 8
  91.   0x17, 0x15, 0x1F,   // 9
  92.  
  93.   0x1E, 0x05, 0x1E,   // A
  94.   0x1F, 0x15, 0x0A,   // B
  95.   0x0E, 0x11, 0x11,   // C
  96.   0x1F, 0x11, 0x0E,   // D
  97.   0x1F, 0x15, 0x11,   // E
  98.   0x1F, 0x05, 0x01,   // F
  99.  
  100.   0x00, 0x00, 0x00,   // Leerzeichen
  101.   0x07, 0x05, 0x07,   // Grad
  102.   0x0E, 0x11, 0x11,   // C
  103.   0x00, 0x10, 0x00,   // Punkt
  104.   0x00, 0x0A, 0x00,   // Doppelpunkt
  105.   0x04, 0x04, 0x04,   // Minus
  106.   0x0C, 0x12, 0x1C,   // a
  107.   0x14, 0x1D, 0x10,   // i
  108.   0x1F, 0x02, 0x1F,   // M
  109.   0x0C, 0x12, 0x0C,   // o
  110.   0x1E, 0x04, 0x02,   // r
  111.   0x12, 0x15, 0x09,   // S
  112.   0x14, 0x08, 0x14,   // x
  113.   0x11, 0x1F, 0x11,   // I
  114.   0x0F, 0x10, 0x0F,   // V
  115.   0x1B, 0x04, 0x1B,   // X
  116.   0x1F, 0x10, 0x10,   // L
  117.   0x1F, 0x04, 0x1F,   // H
  118.   0x0E, 0x11, 0x0E,   // 0, rund
  119.   0x0F, 0x10, 0x10,   // l
  120.   0x1F, 0x05, 0x1F,   // A, eckig
  121.   0x1F, 0x10, 0x1F,   // U
  122.   0x1F, 0x04, 0x1C,   // h
  123.   0x1C, 0x04, 0x04,   // r, eckig
  124.   0x01, 0x1F, 0x01,   // T
  125.   0x0A, 0x0A, 0x0A,   // =
  126.   0x1F, 0x0A, 0x11,   // K
  127.   0x08, 0x04, 0x02,   // /
  128.   0x1F, 0x08, 0x1F    // W
  129. };
  130.  
  131. const char _A=10; // Hexzeichen
  132. const char _B=11;
  133. const char _C=12;
  134. const char _D=13;
  135. const char _E=14;
  136. const char _F=15;
  137.  
  138. // Kodierung der Sonderzeichen
  139.  
  140. const char Leerzeichen=16;
  141. const char Grad=17;
  142. const char Celsius=18;
  143. const char Punkt=19;
  144. const char Doppelpunkt=20;
  145. const char Minus=21;
  146.  
  147. // Kodierung der Zeichen für dem Wochentag
  148. const char _a=22;
  149. const char _i=23;
  150. const char _M=24;
  151. const char _o=25;
  152. const char _r=26;
  153. const char _S=27;
  154.  
  155. // für hexadezimale Anzeige
  156. const char _x=28;
  157.  
  158. // roemische Ziffern
  159. const char _I=29;
  160. const char _V=30;
  161. const char _X=31;
  162.  
  163. // Low und High
  164. const char _L=32;
  165. const char _H=33;
  166.  
  167. // Sonstige
  168. const char _O=34;  // rund
  169. const char _l=35;
  170. const char _A2=36; // eckig
  171. const char _U=37;
  172. const char _h=38;
  173. const char _r2=39; // eckig
  174. const char _T=40;
  175. const char Gleich=41; // z.B. für 20°C=68°F bzw. 20°C=193K
  176. const char _K=42;
  177. const char Geteilt=43; // z.B. für amrikanische Datumdarstellung
  178. const char _W=44;
  179. const char _O2=0;  // eckig
  180. const char Ende=0x7F;
  181.  
  182. const char WochenTagTexte[7][2]={{_M, _o}, {_D, _i}, {_M, _i}, {_D, _o}, {_F, _r}, {_S, _a} , {_S, _o}};
  183.  
  184. const char MaxTage[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  185.  
  186. const char WocheText[] PROGMEM={Punkt, _W, _O, _C, _H, _E, Ende};
  187.  
  188. const unsigned long MusterSpalten124[6]={0x442211, 0x112244, 0x142241, 0x412214, 0x0770, 0x7007};
  189. const byte MusterSpalten25[6]={0x25, 0x52, 0x55, 0x22, 0x07, 0x70};
  190. const byte MusterZeilen[2]={0x0A,0x15};
  191.  
  192. const char AnzahlVorhang=4;
  193. const byte MusterVorhang[AnzahlVorhang][3]={
  194.   {0x55,0x7F,0x7F},
  195.   {0x77,0x00,0x7F},
  196.   {0x77,0x00,0x00},
  197.   {0x7F,0x00,0x00}};
  198.  
  199. const byte RomZiffern[13] = {0x00, 0x01, 0x05, 0x15, 0x09, 0x02, 0x06, 0x16, 0x56, 0x0D, 0x03, 0x07, 0x17};
  200. //                                   I    II    III   IV     V    VI    VII   VIII   IX    X    XI    XII
  201. // binär: 00=leer, 01=I, 10=V, 11=X
  202. // z.B. 0x06 = 0b0110 = 01 10 = VI (von rechts nach links); 0x0D = 0b1101 = 11 01 = IX, 0x17 = 0b10111 = 01 01 11 = XII
  203.  
  204. const char UhrSpeicherAdr=0; // ab hier stehen die Zeidaten im DS1307
  205. const char WeckerSpeicherAdr=8; // ab hier Weckerdaten im DS1307 speichern
  206.  
  207. const char LeerMuster=0;
  208.  
  209. const char KeinTrenner   =0b00000;  // beim Stellen
  210. const char JahrTrenner   =0b00001;  // obere Punkt
  211. const char MonatTrenner  =0b00010;
  212. const char TagTrenner    =0b00100;
  213. const char StundenTrenner=0b01000;
  214. const char MinutenTrenner=0b10000; // unterer Punkt
  215.  
  216. const char WeckerWTagTrenner   =0b00011;  // 2 Punkte
  217. const char WeckerEinAusTrenner =0b00101;
  218. const char WeckerStundenTrenner=0b01001;
  219. const char WeckerMinutenTrenner=0b10001;
  220. const char WeckerAus=0; // = A
  221. const char WeckerEin=1; // = E
  222.  
  223. const char Montag=0;
  224. const char Dienstag=1;
  225. const char Mittwoch=2;
  226. const char Donnerstag=3;
  227. const char Freitag=4;
  228. const char Samstag=5;
  229. const char Sonntag=6;
  230. const char Wochentage=7;
  231.  
  232. const char KeinBalken=-1;
  233. const char LeerZahl=-11;
  234. const char GradCelsius=-23;
  235.  
  236. const int MaxAnzeigeDauer=2047;
  237. const byte MaxBlinkCount=10;
  238. const unsigned long MaxModusZeit=20000;
  239. const byte Prellzeit=2;  // 2 Durchgaenge zum entrpellen
  240. const char StellZeigeZeit=2;
  241.  
  242. const byte MaxWeckerSchellt=5; // max. 5 Minuten Weckerschellen
  243.  
  244. const byte ZeitStellModus=1; // Datum und Uhrzeit stellen
  245. const byte WeckerStellModus=ZeitStellModus+6; // Wecker stellen
  246.  
  247. const char AuswahlTastenBit=0;
  248. const char RueckTastenBit=1;
  249. const char VorTastenBit=2;
  250. const char XJ1_Bit=3; // zeige Datum zufällig: mit bzw. ohne Wochentag, mit bzw. ohne Jahr, Jahr 2 oder 4 stellig, mit Tag im Jahr, mit Kalenderwoche, amerikanisch
  251. const char XJ2_Bit=4; // zeige Uhrzeit: zufällig: von links nach rechts, von rechts nach links, auf Kopf, in Spiegelschrift, binär, hexadezimal, oktal, römisch, usw.
  252. const char XJ3_Bit=5; // zeige Temperatur zufällig: von links nach rechts, von rechts nach links, auf Kopf, in Spiegelschrift, binär, hexadezimal, oktal, usw.
  253. const char XJ4_Bit=6; // zeige Intermezzo zufällig: Laufschriften, Drehungen, Verschiebungen, Hampelmann, Wellen, usw.
  254. // XJ1 - XJ4 können kombiniert werden
  255.  
  256. const char TastenMaske=bit(AuswahlTastenBit)|bit(RueckTastenBit)|bit(VorTastenBit);
  257. const char JumperMaske=bit(XJ1_Bit)|bit(XJ2_Bit)|bit(XJ3_Bit)|bit(XJ4_Bit);
  258.  
  259. const char TemperaturKorrektur=-2;
  260.  
  261. const byte AlleZeilen=0x1F;
  262. const byte AlleSpalten=0x7F;
  263. const byte ZehnerSpalten=0x07;
  264. const byte EinerSpalten=0x70;
  265.  
  266. const char ZehnerPos=0;
  267. const char TrennerPos=3;
  268. const char EinerPos=4;
  269. const char LinkeSpalte=0;
  270. const char MitteSpalte=3;
  271. const char RechteSpalte=6;
  272. const char LinkeZehnerSpalte=0;
  273. const char RechteZehnerSpalte=2;
  274. const char LinkeEinerSpalte=4;
  275. const char RechteEinerSpalte=6;
  276.  
  277. const char ObereZeile=0;
  278. const char MitteZeile=2;
  279. const char UntereZeile=4;
  280. const char DummyZeile=5;
  281.  
  282. const char ZeichenBreite=3;
  283. const char GrosserAbstand=ZeichenBreite+1;
  284.  
  285. const byte Links=0;
  286. const byte Rechts=1;
  287. const byte Hoch=2;
  288. const byte Runter=3;
  289. const byte Innen=4;
  290. const byte Aussen=5;
  291. const byte LinksOben=6;
  292. const byte RechtsUnten=7;
  293. const byte LinksUnten=8;
  294. const byte RechtsOben=9;
  295.  
  296. const byte ZehnerZuerst=0;
  297. const byte EinerZuerst=1;
  298.  
  299. const byte PunktAus=0;
  300. const byte PunktEin=1;
  301. const byte PunktKopier=2;
  302.  
  303. const char LSB=0;
  304. const char MSB=7;
  305.  
  306. // const char x1=1;
  307. const int MinVariLaufgeschwindigkeit=4;
  308. const int MaxVariLaufgeschwindigkeit=10;
  309.  
  310. // Variablen
  311. char HauptMatrix[8];    // sichtbare Matrix
  312. char SchattenMatrix[8]; // versteckte Matrix zur Vorbereitung
  313.  
  314. char Stunden, Minuten, Sekunden;
  315. char WTag, Tag, Monat, Jahr;
  316. char Konfig;
  317. boolean UhrWurdeGestellt;
  318.  
  319. // Speicher für 7 Wecker (für jeden Wochentag einen)
  320. char WeckerMinuten[Wochentage], WeckerStunden[Wochentage], WeckerEinAus[Wochentage];
  321. char WeckerWTag;
  322. byte WeckerSchellt;
  323.  
  324. char Temperatur;
  325. char Fahrenheit;
  326. int Kelvin;
  327.  
  328. byte Modus;
  329. unsigned long Moduszeit;
  330. char StellDelta;
  331. char Abbruch;
  332.  
  333. const byte Keinedauer=0;
  334. byte Pausendauer;
  335. byte Zeigedauer;
  336. byte Laufgeschwindigkeit;
  337.  
  338. byte BlinkCount;
  339. char AktTasten;
  340. boolean PauseOk;
  341. boolean Nullunterdrueckung;
  342. char Balken;
  343. byte Richtung;
  344. byte ZufallWaagerecht1, ZufallWaagerecht2;
  345. byte ZufallSenkrecht1, ZufallSenkrecht2;
  346. byte Zufall4Richtungen, Zufall6Richtungen, Zufall10Richtungen;
  347. byte ZufallZuerst, ZufallBoolean1, ZufallBoolean2, ZufallBoolean3;
  348. byte ZufallArt16;
  349. char ZufallsZahlen[AnzahlLeds];
  350. char Zahl1, Zahl2;
  351. char AlteZahl;
  352. boolean ZeigeImmer;
  353. char BildVersatz;
  354.  
  355. //---------------------------------------------------------------------------
  356.  
  357. void TastenAuswertung() {
  358.   static byte PrellCount;
  359.   static byte TastenCount;
  360.   static boolean TastenSperre;
  361.   static char PrellTasten;
  362.   static char NeuTasten, AltTasten;
  363.  
  364.   AltTasten=NeuTasten;
  365.   if (AktTasten!=PrellTasten) {
  366.     PrellCount=0;
  367.   } else {
  368.     if (PrellCount<Prellzeit) {
  369.       PrellCount++;
  370.     } else {
  371.       NeuTasten=AktTasten;
  372.     }
  373.   }
  374.   PrellTasten=AktTasten;
  375.   if ((NeuTasten&TastenMaske)>0) {
  376.     if (WeckerSchellt>0) {
  377.       WeckerSchellt=0;
  378.       //???      digitalWrite(WeckerPin, LOW);
  379.     } else {
  380.       Moduszeit=millis();
  381.       if (bitRead(NeuTasten, AuswahlTastenBit)==1 && bitRead(AltTasten, AuswahlTastenBit)==0) {
  382.         TastenSperre=true;
  383.         if (bitRead(NeuTasten, VorTastenBit)==0 && bitRead(NeuTasten, RueckTastenBit)==0) {
  384.           if (Modus==0) {
  385.             Modus=WeckerStellModus;
  386.             WeckerWTag=WTag; // naechsten Wecker suchen
  387.             if (Stunden>WeckerStunden[WTag] || (Stunden==WeckerStunden[WTag] && Minuten>WeckerMinuten[WTag])) {
  388.               WeckerWTag++;
  389.               if (WeckerWTag>Sonntag) WeckerWTag=Montag;
  390.             }
  391.           }
  392.           else {
  393. //            if (Modus==WeckerStellModus+1 && WeckerEinAus[WeckerWTag]==WeckerAus)
  394. //              Modus=WeckerStellModus+4; // keine Zeit stellen, wenn Wecker aus
  395. //            else Modus++;
  396.             Modus++;
  397.           }
  398.         } else {
  399.           Modus=ZeitStellModus;
  400.         }
  401.         Abbruch=true;
  402.       }
  403.       if (Modus>0 && TastenSperre==false) {
  404.         if (TastenCount==0) {
  405.           if (bitRead(NeuTasten, VorTastenBit)==1)   StellDelta=1;
  406.           if (bitRead(NeuTasten, RueckTastenBit)==1) StellDelta=-1;
  407.           TastenCount=20;
  408.         }
  409.         else {
  410.           TastenCount--;
  411.         }
  412.       }
  413.     }
  414.   }  
  415.   else  {
  416.     TastenCount=0;
  417.     TastenSperre=false;
  418.   }
  419.   if (WeckerSchellt==0) digitalWrite(WeckerPin, LOW);
  420. }
  421.  
  422. //---------------------------------------------------------------------------
  423.  
  424. void Multiplexen(int AnzeigeDauer) {
  425.   for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++) {
  426.     char Muster=HauptMatrix[6-Spalte];
  427.  
  428.     // Dekoder (Spalte) ansteuern
  429.     for (char Bit=0; Bit<3; Bit++) digitalWrite(DecoderPins[Bit], bitRead(Spalte, Bit));
  430.  
  431.     // Kathoden ansteuern, Zeilen einschalten
  432.     for (char Zeile=ObereZeile; Zeile<=UntereZeile; Zeile++) digitalWrite(ZeilenPins[Zeile], bitRead(Muster, Zeile));
  433.     delayMicroseconds(AnzeigeDauer);
  434.  
  435.    // Zeilen ausschalten
  436.     for (char Zeile=ObereZeile; Zeile<=UntereZeile; Zeile++) digitalWrite(ZeilenPins[Zeile], LOW);
  437.     delayMicroseconds(MaxAnzeigeDauer-AnzeigeDauer);
  438.  
  439.     // Tasten/Jumper einlesen
  440.     bitWrite(AktTasten, Spalte, !digitalRead(TastenPin));
  441.   }
  442. }
  443.  
  444. //---------------------------------------------------------------------------
  445.  
  446. void ZeigeMatrix(byte ZeigeDauer) {
  447.   int AnzeigeDauer=2*analogRead(A0);
  448.   if (WeckerSchellt>0) AnzeigeDauer=MaxAnzeigeDauer-1;
  449.   AnzeigeDauer=constrain(AnzeigeDauer,1,MaxAnzeigeDauer-1);
  450.   AktTasten=0;
  451.   while (ZeigeDauer>0 && Abbruch==false) {
  452.     Multiplexen(AnzeigeDauer);
  453.     TastenAuswertung();
  454.     ZeigeDauer--;
  455.   }
  456.   BlinkCount++;
  457.   if (BlinkCount>MaxBlinkCount) BlinkCount=0;
  458. }
  459.  
  460. //---------------------------------------------------------------------------
  461.  
  462. boolean GeaendertMatrix() {
  463.   static char VergleichsMatrix[8];
  464.   boolean Unterschied=false;
  465.   for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++) {
  466.     if (HauptMatrix[Spalte]!=VergleichsMatrix[Spalte]) Unterschied=true;
  467.     VergleichsMatrix[Spalte]=HauptMatrix[Spalte];
  468.   }
  469.   return Unterschied;
  470. }
  471.  
  472. //---------------------------------------------------------------------------
  473.  
  474. void ZeigeMatrixLaufgeschwindigkeit() {
  475.   if (ZeigeImmer || GeaendertMatrix()) ZeigeMatrix(Laufgeschwindigkeit);
  476. }
  477.  
  478. //---------------------------------------------------------------------------
  479.  
  480. void ZeigeMatrixLaufgeschwindigkeit(boolean Zeigen) {
  481.   if (Zeigen==true) ZeigeMatrixLaufgeschwindigkeit();
  482. }
  483.  
  484. //---------------------------------------------------------------------------
  485.  
  486. void ZeigeMatrixZeigedauer() {
  487.   ZeigeMatrix(Zeigedauer);
  488. }
  489.  
  490. //---------------------------------------------------------------------------
  491.  
  492. void ZeigeMatrixZeigedauer(boolean Zeigen) {
  493.   if (Zeigen==true) ZeigeMatrixZeigedauer();
  494. }
  495.  
  496. //---------------------------------------------------------------------------
  497.  
  498. void ZeigeMatrixZeigedauer2() {
  499.   ZeigeMatrix(byte(Zeigedauer/2));
  500. }
  501.  
  502. //---------------------------------------------------------------------------
  503.  
  504. void ZeigeMatrixPausendauer() {
  505.    if (PauseOk==true) ZeigeMatrix(Pausendauer);
  506. }
  507.  
  508. //---------------------------------------------------------------------------
  509.  
  510. char BcdBin(char Bcd) {
  511.   return Bcd-(Bcd/16)*6;
  512. }
  513.  
  514. //---------------------------------------------------------------------------
  515.  
  516. char BinBcd(char Bin) {
  517.   return Bin+(Bin/10)*6;
  518. }
  519.  
  520. //---------------------------------------------------------------------------
  521.  
  522. char WochenTag(char Tag, char Monat, char Jahr) {
  523.   Jahr=Jahr+((Monat+9)/12)-1;
  524.   Monat=(Monat+9)%12;
  525.   int AnzahlDerTage=Jahr+(Jahr/4)+Monat*30+((6*Monat+5)/10)+Tag+1;
  526.   return AnzahlDerTage%Wochentage;
  527. }
  528.  
  529. //---------------------------------------------------------------------------
  530.  
  531. void SpeichereUhr() {
  532.   if  (UhrWurdeGestellt==true) {
  533.     WTag=WochenTag(Tag, Monat, Jahr);
  534.     Konfig=0x11;
  535.     Sekunden=0;
  536.     Wire.beginTransmission(DS1307_I2C_SlaveAdr);
  537.     Wire.write(UhrSpeicherAdr);
  538.     Wire.write(BinBcd(Sekunden));
  539.     Wire.write(BinBcd(Minuten));
  540.     Wire.write(BinBcd(Stunden));
  541.     Wire.write(WTag+1);
  542.     Wire.write(BinBcd(Tag));
  543.     Wire.write(BinBcd(Monat));
  544.     Wire.write(BinBcd(Jahr));
  545.     Wire.write(Konfig);
  546.     Wire.endTransmission();
  547.   }
  548.   UhrWurdeGestellt=false;
  549. }
  550.  
  551. //---------------------------------------------------------------------------
  552.  
  553. boolean HoleUhr() {
  554.   boolean UhrSteht=true;
  555.   char AltMinuten=Minuten;
  556.   Wire.beginTransmission(DS1307_I2C_SlaveAdr);
  557.   Wire.write(UhrSpeicherAdr);
  558.   Wire.endTransmission();
  559.  
  560.   Wire.requestFrom(DS1307_I2C_SlaveAdr, 8); // max. 32 Byte
  561.   if (Wire.available()==8) {
  562.     Sekunden=Wire.read();
  563.     UhrSteht=bitRead(Sekunden, MSB); // MSB 1 => Spannung war weg
  564.  
  565.     Sekunden=BcdBin(Sekunden);
  566.     Minuten=BcdBin(Wire.read());
  567.     Stunden=BcdBin(Wire.read());
  568.     WTag=Wire.read()-1;
  569.     Tag=BcdBin(Wire.read());
  570.     Monat=BcdBin(Wire.read());
  571.     Jahr=BcdBin(Wire.read());
  572.     Konfig=Wire.read();
  573.  
  574.     Sekunden=constrain(Sekunden, 0, 59);
  575.     Minuten=constrain(Minuten, 0, 59);
  576.     Stunden=constrain(Stunden, 0, 23);
  577.     WTag=constrain(WTag, Montag, Sonntag);
  578.     Tag=constrain(Tag, 1, MaxTage[Monat-1]);
  579.     Monat=constrain(Monat, 1, 12);
  580.     Jahr=constrain(Jahr, 0, 99);
  581.   }
  582.  
  583.   if (Minuten!=AltMinuten) {
  584.     if (WeckerEinAus[WTag]==WeckerEin && Minuten==WeckerMinuten[WTag] && Stunden==WeckerStunden[WTag]) {
  585.       WeckerSchellt=MaxWeckerSchellt;
  586.       digitalWrite(WeckerPin, HIGH);
  587.       Abbruch=true;
  588.     }
  589.     else  {
  590.       if (WeckerSchellt>0) {
  591.         WeckerSchellt--;
  592.       }
  593.     }
  594.   }
  595. //  Stunden=12;  Minuten=34; Sekunden=56; // zum testen
  596.   return !UhrSteht;
  597. }
  598.  
  599. //---------------------------------------------------------------------------
  600.  
  601. void SpeichereWecker() {
  602.   Wire.beginTransmission(DS1307_I2C_SlaveAdr);
  603.   Wire.write(WeckerSpeicherAdr);
  604.   for (char WeckerTag=Montag; WeckerTag<=Sonntag; WeckerTag++) {
  605.     Wire.write(WeckerMinuten[WeckerTag]);
  606.     Wire.write(WeckerStunden[WeckerTag]);
  607.     Wire.write(WeckerEinAus[WeckerTag]);
  608.   }
  609.   Wire.endTransmission();
  610. }
  611.  
  612. //---------------------------------------------------------------------------
  613.  
  614. void HoleWecker() {
  615.   Wire.beginTransmission(DS1307_I2C_SlaveAdr);
  616.   Wire.write(WeckerSpeicherAdr);
  617.   Wire.endTransmission();
  618.  
  619.   Wire.requestFrom(DS1307_I2C_SlaveAdr, 21); // max. 32 Byte
  620. //  while (Wire.available()!=21) ;
  621.   delay(10);
  622.   if (Wire.available()==21) {
  623.     for (char WeckerTag=Montag; WeckerTag<=Sonntag ; WeckerTag++) {
  624.       WeckerMinuten[WeckerTag]=Wire.read();
  625.       WeckerStunden[WeckerTag]=Wire.read();
  626.       WeckerEinAus[WeckerTag]=Wire.read();
  627.  
  628.       WeckerMinuten[WeckerTag]=constrain(WeckerMinuten[WeckerTag], 0, 59);
  629.       WeckerStunden[WeckerTag]=constrain(WeckerStunden[WeckerTag], 0, 23);
  630.       WeckerEinAus[WeckerTag]=constrain(WeckerEinAus[WeckerTag], WeckerAus, WeckerEin);
  631.     }
  632.   }
  633. }
  634.  
  635. //---------------------------------------------------------------------------
  636.  
  637. void HoleTemperatur() {
  638.   Temperatur=120;
  639.   byte Nachkomma;
  640.   Wire.beginTransmission(LM75_I2C_SlaveAdr);
  641.   Wire.write(0);
  642.   Wire.endTransmission();
  643.  
  644.   Wire.requestFrom(LM75_I2C_SlaveAdr, 2);
  645.   if (Wire.available()==2) {
  646.     Temperatur=Wire.read();
  647.     Nachkomma=Wire.read();
  648.     if (bitRead(Nachkomma,MSB)==1) Temperatur++; // Runden
  649.   }
  650.   Temperatur=Temperatur+TemperaturKorrektur;
  651.   Temperatur=constrain(Temperatur, 0, 99); // Temperatur auf 0..99 beschraenken
  652. //  Temperatur=23; // zum testen
  653.   Fahrenheit=(int(Temperatur)*9)/5+32;
  654.   Fahrenheit=constrain(Fahrenheit, 0, 99);
  655.   Kelvin=273+Temperatur;
  656. }
  657.  
  658. //---------------------------------------------------------------------------
  659. // Tools
  660. //---------------------------------------------------------------------------
  661.  
  662. const char AnzahlWarSchonDran=50;
  663.  
  664. boolean WarSchonDran(byte NeueZufallsZahl) {
  665.   static byte WarSchonZahlen[AnzahlWarSchonDran];
  666.   boolean SchonDa=false;
  667.   for (byte Test=0; Test<AnzahlWarSchonDran; Test++)
  668.     if (WarSchonZahlen[Test]==NeueZufallsZahl) SchonDa=true;
  669.   if (SchonDa==false) {
  670.     for (byte Test=0; Test<AnzahlWarSchonDran-1; Test++)
  671.      WarSchonZahlen[Test]=WarSchonZahlen[Test+1];
  672.     WarSchonZahlen[AnzahlWarSchonDran-1]=NeueZufallsZahl;
  673.   }
  674.   return SchonDa;
  675. }
  676.  
  677. //---------------------------------------------------------------------------
  678.  
  679. char Random(char Max) {
  680.   return random(Max);
  681. }
  682.  
  683. //---------------------------------------------------------------------------
  684.  
  685. char Random(char Von, char Bis) {
  686.   return random(Von, Bis);
  687. }
  688.  
  689. //---------------------------------------------------------------------------
  690.  
  691. void Tausche(char & Zahl1, char & Zahl2) {
  692.   char Hilf=Zahl1; Zahl1=Zahl2; Zahl2=Hilf;
  693. }
  694.  
  695. //---------------------------------------------------------------------------
  696.  
  697. static byte AlteLaufgeschwindigkeit;
  698.  
  699. void SetzeNeueLaufgeschwindigkeit(byte Neu) {
  700.   AlteLaufgeschwindigkeit=Laufgeschwindigkeit;
  701.   Laufgeschwindigkeit=Neu;
  702. }
  703.  
  704. //---------------------------------------------------------------------------
  705.  
  706. void ZurueckZurAltenLaufgeschwindigkeit() {
  707.   Laufgeschwindigkeit=AlteLaufgeschwindigkeit;
  708. }
  709.  
  710. //---------------------------------------------------------------------------
  711.  
  712. void RichtungUmkehr() {
  713.   Richtung=Richtung^1;
  714. }
  715.  
  716. //---------------------------------------------------------------------------
  717.  
  718. void ZufallZuerstUmkehr() {
  719.    ZufallZuerst=ZufallZuerst^1;
  720. }
  721.  
  722. //---------------------------------------------------------------------------
  723.  
  724. void LoescheMatrix(char Matrix[]) {
  725.   for (char Spalte=0; Spalte<8; Spalte++)
  726.     Matrix[Spalte]=0;
  727. }
  728.  
  729. //---------------------------------------------------------------------------
  730.  
  731. void LoescheHauptMatrix() {
  732.   LoescheMatrix(HauptMatrix);
  733. }
  734.  
  735. //---------------------------------------------------------------------------
  736.  
  737. void LoescheSchattenMatrix() {
  738.   LoescheMatrix(SchattenMatrix);
  739. }
  740.  
  741. //---------------------------------------------------------------------------
  742.  
  743. void KopiereMatrixSpaltenVonBis(char Matrix1[], char Matrix2[], char VonSpalte, char BisSpalte) {
  744.   for (char Spalte=VonSpalte; Spalte<=BisSpalte; Spalte++)
  745.     Matrix1[Spalte]=Matrix2[Spalte];
  746. }
  747.  
  748. //---------------------------------------------------------------------------
  749.  
  750. void KopiereGanzeMatrix(char Matrix1[], char Matrix2[]) {
  751.   KopiereMatrixSpaltenVonBis(Matrix1, Matrix2, LinkeSpalte, RechteSpalte);
  752. }
  753.  
  754. //---------------------------------------------------------------------------
  755.  
  756. void TauscheMatrix() {
  757.   for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++)
  758.     Tausche(HauptMatrix[Spalte], SchattenMatrix[Spalte]);
  759. }
  760.  
  761. //---------------------------------------------------------------------------
  762.  
  763. char HolePunkt(char Matrix[], char x, char y) {
  764.   return bitRead(Matrix[x],y);
  765. }
  766.  
  767. //---------------------------------------------------------------------------
  768.  
  769. char HolePunktNr(char Matrix[], char Nr) {
  770.   return HolePunkt(Matrix, Nr%AnzahlSpalten, Nr/AnzahlSpalten);
  771. }
  772.  
  773. //---------------------------------------------------------------------------
  774.  
  775. void SetzePunkt(char Matrix[], char x, char y, char Punkt) {
  776.   if (x>=LinkeSpalte&&x<=RechteSpalte)
  777.     bitWrite(Matrix[x], y, Punkt);
  778. }
  779.  
  780. //---------------------------------------------------------------------------
  781.  
  782. void SetzePunktHauptMatrix(char x, char y, char Punkt) {
  783.   SetzePunkt(HauptMatrix, x, y,Punkt);
  784. }
  785.  
  786. //---------------------------------------------------------------------------
  787.  
  788. void SetzePunktNr(char Matrix[], char Nr, char Punkt) {
  789.   SetzePunkt(Matrix, Nr%AnzahlSpalten, Nr/AnzahlSpalten, Punkt);
  790. }
  791.  
  792. //---------------------------------------------------------------------------
  793.  
  794. void SetzePunktNrHauptMatrix(char Nr, char Punkt) {
  795.   SetzePunktHauptMatrix(Nr%AnzahlSpalten, Nr/AnzahlSpalten, Punkt);
  796. }
  797.  
  798. //---------------------------------------------------------------------------
  799.  
  800. void SetzeKopierePunkt(char x, char y, byte PunktArt, byte Dauer) {
  801.   byte Punkt1=HolePunkt(HauptMatrix, x, y);
  802.   byte Punkt2=HolePunkt(SchattenMatrix, x, y);
  803.   if (PunktArt<PunktKopier) Punkt2=PunktArt;
  804.   if (Punkt1!=Punkt2) {
  805.     SetzePunktHauptMatrix(x, y, Punkt2);
  806.     ZeigeMatrix(Dauer);
  807.   }
  808. }
  809.  
  810. //---------------------------------------------------------------------------
  811.  
  812. void SetzeKopierePunktLaufgeschwindigkeit(char x, char y, char PunktArt) {
  813.   SetzeKopierePunkt(x, y, PunktArt, Laufgeschwindigkeit);
  814. }
  815.  
  816. //---------------------------------------------------------------------------
  817.  
  818. char HoleSpalte(char Matrix[], char Spalte) {
  819.   return Matrix[Spalte];
  820. }
  821.  
  822. //---------------------------------------------------------------------------
  823.  
  824. char HoleSpalteSchattenMatrix(char Spalte) {
  825.   return SchattenMatrix[Spalte];
  826. }
  827.  
  828. //---------------------------------------------------------------------------
  829.  
  830. char HoleSpalteHauptMatrix(char Spalte) {
  831.   return HauptMatrix[Spalte];
  832. }
  833.  
  834. //---------------------------------------------------------------------------
  835.  
  836. void SetzeSpalte(char Matrix[], char Spalte, char Muster) {
  837.   if (Spalte>=LinkeSpalte&&Spalte<=RechteSpalte) {
  838.     Matrix[Spalte]=Muster;
  839.   }
  840. }
  841.  
  842. //---------------------------------------------------------------------------
  843.  
  844. void SetzeSpalteHauptMatrix(char Spalte, char Muster) {
  845.   SetzeSpalte(HauptMatrix, Spalte, Muster);
  846. }
  847.  
  848. //---------------------------------------------------------------------------
  849.  
  850. void SetzeSpaltenBalken(char Spalte) {
  851.   if(Balken!=KeinBalken) SetzeSpalteHauptMatrix(Spalte, Balken);
  852. }
  853.  
  854. //---------------------------------------------------------------------------
  855.  
  856. void SetzeSpalteSchattenMatrix(char Spalte, char Muster) {
  857.   SetzeSpalte(SchattenMatrix, Spalte, Muster);
  858. }
  859.  
  860. //---------------------------------------------------------------------------
  861.  
  862. char HoleZeile(char Matrix[], char Zeile) {
  863.   char Muster=0;
  864.   if (Zeile>=ObereZeile&&Zeile<=UntereZeile) {
  865.     for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++)
  866.       bitWrite(Muster, Spalte, bitRead(Matrix[Spalte], Zeile));
  867.     }
  868.   return Muster;
  869. }
  870.  
  871. //---------------------------------------------------------------------------
  872.  
  873. char HoleZeileHauptMatrix(char Zeile) {
  874.   return HoleZeile(HauptMatrix, Zeile);
  875. }
  876.  
  877. //---------------------------------------------------------------------------
  878.  
  879. char HoleZeileSchattenMatrix(char Zeile) {
  880.   return HoleZeile(SchattenMatrix, Zeile);
  881. }
  882.  
  883. //---------------------------------------------------------------------------
  884.  
  885. void SetzeZeile(char Matrix[], char Zeile, char Muster) {
  886.   for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++)
  887.     bitWrite(Matrix[Spalte], Zeile, bitRead(Muster, Spalte));
  888. }
  889.  
  890. //---------------------------------------------------------------------------
  891.  
  892. void SetzeZeileHauptMatrix(char Zeile, char Muster) {
  893.   SetzeZeile(HauptMatrix, Zeile, Muster);
  894. }
  895.  
  896. //---------------------------------------------------------------------------
  897.  
  898. void SetzeZeileSchattenMatrix(char Zeile, char Muster) {
  899.   SetzeZeile(SchattenMatrix, Zeile, Muster);
  900. }
  901.  
  902. //---------------------------------------------------------------------------
  903.  
  904. void SetzeZeilenBalken(char Zeile) {
  905.   if(Balken!=KeinBalken) SetzeZeile(HauptMatrix, Zeile, Balken);
  906. }
  907.  
  908. //---------------------------------------------------------------------------
  909.  
  910. void SpiegelSpalten(char Matrix[]) {
  911.   for (char Spalte=0; Spalte<ZeichenBreite; Spalte++)
  912.     Tausche(Matrix[Spalte],Matrix[RechteSpalte-Spalte]);
  913. }
  914.  
  915. //---------------------------------------------------------------------------
  916.  
  917. void SpiegelSpaltenSchattenMatrix() {
  918.   SpiegelSpalten(SchattenMatrix);
  919. }
  920.  
  921. //---------------------------------------------------------------------------
  922.  
  923. void SpiegelZeilen(char Matrix[]) {
  924.   char Hilf;
  925.   for (char Zeile=0; Zeile<=1; Zeile++) {
  926.     Hilf=HoleZeile(Matrix,Zeile);
  927.     SetzeZeile(Matrix,Zeile,HoleZeile(Matrix,UntereZeile-Zeile));
  928.     SetzeZeile(Matrix,UntereZeile-Zeile,Hilf);
  929.   }
  930. }
  931.  
  932. //---------------------------------------------------------------------------
  933.  
  934. void SpiegelZeilenSchattenMatrix() {
  935.   SpiegelZeilen(SchattenMatrix);
  936. }
  937.  
  938. //---------------------------------------------------------------------------
  939.  
  940. void SetzeZeichen(char Matrix[], char Zeichen, char Pos) {
  941.   for (byte Spalte=0; Spalte<ZeichenBreite; Spalte++)  {
  942.     SetzeSpalte(Matrix, Pos+Spalte, pgm_read_byte(CodeTab+ZeichenBreite*Zeichen+Spalte));
  943.   }
  944. }
  945.  
  946. //---------------------------------------------------------------------------
  947.  
  948. void SetzeZehner(char Matrix[], char Zehner) {
  949.   if (Zehner<0) Zehner=15-Zehner; // Grad, Celsius, ...
  950.   SetzeZeichen(Matrix, Zehner, ZehnerPos);
  951. }
  952.  
  953. //---------------------------------------------------------------------------
  954.  
  955. void SetzeEiner(char Matrix[], char Einer) {
  956.   if (Einer<0) Einer=15-Einer;  // Grad, Celsius, ...
  957.   SetzeZeichen(Matrix, Einer, EinerPos);
  958. }
  959.  
  960. //---------------------------------------------------------------------------
  961.  
  962. void SetzeZahl(char Matrix[], char Zahl, char Trenner) {
  963.   LoescheMatrix(Matrix);
  964.   char Zehner=Zahl/10;
  965.   char Einer=Zahl%10;
  966.   if (Zehner==0 && Nullunterdrueckung==true) Zehner=Leerzeichen;
  967.   SetzeZehner(Matrix, Zehner);
  968.   Matrix[3]=Trenner;
  969.   SetzeEiner(Matrix, Einer);
  970. }
  971.  
  972. //---------------------------------------------------------------------------
  973.  
  974. void SetzeZahl(char Matrix[], char Zahl) {
  975.   SetzeZahl(Matrix, Zahl, KeinTrenner);
  976. }
  977.  
  978. //---------------------------------------------------------------------------
  979.  
  980. void SetzeZahlHauptMatrix(char Zahl) {
  981.   SetzeZahl(HauptMatrix, Zahl, KeinTrenner);
  982. }
  983.  
  984. //---------------------------------------------------------------------------
  985.  
  986. void ZeigeSetzeZahlHauptMatrix(char Zahl) {
  987.   SetzeZahlHauptMatrix(Zahl);
  988.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  989. }
  990.  
  991. //---------------------------------------------------------------------------
  992.  
  993. void SetzeZahlSchattenMatrix(char Zahl) {
  994.   SetzeZahl(SchattenMatrix, Zahl, KeinTrenner);
  995. }
  996.  
  997. //---------------------------------------------------------------------------
  998.  
  999. void ZeigeSetzeZehner(char Zahl, byte Dauer) {
  1000.   SetzeZahlSchattenMatrix(Zahl);
  1001.   KopiereMatrixSpaltenVonBis(HauptMatrix, SchattenMatrix, LinkeZehnerSpalte, RechteZehnerSpalte);
  1002.   ZeigeMatrix(Dauer);
  1003. }
  1004.  
  1005. //---------------------------------------------------------------------------
  1006.  
  1007. void ZeigeSetzeEiner(char Zahl, byte Dauer) {
  1008.   SetzeZahlSchattenMatrix(Zahl);
  1009.   KopiereMatrixSpaltenVonBis(HauptMatrix, SchattenMatrix, LinkeEinerSpalte, RechteEinerSpalte);
  1010.   ZeigeMatrix(Dauer);
  1011. }
  1012.  
  1013. //---------------------------------------------------------------------------
  1014.  
  1015. void ZeigeSetzeZehnerEiner(char Zahl, byte Dauer) {
  1016.   if (ZufallZuerst==ZehnerZuerst)
  1017.     ZeigeSetzeZehner(Zahl, Dauer);
  1018.   else
  1019.     ZeigeSetzeEiner(Zahl, Dauer);
  1020. }
  1021.  
  1022. //---------------------------------------------------------------------------
  1023.  
  1024. void ZeigeSetzeZahlZehnerEiner(char Zahl) {
  1025.   ZeigeSetzeZehnerEiner(Zahl, Zeigedauer/2);
  1026.   ZufallZuerstUmkehr();
  1027.   ZeigeSetzeZehnerEiner(Zahl, Zeigedauer);
  1028.   ZufallZuerstUmkehr();
  1029. }
  1030.  
  1031. //---------------------------------------------------------------------------
  1032.  
  1033. void SetzeKopiereDiagonale(char Diagonale, byte Spiegel, byte PunktArt) {
  1034.   for (char x=LinkeSpalte; x<=RechteSpalte; x++) {
  1035.     for (char y=ObereZeile; y<=UntereZeile; y++) {
  1036.       char x2=x; if (bitRead(Spiegel,0)) x2=RechteSpalte-x; // x spiegeln
  1037.       char y2=y; if (bitRead(Spiegel,1)) y2=UntereZeile-y;  // y speigeln
  1038.       if (x+y==Diagonale) {
  1039.         SetzeKopierePunkt(x2, y2, PunktArt, Keinedauer);
  1040.       }
  1041.     }
  1042.   }
  1043. }
  1044.  
  1045. //---------------------------------------------------------------------------
  1046.  
  1047. void KopiereDiagonalLaufgeschwindigkeit(byte Spiegel) {
  1048.   for (char d=0; d<=(AnzahlZeilen-1)+(AnzahlSpalten-1); d++) {
  1049.     if (Balken!=KeinBalken) SetzeKopiereDiagonale(d, Spiegel, PunktEin);
  1050.     ZeigeMatrixLaufgeschwindigkeit();
  1051.     SetzeKopiereDiagonale(d, Spiegel, PunktKopier);
  1052.   }
  1053. }
  1054.  
  1055. //---------------------------------------------------------------------------
  1056.  
  1057. void KopiereLinksLaufgeschwindigkeit() {
  1058.   for (char Spalte=RechteSpalte; Spalte>=LinkeSpalte; Spalte--) {
  1059.     SetzeSpaltenBalken(Spalte);
  1060.     ZeigeMatrixLaufgeschwindigkeit();
  1061.     SetzeSpalteHauptMatrix(Spalte, HoleSpalteSchattenMatrix(Spalte));
  1062.   }
  1063.   ZeigeMatrixLaufgeschwindigkeit();
  1064. }
  1065.  
  1066. //---------------------------------------------------------------------------
  1067.  
  1068. void KopiereRechtsLaufgeschwindigkeit() {
  1069.   for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++) {
  1070.     SetzeSpaltenBalken(Spalte);
  1071.     ZeigeMatrixLaufgeschwindigkeit();
  1072.     SetzeSpalteHauptMatrix(Spalte, HoleSpalteSchattenMatrix(Spalte));
  1073.   }
  1074.   ZeigeMatrixLaufgeschwindigkeit();
  1075. }
  1076.  
  1077. //---------------------------------------------------------------------------
  1078.  
  1079. void KopiereHochLaufgeschwindigkeit() {
  1080.   for (char Zeile=UntereZeile; Zeile>=ObereZeile; Zeile--) {
  1081.     SetzeZeilenBalken(Zeile);
  1082.     ZeigeMatrixLaufgeschwindigkeit();
  1083.     SetzeZeileHauptMatrix(Zeile, HoleZeileSchattenMatrix(Zeile));
  1084.   }
  1085.   ZeigeMatrixLaufgeschwindigkeit();
  1086. }
  1087.  
  1088. //---------------------------------------------------------------------------
  1089.  
  1090. void KopiereRunterLaufgeschwindigkeit() {
  1091.   for (char Zeile=ObereZeile; Zeile<=UntereZeile; Zeile++) {
  1092.     SetzeZeilenBalken(Zeile);
  1093.     ZeigeMatrixLaufgeschwindigkeit();
  1094.     SetzeZeileHauptMatrix(Zeile, HoleZeileSchattenMatrix(Zeile));
  1095.   }
  1096.   ZeigeMatrixLaufgeschwindigkeit();
  1097. }
  1098.  
  1099. //---------------------------------------------------------------------------
  1100.  
  1101. void KopiereInnenLaufgeschwindigkeit() {
  1102.   for (char Spalte=0; Spalte<=ZeichenBreite; Spalte++) {
  1103.     SetzeSpaltenBalken(Spalte);
  1104.     SetzeSpaltenBalken(RechteSpalte-Spalte);
  1105.     ZeigeMatrixLaufgeschwindigkeit();
  1106.     SetzeSpalteHauptMatrix(Spalte, HoleSpalteSchattenMatrix(Spalte));
  1107.     SetzeSpalteHauptMatrix(RechteSpalte-Spalte, HoleSpalteSchattenMatrix(RechteSpalte-Spalte));
  1108.   }
  1109.   ZeigeMatrixLaufgeschwindigkeit();
  1110. }
  1111.  
  1112. //---------------------------------------------------------------------------
  1113.  
  1114. void KopiereAussenLaufgeschwindigkeit() {
  1115.   for (char Spalte=0; Spalte<=ZeichenBreite; Spalte++) {
  1116.     SetzeSpaltenBalken(MitteSpalte+Spalte);
  1117.     SetzeSpaltenBalken(MitteSpalte-Spalte);
  1118.     ZeigeMatrixLaufgeschwindigkeit();
  1119.     SetzeSpalteHauptMatrix(MitteSpalte+Spalte, HoleSpalteSchattenMatrix(MitteSpalte+Spalte));
  1120.     SetzeSpalteHauptMatrix(MitteSpalte-Spalte, HoleSpalteSchattenMatrix(MitteSpalte-Spalte));
  1121.   }
  1122.   ZeigeMatrixLaufgeschwindigkeit();
  1123. }
  1124.  
  1125. //---------------------------------------------------------------------------
  1126.  
  1127. void KopiereLaufgeschwindigkeit() {
  1128.   switch(Richtung) {
  1129.     case Links:  KopiereLinksLaufgeschwindigkeit();  break;
  1130.     case Rechts: KopiereRechtsLaufgeschwindigkeit(); break;
  1131.     case Hoch:   KopiereHochLaufgeschwindigkeit();   break;
  1132.     case Runter: KopiereRunterLaufgeschwindigkeit(); break;
  1133.     case Innen:  KopiereInnenLaufgeschwindigkeit();   break;
  1134.     case Aussen: KopiereAussenLaufgeschwindigkeit(); break;
  1135.     case LinksOben:
  1136.     case RechtsOben:
  1137.     case LinksUnten:
  1138.     case RechtsUnten: KopiereDiagonalLaufgeschwindigkeit(Richtung-LinksOben); break;
  1139.   }
  1140. }
  1141.  
  1142. //---------------------------------------------------------------------------
  1143.  
  1144. void ZeigeKopiere() {
  1145.   KopiereLaufgeschwindigkeit();
  1146.   ZeigeMatrixZeigedauer();
  1147. }
  1148.  
  1149. //---------------------------------------------------------------------------
  1150.  
  1151. void KopiereSpaltenHochLaufgeschwindigkeit(byte SchiebeSpalten) {
  1152.   for (char BitZeile=bit(UntereZeile+1); BitZeile>=bit(ObereZeile); BitZeile=BitZeile>>1) {
  1153.     char BitZeile2=~BitZeile;
  1154.     for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++)
  1155.       if (bitRead(SchiebeSpalten, Spalte)==1)
  1156.         HauptMatrix[Spalte]=(HauptMatrix[Spalte]&BitZeile2) | (SchattenMatrix[Spalte]&BitZeile);
  1157.     ZeigeMatrixLaufgeschwindigkeit();
  1158.   }
  1159. }
  1160.  
  1161. //---------------------------------------------------------------------------
  1162.  
  1163. void KopiereSpaltenRunterLaufgeschwindigkeit(byte KopierSpalten) {
  1164.   for (char BitZeile=bit(ObereZeile); BitZeile<=bit(UntereZeile); BitZeile=BitZeile<<1) {
  1165.     char BitZeile2=~BitZeile;
  1166.     for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++)
  1167.       if (bitRead(KopierSpalten, Spalte)==1)
  1168.         HauptMatrix[Spalte]=(HauptMatrix[Spalte]&BitZeile2) | (SchattenMatrix[Spalte]&BitZeile);
  1169.     ZeigeMatrixLaufgeschwindigkeit();
  1170.   }
  1171. }
  1172.  
  1173. //---------------------------------------------------------------------------
  1174.  
  1175. void KopiereSpaltenSenkrechtLaufgeschwindigkeit(byte KopierSpalten) {
  1176.   switch(Richtung) {
  1177.     case Hoch:   KopiereSpaltenHochLaufgeschwindigkeit(KopierSpalten); break;
  1178.     case Runter: KopiereSpaltenRunterLaufgeschwindigkeit(KopierSpalten); break;
  1179.   }
  1180. }
  1181.  
  1182. //---------------------------------------------------------------------------
  1183.  
  1184. void KopiereNachAussenGleichzeitigLaufgeschwindigkeit() {
  1185.   for (char Spalte=ZeichenBreite-1; Spalte>=0; Spalte--) {
  1186.     HauptMatrix[Spalte]=SchattenMatrix[Spalte];
  1187.     HauptMatrix[RechteSpalte-Spalte]=SchattenMatrix[RechteSpalte-Spalte];
  1188.     ZeigeMatrixLaufgeschwindigkeit();
  1189.   }
  1190. }
  1191.  
  1192. //---------------------------------------------------------------------------
  1193.  
  1194. void KopiereNachInnenGleichzeitigLaufgeschwindigkeit() {
  1195.   for (char Spalte=0; Spalte<ZeichenBreite; Spalte++) {
  1196.     HauptMatrix[Spalte]=SchattenMatrix[Spalte];
  1197.     HauptMatrix[RechteSpalte-Spalte]=SchattenMatrix[RechteSpalte-Spalte];
  1198.     ZeigeMatrixLaufgeschwindigkeit();
  1199.   }
  1200. }
  1201.  
  1202. //---------------------------------------------------------------------------
  1203.  
  1204. char SchiebeSpaltenLinksVonBis(char Matrix[], char VonSpalte, char BisSpalte, char NeueSpalte) {
  1205.   char AlteSpalte=HoleSpalte(Matrix, VonSpalte);
  1206.   for (char Spalte=VonSpalte; Spalte<BisSpalte; Spalte++)
  1207.     SetzeSpalte(Matrix,Spalte,HoleSpalte(Matrix,Spalte+1));
  1208.   SetzeSpalte(Matrix,BisSpalte,NeueSpalte);
  1209.   return AlteSpalte;
  1210. }
  1211.  
  1212. //---------------------------------------------------------------------------
  1213.  
  1214. char SchiebeSpaltenLinksVonBisHauptMatrix(char VonSpalte, char BisSpalte, char NeueSpalte) {
  1215.   return SchiebeSpaltenLinksVonBis(HauptMatrix, VonSpalte, BisSpalte, NeueSpalte);
  1216. }
  1217.  
  1218. //---------------------------------------------------------------------------
  1219.  
  1220. char SchiebeSpaltenLinksVonBisSchattenMatrix(char VonSpalte, char BisSpalte, char NeueSpalte) {
  1221.   return SchiebeSpaltenLinksVonBis(SchattenMatrix, VonSpalte, BisSpalte, NeueSpalte);
  1222. }
  1223.  
  1224. //---------------------------------------------------------------------------
  1225.  
  1226. void SchiebeLeereSpalteLinksHauptMatrix() {
  1227.   SchiebeSpaltenLinksVonBis(HauptMatrix, LinkeSpalte, RechteSpalte, LeerMuster);
  1228. }
  1229.  
  1230. //---------------------------------------------------------------------------
  1231.  
  1232. char SchiebeSpaltenRechtsVonBis(char Matrix[], char VonSpalte, char BisSpalte, char NeueSpalte) {
  1233.   char AlteSpalte=HoleSpalte(Matrix,BisSpalte);
  1234.   for (char Spalte=BisSpalte; Spalte>VonSpalte; Spalte--)
  1235.     SetzeSpalte(Matrix,Spalte,HoleSpalte(Matrix,Spalte-1));
  1236.   SetzeSpalte(Matrix,VonSpalte,NeueSpalte);
  1237.   return AlteSpalte;
  1238. }
  1239.  
  1240. //---------------------------------------------------------------------------
  1241.  
  1242. char SchiebeSpaltenRechtsVonBisHauptMatrix(char VonSpalte, char BisSpalte, char NeueSpalte) {
  1243.   return SchiebeSpaltenRechtsVonBis(HauptMatrix, VonSpalte, BisSpalte, NeueSpalte);
  1244. }
  1245.  
  1246. //---------------------------------------------------------------------------
  1247.  
  1248. char SchiebeSpaltenRechtsVonBisSchattenMatrix(char VonSpalte, char BisSpalte, char NeueSpalte) {
  1249.   return SchiebeSpaltenRechtsVonBis(SchattenMatrix, VonSpalte, BisSpalte, NeueSpalte);
  1250. }
  1251.  
  1252. //---------------------------------------------------------------------------
  1253.  
  1254. void SchiebeLeereSpalteRechtsHauptMatrix() {
  1255.   SchiebeSpaltenRechtsVonBisHauptMatrix(LinkeSpalte, RechteSpalte, LeerMuster);
  1256. }
  1257.  
  1258. //---------------------------------------------------------------------------
  1259.  
  1260. void SchiebeAlleSpaltenLinksRechtsLaufgeschwindigkeit() {
  1261.   for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++) {
  1262.     switch(Richtung){
  1263.       case Links:
  1264.         SchiebeSpaltenLinksVonBisHauptMatrix(LinkeSpalte,RechteSpalte,
  1265.           SchiebeSpaltenLinksVonBisSchattenMatrix(LinkeSpalte,RechteSpalte,LeerMuster));
  1266.         break;
  1267.       case Rechts:
  1268.         SchiebeSpaltenRechtsVonBisHauptMatrix(LinkeSpalte,RechteSpalte,
  1269.           SchiebeSpaltenRechtsVonBisSchattenMatrix(LinkeSpalte,RechteSpalte,LeerMuster));
  1270.         break;
  1271.     }
  1272.     ZeigeMatrixLaufgeschwindigkeit();
  1273.   }
  1274. }
  1275.  
  1276. //---------------------------------------------------------------------------
  1277.  
  1278. char SchiebeSpaltenVonBisHoch(char Matrix[], char VonSpalte, char BisSpalte, char NeueZeile) {
  1279.   char AlteZeile=HoleZeile(Matrix,ObereZeile);
  1280.   for (char Spalte=VonSpalte; Spalte<=BisSpalte; Spalte++)
  1281.     SetzeSpalte(Matrix,Spalte,(HoleSpalte(Matrix,Spalte)>>1)+bit(UntereZeile+1)*bitRead(NeueZeile,Spalte));
  1282.   return AlteZeile;
  1283. }
  1284.  
  1285. //---------------------------------------------------------------------------
  1286.  
  1287. void SchiebeLeereZeileHochHauptMatrix() {
  1288.   SchiebeSpaltenVonBisHoch(HauptMatrix, LinkeSpalte, RechteSpalte, LeerMuster);
  1289. }
  1290.  
  1291. //---------------------------------------------------------------------------
  1292.  
  1293. char SchiebeSpaltenVonBisRunter(char Matrix[], char VonSpalte, char BisSpalte, char NeueZeile) {
  1294.   char AlteZeile=HoleZeile(Matrix,DummyZeile);
  1295.   for (char Spalte=VonSpalte; Spalte<=BisSpalte; Spalte++)
  1296.     SetzeSpalte(Matrix,Spalte,(HoleSpalte(Matrix,Spalte)<<1)+bitRead(NeueZeile,Spalte));
  1297.   return AlteZeile;
  1298. }
  1299.  
  1300. //---------------------------------------------------------------------------
  1301.  
  1302. void SchiebeLeereZeileRunterHauptMatrix() {
  1303.   SchiebeSpaltenVonBisRunter(HauptMatrix, LinkeSpalte, RechteSpalte, LeerMuster);
  1304. }
  1305.  
  1306. //---------------------------------------------------------------------------
  1307.  
  1308. char SchiebeSpaltenKodiertHoch1x(char Matrix[], byte SchiebeSpalten, char NeueZeile) {
  1309.   char AlteZeile=0;
  1310.   for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++) {
  1311.     if (bitRead(SchiebeSpalten, Spalte)==1) {
  1312.       bitWrite(AlteZeile, Spalte, bitRead(Matrix[Spalte], ObereZeile));
  1313.       Matrix[Spalte]=Matrix[Spalte]>>1;
  1314.       bitWrite(Matrix[Spalte], DummyZeile, bitRead(NeueZeile, Spalte));
  1315.     }
  1316.   }
  1317.   return AlteZeile;
  1318. }
  1319.  
  1320. //---------------------------------------------------------------------------
  1321.  
  1322. char SchiebeSpaltenKodiertRunter1x(char Matrix[], byte SchiebeSpalten, char NeueZeile) {
  1323.   char AlteZeile=0;
  1324.   for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++) {
  1325.     if (bitRead(SchiebeSpalten, Spalte)==1) {
  1326.       bitWrite(AlteZeile, Spalte, bitRead(Matrix[Spalte], DummyZeile));
  1327.       Matrix[Spalte]=Matrix[Spalte]<<1;
  1328.       bitWrite(Matrix[Spalte], ObereZeile, bitRead(NeueZeile, Spalte));
  1329.     }
  1330.   }
  1331.   return AlteZeile;
  1332. }
  1333.  
  1334. //---------------------------------------------------------------------------
  1335.  
  1336. void SchiebeSpaltenHochRunterKodiert(char Anzahl, byte SchiebeSpalten, byte Dauer) {
  1337.   for (char anz=0; anz<Anzahl; anz++) {
  1338.     if (Richtung==Hoch)
  1339.       SchiebeSpaltenKodiertHoch1x(HauptMatrix, SchiebeSpalten, SchiebeSpaltenKodiertHoch1x(SchattenMatrix, SchiebeSpalten, LeerMuster));
  1340.     else
  1341.       SchiebeSpaltenKodiertRunter1x(HauptMatrix, SchiebeSpalten, SchiebeSpaltenKodiertRunter1x(SchattenMatrix, SchiebeSpalten, LeerMuster));
  1342.     ZeigeMatrix(Dauer);
  1343.   }
  1344. }
  1345.  
  1346. //---------------------------------------------------------------------------
  1347.  
  1348. void SchiebeSpaltenHochRunterKodiertLaufgeschwindigkeit(char Anzahl, byte SchiebeSpalten) {
  1349.   SchiebeSpaltenHochRunterKodiert(Anzahl, SchiebeSpalten, Laufgeschwindigkeit);
  1350. }
  1351.  
  1352.  
  1353. //---------------------------------------------------------------------------
  1354.  
  1355. void SchiebeSpalten6xHochRunterLaufgeschwindigkeit(unsigned long SchiebeSpalten) {
  1356.   while (SchiebeSpalten!=0) {
  1357.     SchiebeSpaltenHochRunterKodiert(6, lowByte(SchiebeSpalten), Laufgeschwindigkeit);
  1358.     SchiebeSpalten=SchiebeSpalten>>8;
  1359.   }
  1360. }
  1361.  
  1362. //---------------------------------------------------------------------------
  1363.  
  1364. void SchiebeSpalten12(byte SchiebeSpalten, byte Richtung1, byte Richtung2) {
  1365.   Richtung=Richtung1;
  1366.   SchiebeSpalten6xHochRunterLaufgeschwindigkeit(SchiebeSpalten);
  1367.   Richtung=Richtung2;
  1368.   SchiebeSpalten6xHochRunterLaufgeschwindigkeit(SchiebeSpalten^AlleSpalten);
  1369. }
  1370.  
  1371. //---------------------------------------------------------------------------
  1372.  
  1373. void SchiebeSpalten25GleichzeitigLaufgeschwindigkeit(byte SchiebeSpalten) {
  1374.   for (char Zeile=0; Zeile<=AnzahlZeilen; Zeile++) {
  1375.     SchiebeSpaltenHochRunterKodiert(1, SchiebeSpalten, Keinedauer);
  1376.     RichtungUmkehr();
  1377.     SchiebeSpaltenHochRunterKodiertLaufgeschwindigkeit(1, SchiebeSpalten^AlleSpalten);
  1378.     RichtungUmkehr();
  1379.   }
  1380. }
  1381.  
  1382. //---------------------------------------------------------------------------
  1383.  
  1384. void SchiebeZeilenKodiertLinks(byte SchiebeZeilen, byte Dauer) {
  1385.   for (char Zeile=ObereZeile; Zeile<=UntereZeile; Zeile++) {
  1386.     if (bitRead(SchiebeZeilen,Zeile)==1) {
  1387.       char ZeilenMuster1=HoleZeileHauptMatrix(Zeile);
  1388.       char ZeilenMuster2=HoleZeileSchattenMatrix(Zeile);
  1389.       ZeilenMuster1=ZeilenMuster1>>1;
  1390.       bitWrite(ZeilenMuster1,RechteSpalte,bitRead(ZeilenMuster2,LinkeSpalte));
  1391.       ZeilenMuster2=ZeilenMuster2>>1;
  1392.       SetzeZeileHauptMatrix(Zeile,ZeilenMuster1);
  1393.       SetzeZeileSchattenMatrix(Zeile,ZeilenMuster2);
  1394.     }
  1395.   }
  1396.   ZeigeMatrix(Dauer);
  1397. }
  1398.  
  1399. //---------------------------------------------------------------------------
  1400.  
  1401. void SchiebeZeilenKodiertRechts(byte SchiebeZeilen, byte Dauer) {
  1402.   for (char Zeile=ObereZeile; Zeile<=UntereZeile; Zeile++) {
  1403.     if (bitRead(SchiebeZeilen,Zeile)==1) {
  1404.       char ZeilenMuster1=HoleZeileHauptMatrix(Zeile);
  1405.       char ZeilenMuster2=HoleZeileSchattenMatrix(Zeile);
  1406.       ZeilenMuster1=ZeilenMuster1<<1;
  1407.       bitWrite(ZeilenMuster1,LinkeSpalte,bitRead(ZeilenMuster2,RechteSpalte));
  1408.       ZeilenMuster2=ZeilenMuster2<<1;
  1409.       SetzeZeileHauptMatrix(Zeile,ZeilenMuster1);
  1410.       SetzeZeileSchattenMatrix(Zeile,ZeilenMuster2);
  1411.     }
  1412.   }
  1413.   ZeigeMatrix(Dauer);
  1414. }
  1415.  
  1416. //---------------------------------------------------------------------------
  1417.  
  1418. void SchiebeZeilenKodiert(byte SchiebeZeilen, byte Dauer) {
  1419.   if (Richtung==Links)
  1420.     SchiebeZeilenKodiertLinks(SchiebeZeilen, Dauer);
  1421.   else
  1422.     SchiebeZeilenKodiertRechts(SchiebeZeilen, Dauer);
  1423. }
  1424.  
  1425. //---------------------------------------------------------------------------
  1426.  
  1427. void SchiebeZeilenKodiert6xLaufgeschwindigkeit(byte SchiebeZeilen) {
  1428.   for (char Zeilen=0; Zeilen<=AnzahlZeilen+1; Zeilen++)
  1429.     SchiebeZeilenKodiert(SchiebeZeilen, Laufgeschwindigkeit);
  1430. }
  1431.  
  1432. //---------------------------------------------------------------------------
  1433.  
  1434. void SchiebeZeilenLaufgeschwindigkeit(byte SchiebeZeilen, byte Richtung1, byte Richtung2) {
  1435.   Richtung=Richtung1;
  1436.   SchiebeZeilenKodiert6xLaufgeschwindigkeit(SchiebeZeilen);
  1437.   Richtung=Richtung2;
  1438.   SchiebeZeilenKodiert6xLaufgeschwindigkeit(SchiebeZeilen^AlleZeilen);
  1439. }
  1440.  
  1441. //---------------------------------------------------------------------------
  1442.  
  1443. void SchiebeZeilenGleichzeitigLaufgeschwindigkeit(byte SchiebeZeilen1, byte SchiebeZeilen2) {
  1444.   for (char Zeilen=0; Zeilen<=AnzahlZeilen+1; Zeilen++) {
  1445.     SchiebeZeilenKodiert(SchiebeZeilen1, Keinedauer);
  1446.     RichtungUmkehr();
  1447.     SchiebeZeilenKodiert(SchiebeZeilen2, Laufgeschwindigkeit);
  1448.     RichtungUmkehr();
  1449.   }
  1450. }
  1451.  
  1452. //---------------------------------------------------------------------------
  1453.  
  1454. void SchiebeEinerLaufgeschwindigkeit() {
  1455.   SchiebeSpalten6xHochRunterLaufgeschwindigkeit(EinerSpalten);
  1456. }
  1457.  
  1458. //---------------------------------------------------------------------------
  1459.  
  1460. void SchiebeZehnerLaufgeschwindigkeit() {
  1461.   SchiebeSpalten6xHochRunterLaufgeschwindigkeit(ZehnerSpalten);
  1462. }
  1463.  
  1464. //---------------------------------------------------------------------------
  1465.  
  1466. void SchiebeZehnerEinerGleichzeitigLaufgeschwindigkeit() {
  1467.   for (char Zeile=0; Zeile<AnzahlZeilen+1; Zeile++) {
  1468.     SchiebeSpaltenHochRunterKodiert(1, ZehnerSpalten, Keinedauer);
  1469.     RichtungUmkehr();
  1470.     SchiebeSpaltenHochRunterKodiertLaufgeschwindigkeit(1, EinerSpalten);
  1471.     RichtungUmkehr();
  1472.   }
  1473. }
  1474.  
  1475. //---------------------------------------------------------------------------
  1476.  
  1477. void SchiebeSpalten123Laufgeschwindigkeit(byte SchiebeSpalten1, byte SchiebeSpalten2, byte SchiebeSpalten3) {
  1478.   SchiebeSpalten6xHochRunterLaufgeschwindigkeit(SchiebeSpalten1);
  1479.   SchiebeSpalten6xHochRunterLaufgeschwindigkeit(SchiebeSpalten2);
  1480.   SchiebeSpalten6xHochRunterLaufgeschwindigkeit(SchiebeSpalten3);
  1481. }
  1482.  
  1483. //---------------------------------------------------------------------------
  1484.  
  1485. void SchiebeLinksLaufgeschwindigkeit(char Oft) {
  1486.   for (char o=0; o<Oft; o++) {
  1487.     SchiebeSpaltenLinksVonBisHauptMatrix(LinkeSpalte, RechteSpalte,
  1488.       SchiebeSpaltenLinksVonBisSchattenMatrix(LinkeSpalte, RechteSpalte, LeerMuster));
  1489.     ZeigeMatrixLaufgeschwindigkeit();
  1490.   }
  1491. }
  1492.  
  1493. //---------------------------------------------------------------------------
  1494.  
  1495. void SchiebeRechtsLaufgeschwindigkeit(char Oft) {
  1496.   for (char o=0; o<Oft; o++) {
  1497.     SchiebeSpaltenRechtsVonBisHauptMatrix(LinkeSpalte, RechteSpalte,
  1498.       SchiebeSpaltenRechtsVonBisSchattenMatrix(LinkeSpalte, RechteSpalte, LeerMuster));
  1499.     ZeigeMatrixLaufgeschwindigkeit();
  1500.   }
  1501. }
  1502.  
  1503. //---------------------------------------------------------------------------
  1504.  
  1505. void SchiebeHochDirektLaufgeschwindigkeit(char Oft, byte SchiebeSpaltenSpalten) {
  1506.   for (char o=0; o<Oft; o++) {
  1507.     for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++) {
  1508.       if (bitRead(SchiebeSpaltenSpalten, Spalte)==1) {
  1509.         HauptMatrix[Spalte]=HauptMatrix[Spalte]>>1;
  1510.         bitWrite(HauptMatrix[Spalte], DummyZeile, bitRead(SchattenMatrix[Spalte], ObereZeile));
  1511.         SchattenMatrix[Spalte]=SchattenMatrix[Spalte]>>1;
  1512.       }
  1513.     }
  1514.     ZeigeMatrixLaufgeschwindigkeit();
  1515.   }
  1516. }
  1517.  
  1518. //---------------------------------------------------------------------------
  1519.  
  1520. void SchiebeHochLaufgeschwindigkeit(char Oft) {
  1521.   SchiebeHochDirektLaufgeschwindigkeit(Oft, AlleSpalten);
  1522. }
  1523.  
  1524. //---------------------------------------------------------------------------
  1525.  
  1526. void SchiebeRunterDirektLaufgeschwindigkeit(char Oft, byte SchiebeSpaltenSpalten) {
  1527.   for (char o=0; o<Oft; o++) {
  1528.     for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++) {
  1529.       if (bitRead(SchiebeSpaltenSpalten, Spalte)==1) {
  1530.         HauptMatrix[Spalte]=HauptMatrix[Spalte]<<1;
  1531.         bitWrite(HauptMatrix[Spalte], ObereZeile, bitRead(SchattenMatrix[Spalte], DummyZeile));
  1532.         SchattenMatrix[Spalte]=SchattenMatrix[Spalte]<<1;
  1533.       }
  1534.     }
  1535.     ZeigeMatrixLaufgeschwindigkeit();
  1536.   }
  1537. }
  1538.  
  1539. //---------------------------------------------------------------------------
  1540.  
  1541. void SchiebeRunterLaufgeschwindigkeit(char Oft) {
  1542.   SchiebeRunterDirektLaufgeschwindigkeit(Oft, AlleSpalten);
  1543. }
  1544.  
  1545. //---------------------------------------------------------------------------
  1546.  
  1547. void SchiebeLaufgeschwindigkeit() {
  1548.   switch(Richtung) {
  1549.     case Links:  SchiebeLinksLaufgeschwindigkeit(AnzahlSpalten); break;
  1550.     case Rechts: SchiebeRechtsLaufgeschwindigkeit(AnzahlSpalten); break;
  1551.     case Hoch:   SchiebeHochLaufgeschwindigkeit(AnzahlZeilen+1); break; // ???
  1552.     case Runter: SchiebeRunterLaufgeschwindigkeit(AnzahlZeilen+1); break;
  1553.   }
  1554. }
  1555.  
  1556. //---------------------------------------------------------------------------
  1557.  
  1558. void SchiebeOftLaufgeschwindigkeit(char Oft) {
  1559.   switch(Richtung) {
  1560.     case Links:  SchiebeLinksLaufgeschwindigkeit(Oft); break;
  1561.     case Rechts: SchiebeRechtsLaufgeschwindigkeit(Oft); break;
  1562.     case Hoch:   SchiebeHochLaufgeschwindigkeit(Oft); break;
  1563.     case Runter: SchiebeRunterLaufgeschwindigkeit(Oft); break;
  1564.   }
  1565. }
  1566.  
  1567. //---------------------------------------------------------------------------
  1568.  
  1569. void SchiebeMusterLaufgeschwindigkeit(char Muster) {
  1570.   switch(Richtung) {
  1571.     case Links:
  1572.       SetzeSpalteSchattenMatrix(LinkeSpalte, Muster);
  1573.       SchiebeLinksLaufgeschwindigkeit(1);
  1574.       break;
  1575.     case Rechts:
  1576.       SetzeSpalteSchattenMatrix(RechteSpalte, Muster);
  1577.       SchiebeRechtsLaufgeschwindigkeit(1);
  1578.       break;
  1579.     case Hoch:
  1580.       SetzeZeileSchattenMatrix(ObereZeile, Muster);
  1581.       SchiebeHochLaufgeschwindigkeit(1);
  1582.       break;
  1583.     case Runter:
  1584.       SetzeZeileSchattenMatrix(UntereZeile, Muster);
  1585.       SchiebeRunterLaufgeschwindigkeit(1);
  1586.       break;
  1587.   }
  1588. }
  1589.  
  1590. //---------------------------------------------------------------------------
  1591.  
  1592. void KodierTasterZehnerLaufgeschwindigkeit(char Zahl, char MaxZehner) {
  1593.   byte RichtungKodierTaster=Richtung;
  1594.   char SollZehner=Zahl/10;
  1595.   char IstZehner=AlteZahl/10;
  1596.   char DifZehner=SollZehner-IstZehner;
  1597.   if (DifZehner<0) DifZehner=DifZehner+(MaxZehner+1);
  1598.   if (DifZehner>(MaxZehner+1)/2) RichtungUmkehr;
  1599.   if (IstZehner!=SollZehner) {
  1600.     do {
  1601.       if (Richtung==RichtungKodierTaster) {
  1602.         IstZehner++;
  1603.         if (IstZehner>MaxZehner) IstZehner=0;
  1604.       }
  1605.       else {
  1606.         IstZehner--;
  1607.         if (IstZehner<0) IstZehner=MaxZehner;
  1608.       }
  1609.       SetzeZahlSchattenMatrix(IstZehner*10);
  1610.       SchiebeZehnerLaufgeschwindigkeit();
  1611.     } while (IstZehner!=SollZehner);
  1612.   }
  1613.   Richtung=RichtungKodierTaster;
  1614. }
  1615.  
  1616. //---------------------------------------------------------------------------
  1617.  
  1618. void KodierTasterEinerLaufgeschwindigkeit(char Zahl) {
  1619.   byte RichtungKodierTaster=Richtung;
  1620.   char SollEiner=Zahl%10;
  1621.   char IstEiner=AlteZahl%10;
  1622.   char DifEiner=SollEiner-IstEiner;
  1623.   if (DifEiner<0) DifEiner=DifEiner+10;
  1624.   if (DifEiner>5) RichtungUmkehr();
  1625.   if (IstEiner!=SollEiner) {
  1626.     do {
  1627.       if (Richtung==RichtungKodierTaster) {
  1628.         IstEiner++;
  1629.         if (IstEiner>9) IstEiner=0;
  1630.       }
  1631.       else {
  1632.         IstEiner--;
  1633.         if (IstEiner<0) IstEiner=9;
  1634.       }
  1635.       SetzeZahlSchattenMatrix(IstEiner);
  1636.       SchiebeEinerLaufgeschwindigkeit();
  1637.     } while (IstEiner!=SollEiner);
  1638.   }
  1639.   Richtung=RichtungKodierTaster;
  1640. }
  1641.  
  1642. //---------------------------------------------------------------------------
  1643.  
  1644. void Mischen(char MaxZahl) {
  1645.   char Zahl, Zufall1, Zufall2;
  1646.   for (Zahl=0; Zahl<MaxZahl; Zahl++)
  1647.     ZufallsZahlen[Zahl]=Zahl;
  1648.   for (char Zahl=0; Zahl<MaxZahl; Zahl++) {
  1649.     Zufall1=Random(MaxZahl);
  1650.     Zufall2=Random(MaxZahl);
  1651.     Tausche(ZufallsZahlen[Zufall1], ZufallsZahlen[Zufall2]);
  1652.   }
  1653. }
  1654.  
  1655. //---------------------------------------------------------------------------
  1656.  
  1657. void PunkteZufallLaufgeschwindigkeit(char VonSpalte, char BisSpalte){
  1658.   Mischen(AnzahlLeds);
  1659.   for(char Led=0; Led<AnzahlLeds; Led++) {
  1660.     char x=ZufallsZahlen[Led]%AnzahlSpalten;
  1661.     char y=ZufallsZahlen[Led]/AnzahlSpalten;
  1662.     if (x>=VonSpalte && x<=BisSpalte) SetzeKopierePunktLaufgeschwindigkeit(x, y, PunktKopier);
  1663.   }
  1664. }
  1665.  
  1666. //---------------------------------------------------------------------------
  1667.  
  1668. void ZehnerEinerPunkteZufallLaufgeschwindigkeit() {
  1669.   Mischen(AnzahlLeds);
  1670.   if (ZufallZuerst==ZehnerZuerst) PunkteZufallLaufgeschwindigkeit(LinkeSpalte,MitteSpalte);
  1671.   PunkteZufallLaufgeschwindigkeit(MitteSpalte,RechteSpalte);
  1672.   if (ZufallZuerst==!ZehnerZuerst) PunkteZufallLaufgeschwindigkeit(LinkeSpalte,MitteSpalte);
  1673. }
  1674.  
  1675. //---------------------------------------------------------------------------
  1676.  
  1677. void SpaltenZufallLaufgeschwindigkeit(boolean Schieben) {
  1678.   char Warschon=bit(MitteSpalte);
  1679.   char ZufallsSpalte;
  1680.   SetzeNeueLaufgeschwindigkeit(Laufgeschwindigkeit/2);
  1681.   do {
  1682.     do {
  1683.       ZufallsSpalte=Random(AnzahlSpalten);
  1684.     } while (bitRead(Warschon, ZufallsSpalte)==1);
  1685.     bitSet(Warschon, ZufallsSpalte);
  1686.     if (HoleSpalteHauptMatrix(ZufallsSpalte)!=HoleSpalteSchattenMatrix(ZufallsSpalte))
  1687.       if (Schieben==true)
  1688.         SchiebeSpalten6xHochRunterLaufgeschwindigkeit(bit(ZufallsSpalte));
  1689.       else
  1690.         SetzeSpalteHauptMatrix(ZufallsSpalte,HoleSpalteSchattenMatrix(ZufallsSpalte));
  1691.     ZeigeMatrixLaufgeschwindigkeit();
  1692.   } while (Warschon!=AlleSpalten);
  1693.   ZurueckZurAltenLaufgeschwindigkeit();
  1694. }
  1695.  
  1696. //---------------------------------------------------------------------------
  1697.  
  1698. void ZeilenZufallLaufgeschwindigkeit(boolean Schieben) {
  1699.   char Warschon=0;
  1700.   char ZufallsZeile;
  1701.   SetzeNeueLaufgeschwindigkeit(Laufgeschwindigkeit/2);
  1702.   do {
  1703.     do {
  1704.       ZufallsZeile=Random(AnzahlZeilen);
  1705.     } while (bitRead(Warschon, ZufallsZeile)==1);
  1706.     bitSet(Warschon, ZufallsZeile);
  1707.     if (HoleZeileHauptMatrix(ZufallsZeile)!=HoleZeileSchattenMatrix(ZufallsZeile))
  1708.       if (Schieben==true)
  1709.         SchiebeZeilenKodiert6xLaufgeschwindigkeit(bit(ZufallsZeile));
  1710.       else
  1711.        SetzeZeileHauptMatrix(ZufallsZeile, HoleZeileSchattenMatrix(ZufallsZeile));
  1712.     ZeigeMatrixLaufgeschwindigkeit();
  1713.   } while (Warschon!=AlleZeilen);
  1714.   ZurueckZurAltenLaufgeschwindigkeit();
  1715. }
  1716.  
  1717. //---------------------------------------------------------------------------
  1718.  
  1719. void KopiereNachLinkGleichzeitigLaufgeschwindigkeit(){
  1720.   for (char Spalte=0; Spalte<ZeichenBreite; Spalte++) {
  1721.     HauptMatrix[Spalte]=SchattenMatrix[Spalte];
  1722.     HauptMatrix[Spalte+LinkeEinerSpalte]=SchattenMatrix[Spalte+LinkeEinerSpalte];
  1723.     ZeigeMatrixLaufgeschwindigkeit();
  1724.   }
  1725. }
  1726.  
  1727. //---------------------------------------------------------------------------
  1728.  
  1729. void KopiereNachRechtsGleichzeitigLaufgeschwindigkeit() {
  1730.   for (char Spalte=ZeichenBreite-1; Spalte>=0; Spalte--) {
  1731.     HauptMatrix[Spalte]=SchattenMatrix[Spalte];
  1732.     HauptMatrix[Spalte+LinkeEinerSpalte]=SchattenMatrix[Spalte+LinkeEinerSpalte];
  1733.     ZeigeMatrixLaufgeschwindigkeit();
  1734.   }
  1735. }
  1736.  
  1737. //---------------------------------------------------------------------------
  1738.  
  1739. void KopiereNachGleichzeitigLaufgeschwindigkeit() {
  1740.   switch(Richtung) {
  1741.     case Links:  KopiereNachLinkGleichzeitigLaufgeschwindigkeit(); break;
  1742.     case Rechts: KopiereNachRechtsGleichzeitigLaufgeschwindigkeit(); break;
  1743.     case Hoch:   KopiereHochLaufgeschwindigkeit(); break;
  1744.     case Runter: KopiereRunterLaufgeschwindigkeit(); break;
  1745.     case Innen:  KopiereNachInnenGleichzeitigLaufgeschwindigkeit(); break;
  1746.     case Aussen: KopiereNachAussenGleichzeitigLaufgeschwindigkeit(); break;
  1747.   }
  1748. }
  1749.  
  1750. //---------------------------------------------------------------------------
  1751.  
  1752. void ZeigeKopiereZehnerEiner(byte ZehnerRichtung, byte EinerRichtung) {
  1753.   if (ZufallZuerst==ZehnerZuerst) {
  1754.     Richtung=ZehnerRichtung;
  1755.     KopiereSpaltenSenkrechtLaufgeschwindigkeit(ZehnerSpalten);
  1756.   }
  1757.  
  1758.   Richtung=EinerRichtung;
  1759.   KopiereSpaltenSenkrechtLaufgeschwindigkeit(EinerSpalten);
  1760.  
  1761.   if (ZufallZuerst==!ZehnerZuerst) {
  1762.     Richtung=ZehnerRichtung;
  1763.     KopiereSpaltenSenkrechtLaufgeschwindigkeit(ZehnerSpalten);
  1764.   }
  1765.   ZeigeMatrixZeigedauer();
  1766. }
  1767.  
  1768. //---------------------------------------------------------------------------
  1769.  
  1770. void SpiralpunktLaufgeschwindigkeit(char Punkt, char Spiegel, byte Bereich) {
  1771.   char x, y;
  1772.   if (Punkt<99) {
  1773.     x=(Punkt%AnzahlLeds)%AnzahlSpalten;
  1774.     y=(Punkt%AnzahlLeds)/AnzahlSpalten;
  1775.     if (bitRead(Spiegel,0)==1) x=RechteSpalte-x;  // x spiegeln
  1776.     if (bitRead(Spiegel,1)==1) y=UntereZeile-y;   // y spiegeln
  1777.     byte Punkt2=HolePunkt(SchattenMatrix, x, y);
  1778.     if (bitRead(Bereich,0)==1 && Punkt<AnzahlLeds || bitRead(Bereich,1)==1 && Punkt>=AnzahlLeds) {
  1779.       if (bitRead(Spiegel,3)==0) SetzePunktHauptMatrix(x,y,1);    // 2=rueckwaerts, 3=Zeigepunkt
  1780.       SetzePunktHauptMatrix(x,y,Punkt2);
  1781.       if (Punkt<AnzahlLeds  || Bereich==0x02) ZeigeMatrixLaufgeschwindigkeit();
  1782.     }
  1783.   }
  1784. }
  1785.  
  1786. //---------------------------------------------------------------------------
  1787.  
  1788. void SpiraleLaufgeschwindigkeit(char Nr, char Spiegel, byte Bereich) {
  1789.   ZeigeImmer=false;
  1790.   char z;
  1791.   for (char Durchgang=0; Durchgang<2; Durchgang++) {
  1792.     for (char Led=0; Led<AnzahlLeds; Led++) {
  1793.       z=pgm_read_byte(Spiralen+AnzahlLeds*Nr+Led);
  1794.       if (bitRead(Spiegel,2)) z=pgm_read_byte(Spiralen+AnzahlLeds*Nr+(AnzahlLeds-1)-Led); // rueckwaerts
  1795.       SpiralpunktLaufgeschwindigkeit(z, Spiegel,  Bereich);
  1796.     }
  1797.     Bereich=Bereich^0x03;
  1798.   }
  1799.   ZeigeMatrixLaufgeschwindigkeit();
  1800. }
  1801.  
  1802. //---------------------------------------------------------------------------
  1803.  
  1804. void RotiereSpaltenLinks() {
  1805.   char Hilf=SchattenMatrix[LinkeSpalte];
  1806.   for (char Spalte=LinkeSpalte; Spalte<RechteSpalte; Spalte++)
  1807.     SchattenMatrix[Spalte]=SchattenMatrix[Spalte+1];
  1808.   SchattenMatrix[RechteSpalte]=Hilf;
  1809. }
  1810.  
  1811. //---------------------------------------------------------------------------
  1812.  
  1813. void RotiereSpaltenRechts() {
  1814.   char Hilf=SchattenMatrix[RechteSpalte];
  1815.   for (char Spalte=RechteSpalte; Spalte>LinkeSpalte; Spalte--)
  1816.     SchattenMatrix[Spalte]=SchattenMatrix[Spalte-1];
  1817.   SchattenMatrix[LinkeSpalte]=Hilf;
  1818. }
  1819.  
  1820. //---------------------------------------------------------------------------
  1821.  
  1822. void RotiereZeilenHoch() {
  1823.   char Hilf=HoleZeileSchattenMatrix(ObereZeile);
  1824.   for (char Zeile=ObereZeile; Zeile<UntereZeile; Zeile++)
  1825.     SetzeZeileSchattenMatrix(Zeile,HoleZeileSchattenMatrix(Zeile+1));
  1826.   SetzeZeileSchattenMatrix(UntereZeile, Hilf);
  1827. }
  1828.  
  1829. //---------------------------------------------------------------------------
  1830.  
  1831. void RotiereZeilenRunter() {
  1832.   char Hilf=HoleZeileSchattenMatrix(UntereZeile);
  1833.   for (char Zeile=UntereZeile; Zeile>ObereZeile; Zeile--)
  1834.     SetzeZeileSchattenMatrix(Zeile,HoleZeileSchattenMatrix(Zeile-1));
  1835.   SetzeZeileSchattenMatrix(ObereZeile, Hilf);
  1836. }
  1837.  
  1838. //---------------------------------------------------------------------------
  1839.  
  1840. void Rotiere() {
  1841.   if (Richtung==Rechts) RotiereSpaltenRechts();
  1842.   if (Richtung==Links)  RotiereSpaltenLinks();
  1843.   if (Richtung==Hoch)   RotiereZeilenHoch();
  1844.   if (Richtung==Runter) RotiereZeilenRunter();
  1845. }
  1846.  
  1847. //---------------------------------------------------------------------------
  1848.  
  1849. void DaumenKinoZehnerLaufgeschwindigkeit(char Zahl, char MaxZehner) {
  1850.   char IstZehner=AlteZahl/10;
  1851.   char SollZehner=Zahl/10;
  1852.   if (IstZehner!=SollZehner) {
  1853.     do {
  1854.       IstZehner++;
  1855. //      if (IstZehner>Max) IstZehner=-3; mit Grad und C
  1856.       if (IstZehner>MaxZehner) IstZehner=0;
  1857.       if (Richtung>=Hoch) {
  1858.         SetzeZahlSchattenMatrix(IstZehner*10);
  1859.         SchiebeZehnerLaufgeschwindigkeit();
  1860.       } else ZeigeSetzeZehner(IstZehner*10,Laufgeschwindigkeit);
  1861.     }
  1862.     while (IstZehner!=SollZehner);
  1863.   }
  1864.   AlteZahl=SollZehner*10+AlteZahl%10;
  1865. }
  1866.  
  1867. //---------------------------------------------------------------------------
  1868.  
  1869. void DaumenKinoEinerLaufgeschwindigkeit(char Zahl) {
  1870.   char IstEiner=AlteZahl%10;
  1871.   char SollEiner=Zahl%10;
  1872.   if (IstEiner!=SollEiner) {
  1873.     do {
  1874.       IstEiner++;
  1875. //      if (IstEiner>9) IstEiner=-3; // mit Grad und C
  1876.       if (IstEiner>9) IstEiner=0;
  1877.       if (Richtung>=Hoch) {
  1878.         SetzeZahlSchattenMatrix(IstEiner);
  1879.         SchiebeEinerLaufgeschwindigkeit();
  1880.       } else ZeigeSetzeEiner(IstEiner,Laufgeschwindigkeit);
  1881.     }
  1882.     while (IstEiner!=SollEiner);
  1883.   }
  1884.   AlteZahl=(AlteZahl/10)*10+SollEiner;
  1885. }
  1886.  
  1887. //---------------------------------------------------------------------------
  1888.  
  1889. void ZaehleZehnerLaufgeschwindigkeit(char Zahl, boolean NurVor) {
  1890.   char IstZehner=AlteZahl/10;
  1891.   char SollZehner=Zahl/10;
  1892.   if (IstZehner!=SollZehner) {
  1893.     do {
  1894.       if (IstZehner<SollZehner || NurVor==true ) {
  1895.         IstZehner++; if(IstZehner>=10) IstZehner=0;
  1896.       } else if (IstZehner>SollZehner) IstZehner--;
  1897.       SetzeZehner(HauptMatrix,IstZehner);
  1898.       ZeigeMatrixLaufgeschwindigkeit();
  1899.     }
  1900.     while (IstZehner!=SollZehner);
  1901.   }
  1902.   SetzeZehner(HauptMatrix,SollZehner);
  1903.   AlteZahl=SollZehner*10+AlteZahl%10;
  1904. }
  1905.  
  1906. //---------------------------------------------------------------------------
  1907.  
  1908. void ZaehleEinerLaufgeschwindigkeit(char Zahl, boolean NurVor) {
  1909.   char IstEiner=AlteZahl%10;
  1910.   char SollEiner=Zahl%10;
  1911.   if (IstEiner!=SollEiner) {
  1912.     do {
  1913.       if (IstEiner<SollEiner || NurVor==true ) {
  1914.         IstEiner++; if(IstEiner>=10) IstEiner=0;
  1915.       } else if (IstEiner>SollEiner) IstEiner--;
  1916.       SetzeEiner(HauptMatrix,IstEiner);
  1917.       ZeigeMatrixLaufgeschwindigkeit();
  1918.     }
  1919.     while (IstEiner!=SollEiner);
  1920.   }
  1921.   SetzeEiner(HauptMatrix,SollEiner);
  1922.   AlteZahl=(AlteZahl/10)*10+SollEiner;
  1923. }
  1924.  
  1925. //---------------------------------------------------------------------------
  1926.  
  1927. void SchiebeAbstandLaufgeschwindigkeit() {
  1928.   switch(Richtung) {
  1929.     case Links:  SchiebeLeereSpalteLinksHauptMatrix(); break;
  1930.     case Rechts: SchiebeLeereSpalteRechtsHauptMatrix(); break;
  1931.     case Hoch:   SchiebeSpaltenKodiertHoch1x(HauptMatrix, AlleSpalten, Keinedauer); break;
  1932.     case Runter: SchiebeSpaltenKodiertRunter1x(HauptMatrix, AlleSpalten, Keinedauer); break;
  1933.   }
  1934.   ZeigeMatrixLaufgeschwindigkeit();
  1935. }
  1936.  
  1937. //---------------------------------------------------------------------------
  1938.  
  1939. void SchiebeAbstandLinksLaufgeschwindigkeit() {
  1940.   Richtung=Links;
  1941.   SchiebeAbstandLaufgeschwindigkeit();
  1942. }
  1943. //---------------------------------------------------------------------------
  1944.  
  1945. void SchiebeAbstandRechtsLaufgeschwindigkeit() {
  1946.   Richtung=Rechts;
  1947.   SchiebeAbstandLaufgeschwindigkeit();
  1948. }
  1949. //---------------------------------------------------------------------------
  1950.  
  1951. void SchiebeGrosserAbstandLaufgeschwindigkeit() {
  1952.   for (char o=0; o<GrosserAbstand; o++)
  1953.     SchiebeAbstandLaufgeschwindigkeit();
  1954. }
  1955.  
  1956. //---------------------------------------------------------------------------
  1957.  
  1958. void SchreibeZifferLaufgeschwindigkeit(char Ziffer, char Posi, byte Dauer) {
  1959.   if (Ziffer<0) Ziffer=8-Ziffer;  // 10=Grad (-2), 11=Celsius(-3)
  1960.   for (char Spalte=0; Spalte<ZeichenBreite; Spalte++) SetzeSpalteHauptMatrix(Posi+Spalte, LeerMuster);
  1961.   for (char Punkt=0; Punkt<=13; Punkt++) {
  1962.     char SchreibPunkt=pgm_read_byte(Schreibzahl+14*Ziffer+Punkt)+Posi;
  1963.     if (SchreibPunkt<99) {
  1964.       SetzePunktNrHauptMatrix(SchreibPunkt, PunktEin);
  1965.       ZeigeMatrix(Dauer);
  1966.     }
  1967.   }
  1968. }
  1969.  
  1970. //---------------------------------------------------------------------------
  1971.  
  1972. void SchiebeZeichenLaufgeschwindigkeit(char Zeichen) {
  1973.   SetzeZehner(SchattenMatrix, Zeichen);
  1974.   SetzeEiner(SchattenMatrix, Zeichen);
  1975.   SchiebeOftLaufgeschwindigkeit(ZeichenBreite);
  1976. }
  1977.  
  1978. //---------------------------------------------------------------------------
  1979.  
  1980. void SchiebeZeichenLinksLaufgeschwindigkeit(char Zeichen) {
  1981.   Richtung=Links;
  1982.   SchiebeZeichenLaufgeschwindigkeit(Zeichen);
  1983. }
  1984.  
  1985. //---------------------------------------------------------------------------
  1986.  
  1987. void SchiebeDoppelpunktLaufgeschwindigkeit() {
  1988.   if (Richtung<=Rechts) {
  1989.     if (Zahl1>=0 && Zahl2>=0)
  1990.       SchiebeZeichenLaufgeschwindigkeit(Doppelpunkt);
  1991.     else
  1992.       SchiebeAbstandLaufgeschwindigkeit();
  1993.   }
  1994. }
  1995.  
  1996. //---------------------------------------------------------------------------
  1997.  
  1998. void SchiebeLeerLaufgeschwindigkeit() {
  1999.   LoescheSchattenMatrix();
  2000.   SchiebeLaufgeschwindigkeit();
  2001. }
  2002.  
  2003. //---------------------------------------------------------------------------
  2004.  
  2005. void SchiebeLeerLinksLaufgeschwindigkeit() {
  2006.   Richtung=Links;
  2007.   SchiebeLeerLaufgeschwindigkeit();
  2008. }
  2009.  
  2010. //---------------------------------------------------------------------------
  2011.  
  2012. void SchiebeLeerRechtsLaufgeschwindigkeit() {
  2013.   Richtung=Rechts;
  2014.   SchiebeLeerLaufgeschwindigkeit();
  2015. }
  2016.  
  2017. //---------------------------------------------------------------------------
  2018.  
  2019. void LoescheNachAussenLaufgeschwindigkeit(){
  2020.   for (char Spalte=0; Spalte<ZeichenBreite; Spalte++) {
  2021.     SchiebeSpaltenLinksVonBisHauptMatrix(LinkeZehnerSpalte, RechteZehnerSpalte, LeerMuster);
  2022.     SchiebeSpaltenRechtsVonBisHauptMatrix(LinkeEinerSpalte, RechteEinerSpalte, LeerMuster);
  2023.     ZeigeMatrixLaufgeschwindigkeit();
  2024.   }
  2025. }
  2026.  
  2027. //---------------------------------------------------------------------------
  2028.  
  2029. void LoescheZehnerEinerNachLinksLaufgeschwindigkeit(){
  2030.   for (char Spalte=0; Spalte<ZeichenBreite; Spalte++) {
  2031.     SchiebeSpaltenLinksVonBisHauptMatrix(LinkeZehnerSpalte, RechteZehnerSpalte, LeerMuster);
  2032.     ZeigeMatrixLaufgeschwindigkeit();
  2033.   }
  2034.   SchiebeLeerLinksLaufgeschwindigkeit();
  2035. }
  2036.  
  2037. //---------------------------------------------------------------------------
  2038.  
  2039. void LoescheEinerZehnerNachRechtsLaufgeschwindigkeit(){
  2040.   for (char Spalte=0; Spalte<ZeichenBreite; Spalte++) {
  2041.     SchiebeSpaltenRechtsVonBisHauptMatrix(LinkeEinerSpalte, RechteEinerSpalte, LeerMuster);
  2042.     ZeigeMatrixLaufgeschwindigkeit();
  2043.   }
  2044.   Richtung=Rechts;
  2045.   SchiebeLeerLaufgeschwindigkeit();
  2046. }
  2047.  
  2048. //---------------------------------------------------------------------------
  2049.  
  2050. void PunktlaufLaufgeschwindigkeit(char x1, char y1, char x2, char y2, char Punkt) {
  2051. //  char Dif=max(abs(x1-x2),abs(y1-y2)); Laufgeschwindigkeit=16/(Dif+2)+2;
  2052. //  char Dif=max(abs(x1-x2),abs(y1-y2)); Laufgeschwindigkeit=31/(Dif+2);
  2053.   while (x1!=x2 || y1!=y2) {
  2054.     if (Punkt==PunktEin) {
  2055.       SetzePunktHauptMatrix(x1, y1, PunktEin);
  2056.       ZeigeMatrixLaufgeschwindigkeit();
  2057.     }
  2058.     SetzePunktHauptMatrix(x1,y1,PunktAus);
  2059.     if (x1<x2) x1++;
  2060.     if (x1>x2) x1--;
  2061.     if (y1<y2) y1++;
  2062.     if (y1>y2) y1--;
  2063.     if (Punkt==PunktAus) {
  2064.       SetzePunktHauptMatrix(x1,y1,PunktEin);
  2065.       ZeigeMatrixLaufgeschwindigkeit();
  2066.     }
  2067.   }
  2068.   SetzePunktHauptMatrix(x2,y2,Punkt);
  2069. //  if (Punkt==PunktEin)
  2070.   ZeigeMatrixLaufgeschwindigkeit();
  2071. }
  2072.  
  2073. //---------------------------------------------------------------------------
  2074.  
  2075. void SpaltenLaufenReinLinksLaufgeschwindigkeit() {
  2076.   for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++) {
  2077.     char LaufMuster=SchattenMatrix[Spalte];
  2078.     if (LaufMuster!=LeerMuster) {
  2079.       for (char LaufSpalte=RechteSpalte; LaufSpalte>=Spalte; LaufSpalte--) {
  2080.         HauptMatrix[LaufSpalte]=LaufMuster;
  2081.         ZeigeMatrixLaufgeschwindigkeit();
  2082.         HauptMatrix[LaufSpalte]=LeerMuster;
  2083.       }
  2084.     }
  2085.     HauptMatrix[Spalte]=LaufMuster;
  2086.   }
  2087. }
  2088.  
  2089. //---------------------------------------------------------------------------
  2090.  
  2091. void SpaltenLaufenRausLinksLaufgeschwindigkeit() {
  2092.   for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++) {
  2093.     char LaufMuster=HauptMatrix[Spalte];
  2094.     if (LaufMuster!=LeerMuster) {
  2095.       for (char LaufSpalte=Spalte; LaufSpalte>=LinkeSpalte; LaufSpalte--) {
  2096.         HauptMatrix[LaufSpalte]=LaufMuster;
  2097.         ZeigeMatrixLaufgeschwindigkeit();
  2098.         HauptMatrix[LaufSpalte]=LeerMuster;
  2099.       }
  2100.     }
  2101.   }
  2102. }
  2103.  
  2104. //---------------------------------------------------------------------------
  2105.  
  2106. void SpaltenLaufenReinRechtsLaufgeschwindigkeit() {
  2107.   for (char Spalte=RechteSpalte; Spalte>=LinkeSpalte; Spalte--) {
  2108.     char LaufMuster=SchattenMatrix[Spalte];
  2109.     if (LaufMuster!=LeerMuster) {
  2110.       for (char LaufSpalte=LinkeSpalte; LaufSpalte<=Spalte; LaufSpalte++) {
  2111.         HauptMatrix[LaufSpalte]=LaufMuster;
  2112.         ZeigeMatrixLaufgeschwindigkeit();
  2113.         HauptMatrix[LaufSpalte]=LeerMuster;
  2114.       }
  2115.     }
  2116.     HauptMatrix[Spalte]=LaufMuster;
  2117.   }
  2118. }
  2119.  
  2120. //---------------------------------------------------------------------------
  2121.  
  2122. void SpaltenLaufenRausRechtsLaufgeschwindigkeit() {
  2123.   for (char Spalte=RechteSpalte; Spalte>=LinkeSpalte; Spalte--) {
  2124.     char LaufMuster=HauptMatrix[Spalte];
  2125.     if (LaufMuster!=LeerMuster) {
  2126.       for (char LaufSpalte=Spalte; LaufSpalte<=RechteSpalte; LaufSpalte++) {
  2127.         HauptMatrix[LaufSpalte]=LaufMuster;
  2128.         ZeigeMatrixLaufgeschwindigkeit();
  2129.         HauptMatrix[LaufSpalte]=LeerMuster;
  2130.       }
  2131.     }
  2132.   }
  2133. }
  2134.  
  2135. //---------------------------------------------------------------------------
  2136.  
  2137. void ZeilenLaufenReinHochLaufgeschwindigkeit() {
  2138.   for (char Zeile=ObereZeile; Zeile<=UntereZeile; Zeile++) {
  2139.     char LaufMuster=HoleZeileSchattenMatrix(Zeile);
  2140.     for (char LaufZeile=UntereZeile; LaufZeile>=Zeile; LaufZeile--) {
  2141.       SetzeZeileHauptMatrix(LaufZeile, LaufMuster);
  2142.       ZeigeMatrixLaufgeschwindigkeit();
  2143.       SetzeZeileHauptMatrix(LaufZeile, LeerMuster);
  2144.     }
  2145.     SetzeZeileHauptMatrix(Zeile, LaufMuster);
  2146.   }
  2147. }
  2148.  
  2149. //---------------------------------------------------------------------------
  2150.  
  2151. void ZeilenLaufenRausHochLaufgeschwindigkeit() {
  2152.   for (char Zeile=ObereZeile; Zeile<=UntereZeile; Zeile++) {
  2153.     char LaufMuster=HoleZeileHauptMatrix(Zeile);
  2154.     for (char LaufZeile=Zeile; LaufZeile>=ObereZeile; LaufZeile--) {
  2155.       SetzeZeileHauptMatrix(LaufZeile, LaufMuster);
  2156.       ZeigeMatrixLaufgeschwindigkeit();
  2157.       SetzeZeileHauptMatrix(LaufZeile, LeerMuster);
  2158.     }
  2159.   }
  2160. }
  2161.  
  2162. //---------------------------------------------------------------------------
  2163.  
  2164. void ZeilenLaufenReinRunterLaufgeschwindigkeit() {
  2165.   for (char Zeile=UntereZeile; Zeile>=ObereZeile; Zeile--) {
  2166.     char LaufMuster=HoleZeileSchattenMatrix(Zeile);
  2167.     for (char LaufZeile=ObereZeile; LaufZeile<=Zeile; LaufZeile++) {
  2168.       SetzeZeileHauptMatrix(LaufZeile, LaufMuster);
  2169.       ZeigeMatrixLaufgeschwindigkeit();
  2170.       SetzeZeileHauptMatrix(LaufZeile, LeerMuster);
  2171.     }
  2172.     SetzeZeileHauptMatrix(Zeile, LaufMuster);
  2173.   }
  2174. }
  2175.  
  2176. //---------------------------------------------------------------------------
  2177.  
  2178. void ZeilenLaufenRausRunterLaufgeschwindigkeit() {
  2179.   for (char Zeile=UntereZeile; Zeile>=ObereZeile; Zeile--) {
  2180.     char LaufMuster=HoleZeileSchattenMatrix( Zeile);
  2181.     for (char LaufZeile=Zeile; LaufZeile<=UntereZeile; LaufZeile++) {
  2182.       SetzeZeileHauptMatrix(LaufZeile, LaufMuster);
  2183.       ZeigeMatrixLaufgeschwindigkeit();
  2184.       SetzeZeileHauptMatrix(LaufZeile, LeerMuster);
  2185.     }
  2186.   }
  2187. }
  2188.  
  2189. //---------------------------------------------------------------------------
  2190.  
  2191. void LaufenReinLaufgeschwindigkeit() {
  2192.   switch(Richtung) {
  2193.     case Links:  SpaltenLaufenReinLinksLaufgeschwindigkeit(); break;
  2194.     case Rechts: SpaltenLaufenReinRechtsLaufgeschwindigkeit(); break;
  2195.     case Hoch:   ZeilenLaufenReinHochLaufgeschwindigkeit(); break;
  2196.     case Runter: ZeilenLaufenReinRunterLaufgeschwindigkeit(); break;
  2197.   }
  2198. }
  2199.  
  2200. //---------------------------------------------------------------------------
  2201.  
  2202. void LaufenRausLaufgeschwindigkeit() {
  2203.   switch(Richtung) {
  2204.     case Links:  SpaltenLaufenRausLinksLaufgeschwindigkeit(); break;
  2205.     case Rechts: SpaltenLaufenRausRechtsLaufgeschwindigkeit(); break;
  2206.     case Hoch:   ZeilenLaufenRausHochLaufgeschwindigkeit(); break;
  2207.     case Runter: ZeilenLaufenRausRunterLaufgeschwindigkeit(); break;
  2208.   }
  2209. }
  2210.  
  2211. //---------------------------------------------------------------------------
  2212.  
  2213. void ZeigeLaufenReinRaus() {
  2214.   LaufenReinLaufgeschwindigkeit();
  2215.   ZeigeMatrixZeigedauer();
  2216.   LaufenRausLaufgeschwindigkeit();
  2217. }
  2218.  
  2219. //---------------------------------------------------------------------------
  2220.  
  2221. void SchichteSpaltenLaufgeschwindigkeit(byte Richtung1, byte Richtung2) {
  2222.   Richtung=Richtung2;
  2223.   SetzeNeueLaufgeschwindigkeit(Laufgeschwindigkeit/2);
  2224.   byte BitSpalte;
  2225.   if (Richtung1==Links) BitSpalte=bit(LinkeSpalte); else BitSpalte=bit(RechteSpalte);
  2226.   do {
  2227.     if (BitSpalte!=bit(MitteSpalte))
  2228.       SchiebeSpalten6xHochRunterLaufgeschwindigkeit(BitSpalte);
  2229.     if (Richtung1==Links) BitSpalte=BitSpalte<<1; else BitSpalte=BitSpalte>>1;
  2230.   } while ((BitSpalte&AlleSpalten)!=0);
  2231.   ZurueckZurAltenLaufgeschwindigkeit();
  2232. }
  2233.  
  2234. //---------------------------------------------------------------------------
  2235.  
  2236. void SchichteZeilenLaufgeschwindigkeit(byte Richtung1, byte Richtung2) {
  2237.   Richtung=Richtung2;
  2238.   SetzeNeueLaufgeschwindigkeit(Laufgeschwindigkeit/2);
  2239.   byte BitZeile;
  2240.   if (Richtung1==Runter) BitZeile=bit(ObereZeile); else BitZeile=bit(UntereZeile);
  2241.   do {
  2242.     SchiebeZeilenKodiert6xLaufgeschwindigkeit(BitZeile);
  2243.     if (Richtung1==Runter) BitZeile=BitZeile<<1; else BitZeile=BitZeile>>1;
  2244.   } while ((BitZeile&AlleZeilen)!=0);
  2245.   ZurueckZurAltenLaufgeschwindigkeit();
  2246. }
  2247.  
  2248. //---------------------------------------------------------------------------
  2249.  
  2250. void FuelleSpaltenLaufgeschwindigkeit(byte Richtung1, byte Richtung2) {
  2251.   char BitSpalte=bit(LinkeSpalte);
  2252.   if (Richtung1==Links) BitSpalte=bit(RechteSpalte);
  2253.   for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++) {
  2254.     Richtung=Richtung1;
  2255.     SchiebeAbstandLaufgeschwindigkeit();
  2256.     Rotiere();
  2257.     if (Spalte!=MitteSpalte) {
  2258.       Richtung=Richtung2;
  2259.       SchiebeSpalten6xHochRunterLaufgeschwindigkeit(BitSpalte);
  2260.     } else ZeigeMatrixLaufgeschwindigkeit();
  2261.   }
  2262. }
  2263.  
  2264. //---------------------------------------------------------------------------
  2265.  
  2266. void LeereSpaltenLaufgeschwindigkeit(byte Richtung1, byte Richtung2) {
  2267.   char BitSpalte=bit(LinkeSpalte);
  2268.   if (Richtung1==Rechts) BitSpalte=bit(RechteSpalte);
  2269.   for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++) {
  2270.     if (Spalte!=MitteSpalte) {
  2271.       Richtung=Richtung2;
  2272.       SchiebeSpalten6xHochRunterLaufgeschwindigkeit(BitSpalte);
  2273.     } else ZeigeMatrixLaufgeschwindigkeit();
  2274.     Richtung=Richtung1;
  2275.     SchiebeAbstandLaufgeschwindigkeit();
  2276.   }
  2277. }
  2278.  
  2279. //---------------------------------------------------------------------------
  2280.  
  2281. void FuelleZeilenLaufgeschwindigkeit(byte Richtung1, byte Richtung2) {
  2282.   char BitZeile=bit(ObereZeile);
  2283.   if (Richtung1==Hoch) BitZeile=bit(UntereZeile);
  2284.   for (char Zeile=ObereZeile; Zeile<=UntereZeile; Zeile++) {
  2285.     Richtung=Richtung1;
  2286.     SchiebeAbstandLaufgeschwindigkeit();
  2287.     Rotiere();
  2288.     Richtung=Richtung2;
  2289.     SchiebeZeilenKodiert6xLaufgeschwindigkeit(BitZeile);
  2290.   }
  2291. }
  2292.  
  2293. //---------------------------------------------------------------------------
  2294.  
  2295. void LeereZeilenLaufgeschwindigkeit(byte Richtung1, byte Richtung2) {
  2296.   char BitZeile=bit(ObereZeile);
  2297.   if (Richtung1==Runter) BitZeile=bit(UntereZeile);
  2298.   for (char Zeile=ObereZeile; Zeile<=UntereZeile; Zeile++) {
  2299.     Richtung=Richtung2;
  2300.     SchiebeZeilenKodiert6xLaufgeschwindigkeit(BitZeile);
  2301.     Richtung=Richtung1;
  2302.     SchiebeAbstandLaufgeschwindigkeit();
  2303.   }
  2304. }
  2305.  
  2306. //---------------------------------------------------------------------------
  2307.  
  2308. void KopierePunkteLaufgeschwindigkeit(char x1, char y1, char Spiegel) {
  2309.   char x2=RechteSpalte-x1;  // gegenueber
  2310.   char y2=UntereZeile-y1;
  2311.   if (bitRead(Spiegel,0)) { x1=RechteSpalte-x1; x2=RechteSpalte-x2; } // x spiegeln
  2312.   if (bitRead(Spiegel,1)) { y1=UntereZeile-y1;  y2=UntereZeile-y2; }  // y spiegeln
  2313.   char x=x1, y=y1;
  2314.   char Abbruch=false;
  2315.   while(Abbruch==false) {
  2316.     SetzeKopierePunktLaufgeschwindigkeit(x, y, PunktKopier);
  2317.     if (x==x2 && y==y2) Abbruch=true;
  2318.     if (bitRead(Spiegel,2)==0) {
  2319.       if (x==x2)
  2320.         {x=x1; if (y<y2) y++; if (y>y2) y--; }
  2321.       else
  2322.         {if (x<x2) x++; if (x>x2) x--; }
  2323.     } else {
  2324.       if (y==y2)
  2325.         {y=y1; if (x<x2) x++; if (x>x2) x--; }
  2326.       else
  2327.         {if (y<y2) y++; if (y>y2) y--; }
  2328.     }
  2329.   }
  2330. }
  2331.  
  2332. //---------------------------------------------------------------------------
  2333.  
  2334. void KarteAuflegenLinksLaufgeschwindigkeit() {
  2335.   for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++) {
  2336.       for (char KopierSpalte=0; KopierSpalte<=Spalte; KopierSpalte++)
  2337.         SetzeSpalteHauptMatrix(RechteSpalte-Spalte+KopierSpalte,HoleSpalteSchattenMatrix(KopierSpalte));
  2338.       ZeigeMatrixLaufgeschwindigkeit();
  2339.   }
  2340.   ZeigeMatrixLaufgeschwindigkeit();
  2341. }
  2342.  
  2343. //---------------------------------------------------------------------------
  2344.  
  2345. void KarteAuflegenRechtsLaufgeschwindigkeit() {
  2346.     for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++) {
  2347.       for (char KopierSpalte=0; KopierSpalte<=Spalte; KopierSpalte++)
  2348.         SetzeSpalteHauptMatrix(KopierSpalte,HoleSpalteSchattenMatrix(RechteSpalte-Spalte+KopierSpalte));
  2349.       ZeigeMatrixLaufgeschwindigkeit();
  2350.   }
  2351.   ZeigeMatrixLaufgeschwindigkeit();
  2352. }
  2353.  
  2354. //---------------------------------------------------------------------------
  2355.  
  2356. void KarteAuflegenHochLaufgeschwindigkeit() {
  2357.   for (char Zeile=ObereZeile; Zeile<=UntereZeile; Zeile++) {
  2358.     for (char KopierZeile=0; KopierZeile<=Zeile; KopierZeile++)
  2359.       SetzeZeileHauptMatrix(UntereZeile-Zeile+KopierZeile,HoleZeileSchattenMatrix(KopierZeile));
  2360.     ZeigeMatrixLaufgeschwindigkeit();
  2361.   }
  2362.   ZeigeMatrixLaufgeschwindigkeit();
  2363. }
  2364.  
  2365. //---------------------------------------------------------------------------
  2366.  
  2367. void KarteAuflegenRunterLaufgeschwindigkeit() {
  2368.   for (char Zeile=ObereZeile; Zeile<=UntereZeile; Zeile++) {
  2369.     for (char KopierZeile=0; KopierZeile<=Zeile; KopierZeile++)
  2370.       SetzeZeileHauptMatrix(KopierZeile,HoleZeileSchattenMatrix(UntereZeile-Zeile+KopierZeile));
  2371.     ZeigeMatrixLaufgeschwindigkeit();
  2372.   }
  2373.   ZeigeMatrixLaufgeschwindigkeit();
  2374. }
  2375.  
  2376. //---------------------------------------------------------------------------
  2377.  
  2378. void KarteAuflegenLaufgeschwindigkeit() {
  2379.   switch(Richtung) {
  2380.     case Links:  KarteAuflegenLinksLaufgeschwindigkeit(); break;
  2381.     case Rechts: KarteAuflegenRechtsLaufgeschwindigkeit(); break;
  2382.     case Hoch:   KarteAuflegenHochLaufgeschwindigkeit(); break;
  2383.     case Runter: KarteAuflegenRunterLaufgeschwindigkeit(); break;
  2384.   }
  2385. }
  2386.  
  2387. //---------------------------------------------------------------------------
  2388.  
  2389. void KarteWegnehmenLinksLaufgeschwindigkeit() {
  2390.   SchiebeLeereSpalteLinksHauptMatrix();
  2391.   ZeigeMatrixLaufgeschwindigkeit();
  2392.   for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++) {
  2393.     SchiebeLeereSpalteLinksHauptMatrix();
  2394.     for (char KopierSpalte=0; KopierSpalte<=Spalte; KopierSpalte++)
  2395.       SetzeSpalteHauptMatrix(RechteSpalte-KopierSpalte,HoleSpalteSchattenMatrix(RechteSpalte-KopierSpalte));
  2396.     ZeigeMatrixLaufgeschwindigkeit();
  2397.   }
  2398.   ZeigeMatrixLaufgeschwindigkeit();
  2399. }
  2400.  
  2401. //---------------------------------------------------------------------------
  2402.  
  2403. void KarteWegnehmenRechtsLaufgeschwindigkeit() {
  2404.   SchiebeLeereSpalteRechtsHauptMatrix();
  2405.   ZeigeMatrixLaufgeschwindigkeit();
  2406.   for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++) {
  2407.     SchiebeLeereSpalteRechtsHauptMatrix();
  2408.     for (char KopierSpalte=0; KopierSpalte<=Spalte; KopierSpalte++)
  2409.       SetzeSpalteHauptMatrix(KopierSpalte,HoleSpalteSchattenMatrix(KopierSpalte));
  2410.     ZeigeMatrixLaufgeschwindigkeit();
  2411.   }
  2412.   ZeigeMatrixLaufgeschwindigkeit();
  2413. }
  2414.  
  2415. //---------------------------------------------------------------------------
  2416.  
  2417. void KarteWegnehmenHochLaufgeschwindigkeit() {
  2418.   SchiebeLeereZeileHochHauptMatrix();
  2419.   ZeigeMatrixLaufgeschwindigkeit();
  2420.   for (char Zeile=ObereZeile; Zeile<=UntereZeile; Zeile++) {
  2421.     SchiebeLeereZeileHochHauptMatrix();
  2422.     for (char KopierZeile=0; KopierZeile<=Zeile; KopierZeile++)
  2423.       SetzeZeileHauptMatrix(UntereZeile-KopierZeile,HoleZeileSchattenMatrix(UntereZeile-KopierZeile));
  2424.     ZeigeMatrixLaufgeschwindigkeit();
  2425.   }
  2426.   ZeigeMatrixLaufgeschwindigkeit();
  2427. }
  2428.  
  2429. //---------------------------------------------------------------------------
  2430.  
  2431. void KarteWegnehmenRunterLaufgeschwindigkeit() {
  2432.   SchiebeLeereZeileRunterHauptMatrix();
  2433.   ZeigeMatrixLaufgeschwindigkeit();
  2434.   for (char Zeile=ObereZeile; Zeile<=UntereZeile; Zeile++) {
  2435.     SchiebeLeereZeileRunterHauptMatrix();
  2436.     for (char KopierZeile=0; KopierZeile<=Zeile; KopierZeile++)
  2437.       SetzeZeileHauptMatrix(KopierZeile,HoleZeileSchattenMatrix(KopierZeile));
  2438.     ZeigeMatrixLaufgeschwindigkeit();
  2439.   }
  2440.   ZeigeMatrixLaufgeschwindigkeit();
  2441. }
  2442.  
  2443. //---------------------------------------------------------------------------
  2444.  
  2445. void KarteWegnehmenLaufgeschwindigkeit() {
  2446.   switch(Richtung) {
  2447.     case Links:  KarteWegnehmenLinksLaufgeschwindigkeit(); break;
  2448.     case Rechts: KarteWegnehmenRechtsLaufgeschwindigkeit(); break;
  2449.     case Hoch:   KarteWegnehmenHochLaufgeschwindigkeit(); break;
  2450.     case Runter: KarteWegnehmenRunterLaufgeschwindigkeit(); break;
  2451.   }
  2452. }
  2453.  
  2454. //---------------------------------------------------------------------------
  2455.  
  2456. void VorhangLaufgeschwindigkeit(const byte Muster[]) {
  2457.   byte HilfsMuster=Muster[0];
  2458.   Balken=Muster[2];
  2459.   for (char Zeile=ObereZeile; Zeile<=UntereZeile; Zeile++) {
  2460.     SetzeZeileSchattenMatrix(Zeile, HilfsMuster);
  2461.     HilfsMuster=HilfsMuster^Muster[1];
  2462.   }
  2463.   KopiereLaufgeschwindigkeit();
  2464. }
  2465.  
  2466. //---------------------------------------------------------------------------
  2467.  
  2468. void SpaltenRauteLaufgeschwindigkeit(byte Richtung1, byte Richtung2) {
  2469.   unsigned long SchiebeSpalten=0x0FC0;
  2470.   Richtung=Richtung1;
  2471.   for (char Zeile=0; Zeile<AnzahlZeilen+AnzahlSpalten; Zeile++) {
  2472.     if (Richtung2==Links) {
  2473.       SchiebeSpaltenHochRunterKodiertLaufgeschwindigkeit(1, lowByte(SchiebeSpalten));
  2474.       SchiebeSpalten=SchiebeSpalten>>1;
  2475.     } else {
  2476.       SchiebeSpaltenHochRunterKodiertLaufgeschwindigkeit(1, lowByte(SchiebeSpalten>>11));
  2477.       SchiebeSpalten=SchiebeSpalten<<1;
  2478.     }
  2479.   }
  2480. }
  2481.  
  2482. //---------------------------------------------------------------------------
  2483.  
  2484. void ZeilenRauteLaufgeschwindigkeit(byte Richtung1, byte Richtung2) {
  2485.   unsigned long SchiebeZeilen=0x07F0;
  2486.   Richtung=Richtung1;
  2487.   for (char Zeile=0; Zeile<AnzahlZeilen+AnzahlSpalten; Zeile++) {
  2488.     if (Richtung2==Hoch) {
  2489.       SchiebeZeilenKodiert(lowByte(SchiebeZeilen), Laufgeschwindigkeit);
  2490.       SchiebeZeilen=SchiebeZeilen>>1;
  2491.     } else {
  2492.       SchiebeZeilenKodiert(lowByte(SchiebeZeilen>>11), Laufgeschwindigkeit);
  2493.       SchiebeZeilen=SchiebeZeilen<<1;
  2494.     }
  2495.   }
  2496. }
  2497.  
  2498. //---------------------------------------------------------------------------
  2499.  
  2500. void RauteLaufgeschwindigkeit(byte Richtung1, byte Richtung2) {
  2501.   SetzeNeueLaufgeschwindigkeit(Laufgeschwindigkeit/2);
  2502.   switch (Richtung1) {
  2503.     case Links:
  2504.     case Rechts: ZeilenRauteLaufgeschwindigkeit(Richtung1, Richtung2); break;
  2505.     case Hoch:
  2506.     case Runter: SpaltenRauteLaufgeschwindigkeit(Richtung1, Richtung2); break;
  2507.   }
  2508.   ZurueckZurAltenLaufgeschwindigkeit();
  2509. }
  2510.  
  2511. //---------------------------------------------------------------------------
  2512.  
  2513. void ZeigeText(char const *Text, boolean Pause, boolean Leeren) {
  2514.   char Muster;
  2515.   do {
  2516.     Muster=pgm_read_byte(Text);
  2517.     if (Muster!=Ende) {
  2518.       SchiebeAbstandLinksLaufgeschwindigkeit();
  2519.       SchiebeZeichenLinksLaufgeschwindigkeit(Muster);
  2520.       if (Pause) ZeigeMatrixZeigedauer();
  2521.     }
  2522.     Text++;
  2523.   } while(Muster!=Ende);
  2524.   SchiebeAbstandLinksLaufgeschwindigkeit();
  2525.   if (Leeren==true) SchiebeLeerLinksLaufgeschwindigkeit();
  2526. }
  2527.  
  2528. //---------------------------------------------------------------------------
  2529.  
  2530. int TagImJahr(char Tag, char Monat, char Jahr) {
  2531.   int Tage=Tag;
  2532.   for (char m=0; m<Monat-1; m++) Tage=Tage+MaxTage[m];
  2533.   if ((Jahr%4)==0 && Monat>=3) Tage++;
  2534.   return Tage;
  2535. }
  2536.  
  2537. //---------------------------------------------------------------------------
  2538.  
  2539. char WocheImJahr(void) {
  2540.   int Tage=TagImJahr(Tag, Monat, Jahr);
  2541.   int Do=WochenTag(1,1,Jahr);
  2542.   if (Do>=4) Tage=Tage+Do-1; else Tage=Tage+Do+6; //01.01. >= Donnerstag
  2543.   char Woche=Tage/Wochentage; if(Woche==0) Woche=53;
  2544.   return Woche;
  2545. }
  2546.  
  2547. //---------------------------------------------------------------------------
  2548.  
  2549. void MachePause(){
  2550.   LoescheHauptMatrix();
  2551.   if (PauseOk==true) ZeigeMatrixPausendauer();
  2552. }
  2553.  
  2554. //---------------------------------------------------------------------------
  2555.  
  2556. void Stelle(char &Was, char Trenner, char Min, char Max) {
  2557.   Was=constrain(Was, Min, Max);
  2558.   if (StellDelta==1) {
  2559.     Was=Was+StellDelta;
  2560.     if (Was>Max) Was=Min;
  2561.     StellDelta=0;
  2562.     if (Modus>=ZeitStellModus && Modus<= ZeitStellModus+4) UhrWurdeGestellt=true;
  2563.   }
  2564.   if (StellDelta==-1) {
  2565.     Was=Was+StellDelta;
  2566.     if (Was<Min) Was=Max;
  2567.     StellDelta=0;
  2568.     if (Modus>=ZeitStellModus && Modus<= ZeitStellModus+4) UhrWurdeGestellt=true;
  2569.   }
  2570.   if (BlinkCount>MaxBlinkCount/2) Trenner=0;
  2571.   if (Modus==WeckerStellModus)   {
  2572.     SetzeZeichen(HauptMatrix, WochenTagTexte[WeckerWTag][0], ZehnerPos);
  2573.     SetzeSpalteHauptMatrix(TrennerPos, Trenner);
  2574.     SetzeZeichen(HauptMatrix, WochenTagTexte[WeckerWTag][1], EinerPos);
  2575.   }
  2576.   else  {
  2577.     if (Modus==WeckerStellModus+1)   {
  2578.       SetzeSpalteHauptMatrix(TrennerPos, Trenner);
  2579.       if (WeckerEinAus[WeckerWTag]==WeckerAus)
  2580.         SetzeZeichen(HauptMatrix, _A, EinerPos);
  2581.       else
  2582.         SetzeZeichen(HauptMatrix, _E, EinerPos);
  2583.     }
  2584.     else {
  2585.       SetzeZahl(HauptMatrix, Was, Trenner);
  2586.     }
  2587.   }
  2588.   ZeigeMatrix(byte(StellZeigeZeit));
  2589.   if (millis()-Moduszeit>MaxModusZeit) {
  2590.     Modus=0;
  2591.   }
  2592. }
  2593.  
  2594. //---------------------------------------------------------------------------
  2595.  
  2596. void Vorbereitung() {
  2597.   LoescheHauptMatrix();
  2598.   LoescheSchattenMatrix();
  2599.   Pausendauer=60*ZeitLupe/ZeitRaffer;
  2600.   Zeigedauer=60*ZeitLupe/ZeitRaffer;
  2601.   Laufgeschwindigkeit=MaxVariLaufgeschwindigkeit*ZeitLupe/ZeitRaffer;
  2602.   Nullunterdrueckung=false;
  2603.   PauseOk=true;
  2604.   AlteZahl=0;
  2605.   Balken=KeinBalken;
  2606.   Richtung=Links;
  2607.   ZeigeImmer=true;
  2608.   BildVersatz=0;
  2609.   byte Zufall=Random(127); // 128 ???
  2610.   ZufallWaagerecht1=bitRead(Zufall,0);
  2611.   ZufallWaagerecht2=bitRead(Zufall,1);
  2612.   ZufallSenkrecht1=ZufallWaagerecht1+2;
  2613.   ZufallSenkrecht2=ZufallWaagerecht2+2;
  2614.   Zufall4Richtungen=Random(4);
  2615.   Zufall6Richtungen=Random(6);
  2616.   Zufall10Richtungen=Random(10);
  2617.   ZufallArt16=Random(16);
  2618.   ZufallZuerst=bitRead(Zufall,2);
  2619.   ZufallBoolean1=bitRead(Zufall,3);
  2620.   ZufallBoolean2=bitRead(Zufall,4);
  2621.   ZufallBoolean3=bitRead(Zufall,5);
  2622.   if (Modus==0) HoleUhr();
  2623.   Zahl1=Stunden; Zahl2=Minuten;
  2624. }
  2625.  
  2626. //---------------------------------------------------------------------------
  2627. // Zeige Zahlen
  2628. //---------------------------------------------------------------------------
  2629.  
  2630. void TauscheZahlen() {
  2631.   Tausche(Zahl1, Zahl2);
  2632. }
  2633.  
  2634. //---------------------------------------------------------------------------
  2635.  
  2636. void SchiebeZahlLaufgeschwindigkeit(char Zahl) {
  2637.   SetzeZahlSchattenMatrix(Zahl);
  2638.   SchiebeLaufgeschwindigkeit();
  2639. }
  2640.  
  2641.  
  2642. //---------------------------------------------------------------------------
  2643.  
  2644. void SchiebeZeigeZahl(char Zahl) {
  2645.   SchiebeZahlLaufgeschwindigkeit(Zahl);
  2646.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  2647. }
  2648.  
  2649. //---------------------------------------------------------------------------
  2650.  
  2651. void SchiebeZeigeZahlLinks(char Zahl) {
  2652.   Richtung=Links;
  2653.   SchiebeZeigeZahl(Zahl);
  2654. }
  2655.  
  2656. //---------------------------------------------------------------------------
  2657.  
  2658. void ZeigeZahlen() {
  2659.   SchiebeZeigeZahl(Zahl1);
  2660.   SchiebeDoppelpunktLaufgeschwindigkeit();
  2661.   SchiebeZeigeZahl(Zahl2);
  2662.   SchiebeZahlLaufgeschwindigkeit(LeerZahl);
  2663. }
  2664.  
  2665. //---------------------------------------------------------------------------
  2666.  
  2667. void ZeigeZahlenLinksLinksRechts() {
  2668.   SchiebeZeigeZahlLinks(Zahl1);
  2669.   SchiebeDoppelpunktLaufgeschwindigkeit();
  2670.   SchiebeZeigeZahlLinks(Zahl2);
  2671.   Richtung=Rechts;
  2672.   SchiebeDoppelpunktLaufgeschwindigkeit();
  2673.   SchiebeZeigeZahl(Zahl1);
  2674.   SchiebeZahlLaufgeschwindigkeit(LeerZahl);
  2675. }
  2676.  
  2677. //---------------------------------------------------------------------------
  2678.  
  2679. void ZeigeZahlenRechtsRechtsLinks() {
  2680.   Richtung=Rechts;
  2681.   SchiebeZeigeZahl(Zahl2);
  2682.   SchiebeDoppelpunktLaufgeschwindigkeit();
  2683.   SchiebeZeigeZahl(Zahl1);
  2684.   Richtung=Links;
  2685.   SchiebeDoppelpunktLaufgeschwindigkeit();
  2686.   SchiebeZeigeZahl(Zahl2);
  2687.   SchiebeZahlLaufgeschwindigkeit(LeerZahl);
  2688. }
  2689.  
  2690. //---------------------------------------------------------------------------
  2691.  
  2692. void ZeigeZahlenSenkrechtLinksSenkrecht(byte Richtung1, byte Richtung2) {
  2693.   Richtung=Richtung1;
  2694.   SchiebeZeigeZahl(Zahl1);
  2695.   Richtung=Links;
  2696.   SchiebeDoppelpunktLaufgeschwindigkeit();
  2697.   SchiebeZeigeZahl(Zahl2);
  2698.   Richtung=Richtung2;
  2699.   SchiebeZahlLaufgeschwindigkeit(LeerZahl);
  2700. }
  2701.  
  2702. //---------------------------------------------------------------------------
  2703.  
  2704. void ZeigeZahlenSenkrechtRechtsSenkrecht(byte Richtung1, byte Richtung2) {
  2705.   Richtung=Richtung1;
  2706.   SchiebeZeigeZahl(Zahl1);
  2707.   Richtung=Rechts;
  2708.   SchiebeDoppelpunktLaufgeschwindigkeit();
  2709.   SchiebeZeigeZahl(Zahl2);
  2710.   Richtung=Richtung2;
  2711.   SchiebeZahlLaufgeschwindigkeit(LeerZahl);
  2712. }
  2713.  
  2714. //---------------------------------------------------------------------------
  2715.  
  2716. void ZeigeZahlenSetzen() {
  2717.   ZeigeSetzeZahlHauptMatrix(Zahl1);
  2718.   ZeigeSetzeZahlHauptMatrix(Zahl2);
  2719.   ZeigeSetzeZahlHauptMatrix(LeerZahl);
  2720. }
  2721.  
  2722. //---------------------------------------------------------------------------
  2723.  
  2724. void ZeigeZahlenSetzenZehnerEiner() {
  2725.   ZeigeSetzeZahlZehnerEiner(Zahl1);
  2726.   ZeigeSetzeZahlZehnerEiner(Zahl2);
  2727.   ZeigeSetzeZahlZehnerEiner(LeerZahl);
  2728. }
  2729.  
  2730. //---------------------------------------------------------------------------
  2731.  
  2732. void ZeigeZahlZehnerLinksEiner(byte ZehnerRichtung, byte EinerRichtung, char Zahl) {
  2733.   SetzeEiner(SchattenMatrix, Zahl/10);
  2734.   Richtung=ZehnerRichtung;
  2735.   SchiebeEinerLaufgeschwindigkeit();
  2736.   Richtung=Links;
  2737.   SchiebeGrosserAbstandLaufgeschwindigkeit();
  2738.   SetzeZahlSchattenMatrix(Zahl);
  2739.   Richtung=EinerRichtung;
  2740.   SchiebeEinerLaufgeschwindigkeit();
  2741.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  2742. }
  2743.  
  2744. //---------------------------------------------------------------------------
  2745.  
  2746. void ZeigeZahlEinerRechtsZehner(byte EinerRichtung, byte ZehnerRichtung, char Zahl) {
  2747.   SetzeZehner(SchattenMatrix, Zahl%10);
  2748.   Richtung=EinerRichtung;
  2749.   SchiebeZehnerLaufgeschwindigkeit();
  2750.   Richtung=Rechts;
  2751.   SchiebeGrosserAbstandLaufgeschwindigkeit();
  2752.   SetzeZahlSchattenMatrix(Zahl);
  2753.   Richtung=ZehnerRichtung;
  2754.   SchiebeZehnerLaufgeschwindigkeit();
  2755.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  2756. }
  2757.  
  2758. //---------------------------------------------------------------------------
  2759.  
  2760. void ZeigeZahlenEinerRechtsZehner(byte Richtung1, byte Richtung2) {
  2761.   ZeigeZahlEinerRechtsZehner(Richtung1, Richtung2, Zahl1);
  2762.   Richtung=Rechts;
  2763.   SchiebeGrosserAbstandLaufgeschwindigkeit();
  2764.   ZeigeZahlEinerRechtsZehner(Richtung1, Richtung2, Zahl2);
  2765.   SchiebeLeerRechtsLaufgeschwindigkeit();
  2766. }
  2767.  
  2768. //---------------------------------------------------------------------------
  2769.  
  2770. void ZeigeZahlSchiebeZehnerEiner(byte ZehnerRichtung, byte EinerRichtung, char Zahl) {
  2771.   SetzeZahlSchattenMatrix(Zahl);
  2772.   if (ZufallZuerst==ZehnerZuerst) {
  2773.     Richtung=ZehnerRichtung;
  2774.     SchiebeZehnerLaufgeschwindigkeit();
  2775.   }
  2776.   Richtung=EinerRichtung;
  2777.   SchiebeEinerLaufgeschwindigkeit();
  2778.   if (ZufallZuerst==!ZehnerZuerst) {
  2779.     Richtung=ZehnerRichtung;
  2780.     SchiebeZehnerLaufgeschwindigkeit();
  2781.   }
  2782.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  2783. }
  2784.  
  2785. //---------------------------------------------------------------------------
  2786.  
  2787. void ZeigeZahlenSchiebeZehnerEiner(byte ZehnerRichtung, byte EinerRichtung) {
  2788.   ZeigeZahlSchiebeZehnerEiner(ZehnerRichtung, EinerRichtung, Zahl1);
  2789.   ZeigeZahlSchiebeZehnerEiner(ZehnerRichtung, EinerRichtung, Zahl2);
  2790.   ZeigeZahlSchiebeZehnerEiner(ZehnerRichtung, EinerRichtung, LeerZahl);
  2791. }
  2792.  
  2793. //---------------------------------------------------------------------------
  2794.  
  2795. void ZeigeZahlSchiebeZehnerEinerGleichzeitig(char Zahl) {
  2796.   SetzeZahlSchattenMatrix(Zahl);
  2797.   SchiebeZehnerEinerGleichzeitigLaufgeschwindigkeit();
  2798.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  2799. }
  2800.  
  2801. //---------------------------------------------------------------------------
  2802.  
  2803. void ZeigeZahlenSchiebeZehnerEinerGleichzeitig() {
  2804.   ZeigeZahlSchiebeZehnerEinerGleichzeitig(Zahl1);
  2805.   ZeigeZahlSchiebeZehnerEinerGleichzeitig(Zahl2);
  2806.   ZeigeZahlSchiebeZehnerEinerGleichzeitig(LeerZahl);
  2807. }
  2808.  
  2809. //---------------------------------------------------------------------------
  2810.  
  2811. void ZeigeZahlenZehnerLinksEiner(byte Richtung1, byte Richtung2) {
  2812.   ZeigeZahlZehnerLinksEiner(Richtung1, Richtung2, Zahl1);
  2813.   Richtung=Links;
  2814.   SchiebeGrosserAbstandLaufgeschwindigkeit();
  2815.   ZeigeZahlZehnerLinksEiner(Richtung1, Richtung2, Zahl2);
  2816.   SchiebeLeerLinksLaufgeschwindigkeit();
  2817. }
  2818.  
  2819. //---------------------------------------------------------------------------
  2820.  
  2821. void ZeigeZahlSchreibe(char Zahl) {
  2822.   if(ZufallZuerst==ZehnerZuerst) SchreibeZifferLaufgeschwindigkeit(Zahl/10, ZehnerPos, Laufgeschwindigkeit);
  2823.   SchreibeZifferLaufgeschwindigkeit(Zahl%10, EinerPos, Laufgeschwindigkeit);
  2824.   if(ZufallZuerst==!ZehnerZuerst) SchreibeZifferLaufgeschwindigkeit(Zahl/10, ZehnerPos, Laufgeschwindigkeit);
  2825.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  2826. }
  2827.  
  2828. //---------------------------------------------------------------------------
  2829.  
  2830. void ZeigeZahlenSchreibeZehnerEiner() {
  2831.   ZeigeZahlSchreibe(Zahl1);
  2832.   ZeigeZahlSchreibe(Zahl2);
  2833.   ZeigeSetzeZahlZehnerEiner(LeerZahl);
  2834. }
  2835.  
  2836. //---------------------------------------------------------------------------
  2837.  
  2838. void ZeigeBisZahlZaehle(char Zahl) {
  2839.   char z=AlteZahl;
  2840.   do {
  2841.     if (z<Zahl) z++;
  2842.     if (z>Zahl) z--;
  2843.     SetzeNeueLaufgeschwindigkeit(max(18-abs(Zahl-z), MinVariLaufgeschwindigkeit));
  2844.     SetzeZahlHauptMatrix(z);
  2845.     ZeigeMatrixLaufgeschwindigkeit();
  2846.     ZurueckZurAltenLaufgeschwindigkeit();
  2847.   } while (z!=Zahl);
  2848.   ZeigeMatrixZeigedauer();
  2849.   AlteZahl=Zahl;
  2850. }
  2851.  
  2852. //---------------------------------------------------------------------------
  2853.  
  2854. void ZeigeZahlHexadezimal(char Zahl) {
  2855.   SchiebeZeichenLinksLaufgeschwindigkeit(0);
  2856.   SchiebeAbstandLinksLaufgeschwindigkeit();
  2857.   SchiebeZeichenLinksLaufgeschwindigkeit(_x);
  2858.   SchiebeAbstandLinksLaufgeschwindigkeit();
  2859.   SchiebeZeichenLinksLaufgeschwindigkeit(Zahl/16);
  2860.   SchiebeAbstandLinksLaufgeschwindigkeit();
  2861.   SchiebeZeichenLinksLaufgeschwindigkeit(Zahl%16);
  2862.   ZeigeMatrixZeigedauer();
  2863. }
  2864.  
  2865. //---------------------------------------------------------------------------
  2866.  
  2867. void ZeigeZahlOktal(char Zahl) {
  2868.   SchiebeZeichenLinksLaufgeschwindigkeit(0);
  2869.   SchiebeAbstandLinksLaufgeschwindigkeit();
  2870.   SchiebeZeichenLinksLaufgeschwindigkeit(Zahl/8);
  2871.   SchiebeAbstandLinksLaufgeschwindigkeit();
  2872.   SchiebeZeichenLinksLaufgeschwindigkeit(Zahl%8);
  2873.   ZeigeMatrixZeigedauer();
  2874. }
  2875.  
  2876. //---------------------------------------------------------------------------
  2877.  
  2878. void ZeigeZahlSchiebeSpalten124(unsigned long Spalten, char Zahl) {
  2879.   SetzeZahlSchattenMatrix(Zahl);
  2880.   SchiebeSpalten6xHochRunterLaufgeschwindigkeit(Spalten);
  2881.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  2882. }
  2883.  
  2884. //---------------------------------------------------------------------------
  2885.  
  2886. void ZeigeZahlenSchiebeSpalten124(unsigned long Spalten) {
  2887.   ZeigeZahlSchiebeSpalten124(Spalten, Zahl1);
  2888.   ZeigeZahlSchiebeSpalten124(Spalten, Zahl2);
  2889.   ZeigeZahlSchiebeSpalten124(Spalten, LeerZahl);
  2890. }
  2891. //---------------------------------------------------------------------------
  2892.  
  2893. void ZeigeZahlSchiebeSpalten12(byte Spalten, byte Richtung1, byte Richtung2, char Zahl) {
  2894.   SetzeZahlSchattenMatrix(Zahl);
  2895.   SchiebeSpalten12(Spalten, Richtung1, Richtung2);
  2896.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  2897. }
  2898.  
  2899. //---------------------------------------------------------------------------
  2900.  
  2901. void ZeigeZahlenSchiebeSpalten25(byte Spalten, byte Richtung1, byte Richtung2) {
  2902.   ZeigeZahlSchiebeSpalten12(Spalten, Richtung1, Richtung2, Zahl1);
  2903.   ZeigeZahlSchiebeSpalten12(Spalten, Richtung1, Richtung2, Zahl2);
  2904.   ZeigeZahlSchiebeSpalten12(Spalten, Richtung1, Richtung2, LeerZahl);
  2905. }
  2906.  
  2907. //---------------------------------------------------------------------------
  2908.  
  2909. void ZeigeZahlSchiebeSpalten25Gleichzeitig(byte Spalten, char Zahl) {
  2910.   SetzeZahlSchattenMatrix(Zahl);
  2911.   SchiebeSpalten25GleichzeitigLaufgeschwindigkeit(Spalten);
  2912.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  2913. }
  2914.  
  2915. //---------------------------------------------------------------------------
  2916.  
  2917. void ZeigeZahlenSchiebeSpalten25Gleichzeitig(byte Spalten) {
  2918.   ZeigeZahlSchiebeSpalten25Gleichzeitig(Spalten, Zahl1);
  2919.   ZeigeZahlSchiebeSpalten25Gleichzeitig(Spalten, Zahl2);
  2920.   ZeigeZahlSchiebeSpalten25Gleichzeitig(Spalten, LeerZahl);
  2921. }
  2922.  
  2923. //---------------------------------------------------------------------------
  2924.  
  2925. void ZeigeZahlTauschen(char Zahl) {
  2926.   SetzeZahlSchattenMatrix(Zahl);
  2927.   for (char Spalte=RechteSpalte; Spalte>=LinkeSpalte; Spalte--) {
  2928.     LoescheHauptMatrix();
  2929.     for (char TauschSpalte=0; TauschSpalte<MitteSpalte; TauschSpalte++) {
  2930.       if (Spalte+TauschSpalte<=RechteSpalte) {
  2931.         HauptMatrix[Spalte+TauschSpalte]=HauptMatrix[Spalte+TauschSpalte] | SchattenMatrix[TauschSpalte];
  2932.         HauptMatrix[RechteSpalte-Spalte-TauschSpalte]=HauptMatrix[RechteSpalte-Spalte-TauschSpalte] | SchattenMatrix[RechteSpalte-TauschSpalte];
  2933.       }
  2934.     }
  2935.     ZeigeMatrixLaufgeschwindigkeit();
  2936.   }
  2937.   ZeigeMatrixZeigedauer();
  2938.   LoescheNachAussenLaufgeschwindigkeit();
  2939. }
  2940.  
  2941. //---------------------------------------------------------------------------
  2942.  
  2943. void ZeigeZahlenTauschen() {
  2944.   ZeigeZahlTauschen(Zahl1);
  2945.   ZeigeZahlTauschen(Zahl2);
  2946. }
  2947.  
  2948. //---------------------------------------------------------------------------
  2949.  
  2950. void ZahlKopiereLaufgeschwindigkeit(char Zahl) {
  2951.   SetzeZahlSchattenMatrix(Zahl);
  2952.   KopiereLaufgeschwindigkeit();
  2953. }
  2954.  
  2955. //---------------------------------------------------------------------------
  2956.  
  2957. void ZeigeZahlKopiere(char Zahl) {
  2958.   ZahlKopiereLaufgeschwindigkeit(Zahl);
  2959.   ZeigeMatrixZeigedauer();
  2960. }
  2961.  
  2962. //---------------------------------------------------------------------------
  2963.  
  2964. void ZeigeZahlenKopieren() {
  2965.   ZeigeZahlKopiere(Zahl1);
  2966.   ZeigeZahlKopiere(Zahl2);
  2967.   ZahlKopiereLaufgeschwindigkeit(LeerZahl);
  2968. }
  2969.  
  2970. //--------------------------------------------------------------------------
  2971.  
  2972. void ZeigeZahlenHinHer() {
  2973.   Balken=AlleSpalten;
  2974.   ZeigeZahlKopiere(Zahl1);
  2975.   RichtungUmkehr();
  2976.   ZeigeZahlKopiere(Zahl2);
  2977.   RichtungUmkehr();
  2978.   ZahlKopiereLaufgeschwindigkeit(LeerZahl);
  2979. }
  2980.  
  2981. //---------------------------------------------------------------------------
  2982.  
  2983. void ZeigeZahlKopiereNachGleichzeitig(char Zahl) {
  2984.   SetzeZahlSchattenMatrix(Zahl);
  2985.   KopiereNachGleichzeitigLaufgeschwindigkeit();
  2986.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  2987. }
  2988.  
  2989. //---------------------------------------------------------------------------
  2990.  
  2991. void ZeigeZahlenKopiereNachGleichzeitig() {
  2992.   ZeigeZahlKopiereNachGleichzeitig(Zahl1);
  2993.   ZeigeZahlKopiereNachGleichzeitig(Zahl2);
  2994.   ZeigeZahlKopiereNachGleichzeitig(LeerZahl);
  2995. }
  2996.  
  2997. //---------------------------------------------------------------------------
  2998.  
  2999. void ZeigeZahlKopiereZehnerEiner(byte ZehnerRichtung, byte EinerRichtung, char Zahl) {
  3000.   SetzeZahlSchattenMatrix(Zahl);
  3001.   ZeigeKopiereZehnerEiner(ZehnerRichtung, EinerRichtung);
  3002. }
  3003.  
  3004. //---------------------------------------------------------------------------
  3005.  
  3006. void ZeigeZahlenKopiereZehnerEiner(byte ZehnerRichtung, byte EinerRichtung) {
  3007.   ZeigeZahlKopiereZehnerEiner(ZehnerRichtung, EinerRichtung, Zahl1);
  3008.   ZeigeZahlKopiereZehnerEiner(ZehnerRichtung, EinerRichtung, Zahl2);
  3009.   ZeigeZahlKopiereZehnerEiner(ZehnerRichtung, EinerRichtung, LeerZahl);
  3010. }
  3011.  
  3012. //---------------------------------------------------------------------------
  3013.  
  3014. void ZeigeZahlPunkteZufall(char Zahl) {
  3015.   SetzeZahlSchattenMatrix(Zahl);
  3016.   PunkteZufallLaufgeschwindigkeit(LinkeSpalte, RechteSpalte);
  3017.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  3018. }
  3019.  
  3020. //---------------------------------------------------------------------------
  3021.  
  3022. void ZeigeZahlenPunkteZufall() {
  3023. //  ZeigeImmer=false;
  3024.   SetzeNeueLaufgeschwindigkeit(Laufgeschwindigkeit/2);
  3025.   ZeigeZahlPunkteZufall(Zahl1);
  3026.   ZeigeZahlPunkteZufall(Zahl2);
  3027.   ZeigeZahlPunkteZufall(LeerZahl);
  3028. }
  3029.  
  3030. //---------------------------------------------------------------------------
  3031.  
  3032. void ZeigeZahlZehnerEinerPunkteZufall(char Zahl) {
  3033.   SetzeZahlSchattenMatrix(Zahl);
  3034.   ZehnerEinerPunkteZufallLaufgeschwindigkeit();
  3035.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  3036. }
  3037.  
  3038. //---------------------------------------------------------------------------
  3039.  
  3040. void ZeigeZahlenZehnerEinerPunkteZufall() {
  3041.   SetzeNeueLaufgeschwindigkeit(Laufgeschwindigkeit/2);
  3042.   ZeigeZahlZehnerEinerPunkteZufall(Zahl1);
  3043.   ZeigeZahlZehnerEinerPunkteZufall(Zahl2);
  3044.   ZeigeZahlZehnerEinerPunkteZufall(LeerZahl);
  3045. }
  3046.  
  3047. //---------------------------------------------------------------------------
  3048.  
  3049. void ZeigeZahlSpaltenZufall(boolean Schieben, char Zahl) {
  3050.   SetzeZahlSchattenMatrix(Zahl);
  3051.   SpaltenZufallLaufgeschwindigkeit(Schieben);
  3052.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  3053. }
  3054.  
  3055. //---------------------------------------------------------------------------
  3056.  
  3057. void ZeigeZahlenSpaltenZufall(boolean Schieben) {
  3058.   ZeigeZahlSpaltenZufall(Schieben, Zahl1);
  3059.   ZeigeZahlSpaltenZufall(Schieben, Zahl2);
  3060.   ZeigeZahlSpaltenZufall(Schieben, LeerZahl);
  3061. }
  3062.  
  3063. //---------------------------------------------------------------------------
  3064.  
  3065. void ZeigeZahlZeilenZufall(boolean Schieben, char Zahl) {
  3066.   SetzeZahlSchattenMatrix(Zahl);
  3067.   ZeilenZufallLaufgeschwindigkeit(Schieben);
  3068.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  3069. }
  3070.  
  3071. //---------------------------------------------------------------------------
  3072.  
  3073. void ZeigeZahlenZeilenZufall(boolean Schieben) {
  3074.   ZeigeZahlZeilenZufall(Schieben, Zahl1);
  3075.   ZeigeZahlZeilenZufall(Schieben, Zahl2);
  3076.   ZeigeZahlZeilenZufall(Schieben, LeerZahl);
  3077. }
  3078.  
  3079. //---------------------------------------------------------------------------
  3080.  
  3081. void ZeigeBisZahlZufall(char Zahl, char Max, char Oft) {
  3082.   while (Oft>0) {
  3083.     char Zufall=Random(Max);
  3084.     if (Zufall/10!=Zahl/10 && Zufall%10!=Zahl%10) {
  3085.       SetzeZahlHauptMatrix(Zufall);
  3086.       ZeigeMatrixLaufgeschwindigkeit();
  3087.     }
  3088.     Oft--;
  3089.   }
  3090.   LoescheHauptMatrix();
  3091.   ZeigeSetzeZahlHauptMatrix(Zahl);
  3092. }
  3093.  
  3094. //---------------------------------------------------------------------------
  3095.  
  3096. void ZeigeBisZahlZufallZehnerEiner(char Zahl, char Max, char Oft) {
  3097.   char Oft2=Oft;
  3098.   char AltZufall=0;
  3099.   while (Oft>0) {
  3100.     char Zufall=Random(Max);
  3101.     if (Zufall/10!=Zahl/10 && Zufall%10!=Zahl%10 && Zufall/10!=AltZufall/10 && Zufall%10!=AltZufall%10) {
  3102.       AltZufall=Zufall;
  3103.       ZeigeSetzeZehnerEiner(Zufall, Laufgeschwindigkeit);
  3104.     }
  3105.     Oft--;
  3106.   }
  3107.   ZeigeSetzeZehnerEiner(Zahl, Laufgeschwindigkeit);
  3108.  
  3109.   ZufallZuerstUmkehr();
  3110.   while (Oft2>0) {
  3111.     char Zufall=Random(Max);
  3112.     if (Zufall/10!=Zahl/10 && Zufall%10!=Zahl%10 && Zufall/10!=AltZufall/10 && Zufall%10!=AltZufall%10) {
  3113.       AltZufall=Zufall;
  3114.       ZeigeSetzeZehnerEiner(Zufall, Laufgeschwindigkeit);
  3115.     }
  3116.     Oft2--;
  3117.   }
  3118.   ZufallZuerstUmkehr();
  3119.   ZeigeSetzeZahlHauptMatrix(Zahl);
  3120. }
  3121.  
  3122. //---------------------------------------------------------------------------
  3123.  
  3124. void ZeigeZahlZehnerLinksEinerLinks(char Zahl) {
  3125.   SetzeZehner(SchattenMatrix,Zahl/10);
  3126.   Richtung=Links;
  3127.   SchiebeAlleSpaltenLinksRechtsLaufgeschwindigkeit();
  3128.   SetzeEiner(SchattenMatrix,Zahl%10);
  3129.   for (char Spalte=0; Spalte<ZeichenBreite; Spalte++) {
  3130.     SchiebeSpaltenLinksVonBisHauptMatrix(LinkeEinerSpalte, RechteEinerSpalte,
  3131.       SchiebeSpaltenLinksVonBisSchattenMatrix(LinkeEinerSpalte, RechteEinerSpalte, LeerMuster));
  3132.     ZeigeMatrixLaufgeschwindigkeit();
  3133.   }
  3134.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  3135. }
  3136.  
  3137. //---------------------------------------------------------------------------
  3138.  
  3139. void ZeigeZahlenZehnerLinksEinerLinks() {
  3140.   ZeigeZahlZehnerLinksEinerLinks(Zahl1);
  3141.   LoescheZehnerEinerNachLinksLaufgeschwindigkeit();
  3142.   ZeigeZahlZehnerLinksEinerLinks(Zahl2);
  3143.   LoescheZehnerEinerNachLinksLaufgeschwindigkeit();
  3144. }
  3145.  
  3146. //---------------------------------------------------------------------------
  3147.  
  3148. void ZeigeZahlEinerRechtsZehnerRechts(char Zahl) {
  3149.   SetzeEiner(SchattenMatrix,Zahl%10);
  3150.   Richtung=Rechts;
  3151.   SchiebeAlleSpaltenLinksRechtsLaufgeschwindigkeit();
  3152.   SetzeZehner(SchattenMatrix,Zahl/10);
  3153.   for (char Spalte=0; Spalte<ZeichenBreite; Spalte++) {
  3154.     SchiebeSpaltenRechtsVonBisHauptMatrix(LinkeZehnerSpalte,RechteZehnerSpalte,
  3155.       SchiebeSpaltenRechtsVonBisSchattenMatrix(LinkeZehnerSpalte, RechteZehnerSpalte, LeerMuster));
  3156.     ZeigeMatrixLaufgeschwindigkeit();
  3157.   }
  3158.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  3159. }
  3160.  
  3161. //---------------------------------------------------------------------------
  3162.  
  3163. void ZeigeZahlenEinerRechtsZehnerRechts() {
  3164.   ZeigeZahlEinerRechtsZehnerRechts(Zahl1);
  3165.   LoescheEinerZehnerNachRechtsLaufgeschwindigkeit();
  3166.   ZeigeZahlEinerRechtsZehnerRechts(Zahl2);
  3167.   LoescheEinerZehnerNachRechtsLaufgeschwindigkeit();
  3168. }
  3169.  
  3170. //---------------------------------------------------------------------------
  3171.  
  3172. void ZeigeZahlSpirale(char Nr, char Art, byte Bereich, char Zahl) {
  3173.   if (Nr>=AnzahlEnfachSpiralen) Art=8+Art%4;
  3174.   SetzeZahlSchattenMatrix(Zahl);
  3175.   SpiraleLaufgeschwindigkeit(Nr, Art, Bereich);
  3176.   ZeigeMatrixZeigedauer();
  3177.   SetzeNeueLaufgeschwindigkeit(Laufgeschwindigkeit/2);
  3178.   SetzeZahlSchattenMatrix(LeerZahl);
  3179.   SpiraleLaufgeschwindigkeit(Nr, Art, Bereich);
  3180.   ZurueckZurAltenLaufgeschwindigkeit();
  3181. }
  3182.  
  3183. //---------------------------------------------------------------------------
  3184.  
  3185. void ZeigeZahlenSpirale(char Nr, char Art) {
  3186.   byte Bereich=Random(4);
  3187.   SetzeNeueLaufgeschwindigkeit(Laufgeschwindigkeit/2);
  3188.   ZeigeZahlSpirale(Nr, Art, Bereich, Zahl1);
  3189.   ZeigeZahlSpirale(Nr, Art, Bereich, Zahl2);
  3190. }
  3191.  
  3192. //---------------------------------------------------------------------------
  3193.  
  3194. void ZeigeZahlZehnerVonRechtsEiner(char EinerRichtung, char Zahl) {
  3195.   SchiebeZeichenLinksLaufgeschwindigkeit(Zahl/10);
  3196.   Richtung=Links;
  3197.   SchiebeGrosserAbstandLaufgeschwindigkeit();
  3198.   SetzeZahlSchattenMatrix(Zahl);
  3199.   Richtung=EinerRichtung;
  3200.   SchiebeEinerLaufgeschwindigkeit();
  3201.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  3202. }
  3203.  
  3204. //---------------------------------------------------------------------------
  3205.  
  3206. void ZeigeZahlenZehnerVonRechtsEiner(char ZehnerRichtung) {
  3207.   ZeigeZahlZehnerVonRechtsEiner(ZehnerRichtung, Zahl1);
  3208.   Richtung=Links;
  3209.   SchiebeAbstandLaufgeschwindigkeit();
  3210. //  SchiebeLeerLinksLaufgeschwindigkeit();
  3211.   ZeigeZahlZehnerVonRechtsEiner(ZehnerRichtung, Zahl2);
  3212.   SchiebeLeerLinksLaufgeschwindigkeit();
  3213. }
  3214.  
  3215. //---------------------------------------------------------------------------
  3216.  
  3217. void ZeigeZahlEinerVonLinksZehner(char ZehnerRichtung, char Zahl) {
  3218.   Richtung=Rechts;
  3219.   SchiebeZeichenLaufgeschwindigkeit(Zahl%10);
  3220.   SchiebeGrosserAbstandLaufgeschwindigkeit();
  3221.   SetzeZahlSchattenMatrix(Zahl);
  3222.   Richtung=ZehnerRichtung;
  3223.   SchiebeZehnerLaufgeschwindigkeit();
  3224.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  3225. }
  3226.  
  3227. //---------------------------------------------------------------------------
  3228.  
  3229. void ZeigeZahlenEinerVonLinksZehner(char ZehnerRichtung) {
  3230.   ZeigeZahlEinerVonLinksZehner(ZehnerRichtung, Zahl2);
  3231. //  SchiebeAbstandRechts();
  3232.   SchiebeLeerRechtsLaufgeschwindigkeit();
  3233.   ZeigeZahlEinerVonLinksZehner(ZehnerRichtung, Zahl1);
  3234.   SchiebeLeerRechtsLaufgeschwindigkeit();
  3235. }
  3236.  
  3237. //---------------------------------------------------------------------------
  3238.  
  3239. void ZeigeZahlenLaufenReinRaus() {
  3240.   SetzeZahlSchattenMatrix(Zahl1); ZeigeLaufenReinRaus();
  3241.   SetzeZahlSchattenMatrix(Zahl2); ZeigeLaufenReinRaus();
  3242. }
  3243.  
  3244. //---------------------------------------------------------------------------
  3245.  
  3246. void ZeigeBisZahlTacho(char Zahl) {
  3247.   char z=AlteZahl;
  3248.   byte RichtungTacho=Richtung;
  3249.   SetzeZahlHauptMatrix(z);
  3250.   while (z!=Zahl) {
  3251.     AlteZahl=z;
  3252.     if (z<Zahl) { z++; Richtung=RichtungTacho; }
  3253.     if (z>Zahl) { z--; Richtung=RichtungTacho^1; }
  3254.     byte Spalten=EinerSpalten;
  3255.     if (AlteZahl/10!=z/10) Spalten=Spalten | ZehnerSpalten;
  3256.     SetzeNeueLaufgeschwindigkeit(max(MaxVariLaufgeschwindigkeit-abs(Zahl-z), MinVariLaufgeschwindigkeit));
  3257.     SetzeZahlSchattenMatrix(z);
  3258.     SchiebeSpalten6xHochRunterLaufgeschwindigkeit(Spalten);
  3259.     ZurueckZurAltenLaufgeschwindigkeit();
  3260.     ZeigeMatrixLaufgeschwindigkeit();
  3261.   }
  3262.   ZeigeMatrixZeigedauer();
  3263.   AlteZahl=Zahl;
  3264. //  Richtung=RichtungTacho;
  3265. }
  3266.  
  3267. //---------------------------------------------------------------------------
  3268.  
  3269. void ZeigeBisZahlDaumenKinoZehnerEiner(char Zahl, char MaxZehner) {
  3270.   SetzeZahlHauptMatrix(AlteZahl);
  3271.   ZeigeMatrixLaufgeschwindigkeit();
  3272.   if (ZufallZuerst==ZehnerZuerst) DaumenKinoZehnerLaufgeschwindigkeit(Zahl, MaxZehner);
  3273.   DaumenKinoEinerLaufgeschwindigkeit(Zahl);
  3274.   if (ZufallZuerst==!ZehnerZuerst) DaumenKinoZehnerLaufgeschwindigkeit(Zahl, MaxZehner);
  3275.   ZeigeMatrixZeigedauer();
  3276. }
  3277.  
  3278. //---------------------------------------------------------------------------
  3279.  
  3280. void ZeigeBisZahlZaehleZehnerEiner(char Zahl, boolean NurVor) {
  3281.   if (ZufallZuerst==ZehnerZuerst) ZaehleZehnerLaufgeschwindigkeit(Zahl, NurVor);
  3282.   ZaehleEinerLaufgeschwindigkeit(Zahl, NurVor);
  3283.   if (ZufallZuerst==!ZehnerZuerst) ZaehleZehnerLaufgeschwindigkeit(Zahl, NurVor);
  3284.   ZeigeMatrixZeigedauer();
  3285. }
  3286.  
  3287. //---------------------------------------------------------------------------
  3288.  
  3289. void ZeigeBisZahlKodiertaster(char Zahl, char Max) {
  3290.   SetzeZahlHauptMatrix(AlteZahl);
  3291.   ZeigeMatrixLaufgeschwindigkeit();
  3292.   if (ZufallZuerst==ZehnerZuerst) KodierTasterZehnerLaufgeschwindigkeit(Zahl, Max);
  3293.   KodierTasterEinerLaufgeschwindigkeit(Zahl);
  3294.   if (ZufallZuerst==!ZehnerZuerst) KodierTasterZehnerLaufgeschwindigkeit(Zahl, Max);
  3295.   ZeigeMatrixZeigedauer();
  3296.   AlteZahl=Zahl;
  3297. }
  3298.  
  3299. //---------------------------------------------------------------------------
  3300.  
  3301. void ZeigeBisZahlFlughafen(char Zahl, boolean Nullstellen) {
  3302.   char Zehner=Zahl/10;
  3303.   char Einer=Zahl%10;
  3304.   char z;
  3305.   byte Spalten;
  3306.   for (z=-1; z<=9; z++) {
  3307. //    SetzeNeueLaufgeschwindigkeit(max(MaxVariLaufgeschwindigkeit-abs(Zahl-z), MinVariLaufgeschwindigkeit));
  3308.     LoescheSchattenMatrix();
  3309.     if (z>=0) SetzeZahlSchattenMatrix(z*11);
  3310.     Spalten=0;
  3311.     if (Zehner>=z) Spalten=Spalten | ZehnerSpalten;
  3312.     if (Einer>=z) Spalten=Spalten | EinerSpalten;
  3313.     if (Spalten>0) {
  3314.       SchiebeSpalten6xHochRunterLaufgeschwindigkeit(Spalten);
  3315.     }
  3316.   }
  3317.   ZeigeMatrixZeigedauer();
  3318.  
  3319.   if (Nullstellen==true) {
  3320.     for (z=min(Einer,Zehner); z<=10; z++) {
  3321.       Spalten=0;
  3322.       LoescheSchattenMatrix();
  3323.       if (z<10) SetzeZahlSchattenMatrix(z*11);
  3324.       if (Zehner<z) { Spalten=Spalten | ZehnerSpalten; Zehner++; }
  3325.       if (Einer<z)  { Spalten=Spalten | EinerSpalten;  Einer++; }
  3326.       if (Spalten>0) {
  3327.         SchiebeSpalten6xHochRunterLaufgeschwindigkeit(Spalten);
  3328.         ZeigeMatrixLaufgeschwindigkeit();
  3329.       }
  3330.     }
  3331.   }
  3332. }
  3333.  
  3334. //---------------------------------------------------------------------------
  3335.  
  3336. void ZeigeZahlKopierePunkte(char x, char y, char Art, char Zahl) {
  3337.   SetzeZahlSchattenMatrix(Zahl);
  3338.   KopierePunkteLaufgeschwindigkeit(x, y, Art);
  3339.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  3340. }
  3341.  
  3342. //---------------------------------------------------------------------------
  3343.  
  3344. void ZeigeZahlenKopierePunkte(char x, char y, char Art) {
  3345.   ZeigeZahlKopierePunkte(x, y, Art, Zahl1);
  3346.   ZeigeZahlKopierePunkte(x, y, Art, Zahl2);
  3347.   ZeigeZahlKopierePunkte(x, y, Art, LeerZahl);
  3348. }
  3349.  
  3350. //---------------------------------------------------------------------------
  3351.  
  3352. void ZeigeZahlSchichteSpalten(byte Richtung1, byte Richtung2, char Zahl) {
  3353.   SetzeZahlSchattenMatrix(Zahl);
  3354.   SchichteSpaltenLaufgeschwindigkeit(Richtung1, Richtung2);
  3355.   ZeigeMatrixZeigedauer();
  3356.   SetzeZahlSchattenMatrix(LeerZahl);
  3357.   SchichteSpaltenLaufgeschwindigkeit(Richtung1, Richtung2);
  3358. }
  3359.  
  3360. //---------------------------------------------------------------------------
  3361.  
  3362. void ZeigeZahlenSchichteSpalten(char Richtung1, char Richtung2) {
  3363.   ZeigeZahlSchichteSpalten(Richtung1, Richtung2, Zahl1);
  3364.   ZeigeZahlSchichteSpalten(Richtung1, Richtung2, Zahl2);
  3365. }
  3366.  
  3367. //---------------------------------------------------------------------------
  3368.  
  3369. void ZeigeZahlSchichteZeilen(byte Richtung1, byte Richtung2, char Zahl) {
  3370.   SetzeZahlSchattenMatrix(Zahl);
  3371.   SchichteZeilenLaufgeschwindigkeit(Richtung1, Richtung2);
  3372.   ZeigeMatrixZeigedauer();
  3373.   SetzeZahlSchattenMatrix(LeerZahl);
  3374.   SchichteZeilenLaufgeschwindigkeit(Richtung1, Richtung2);
  3375. }
  3376.  
  3377. //---------------------------------------------------------------------------
  3378.  
  3379. void ZeigeZahlenSchichteZeilen(char Richtung1, char Richtung2) {
  3380.   ZeigeZahlSchichteZeilen(Richtung1, Richtung2, Zahl1);
  3381.   ZeigeZahlSchichteZeilen(Richtung1, Richtung2, Zahl2);
  3382. }
  3383.  
  3384. //---------------------------------------------------------------------------
  3385.  
  3386. void ZeigeZahlFuelleSpalten(byte Richtung1, byte Richtung2, char Zahl) {
  3387.   SetzeZahlSchattenMatrix(Zahl);
  3388.   FuelleSpaltenLaufgeschwindigkeit(Richtung1, Richtung2);
  3389.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  3390.   LeereSpaltenLaufgeschwindigkeit(Richtung1, Richtung2);
  3391. }
  3392.  
  3393. //---------------------------------------------------------------------------
  3394.  
  3395. void ZeigeZahlenFuelleLeereSpalten(byte Richtung1, byte Richtung2) {
  3396.   SetzeNeueLaufgeschwindigkeit(Laufgeschwindigkeit/2);
  3397.   if (Richtung1==Links) {
  3398.     ZeigeZahlFuelleSpalten(Richtung1, Richtung2, Zahl1);
  3399.     Richtung=Richtung1; SchiebeAbstandLaufgeschwindigkeit();
  3400.     ZeigeZahlFuelleSpalten(Richtung1, Richtung2, Zahl2);
  3401.   } else {
  3402.     ZeigeZahlFuelleSpalten(Richtung1, Richtung2, Zahl2);
  3403.     Richtung=Richtung1; SchiebeAbstandLaufgeschwindigkeit();
  3404.     ZeigeZahlFuelleSpalten(Richtung1, Richtung2, Zahl1);
  3405.   }
  3406.   ZurueckZurAltenLaufgeschwindigkeit();;
  3407. }
  3408.  
  3409. //---------------------------------------------------------------------------
  3410.  
  3411. void ZeigeZahlFuelleZeilen(byte Richtung1, byte Richtung2, char Zahl) {
  3412.   SetzeZahlSchattenMatrix(Zahl);
  3413.   FuelleZeilenLaufgeschwindigkeit(Richtung1, Richtung2);
  3414.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  3415.   LeereZeilenLaufgeschwindigkeit(Richtung1, Richtung2);
  3416. }
  3417.  
  3418. //---------------------------------------------------------------------------
  3419.  
  3420. void ZeigeZahlenFuelleLeereZeilen(char Richtung1, char Richtung2) {
  3421.   SetzeNeueLaufgeschwindigkeit(Laufgeschwindigkeit/2);
  3422.   ZeigeZahlFuelleZeilen(Richtung1, Richtung2, Zahl1);
  3423.   Richtung=Richtung1; SchiebeAbstandLaufgeschwindigkeit();
  3424.   ZeigeZahlFuelleZeilen(Richtung1, Richtung2, Zahl2);
  3425.   ZurueckZurAltenLaufgeschwindigkeit();
  3426.   Richtung=Richtung1; SchiebeLeerLaufgeschwindigkeit();
  3427. }
  3428.  
  3429. //---------------------------------------------------------------------------
  3430.  
  3431. void ZahlMassbandLaufgeschwindigkeit(char Zahl) {
  3432.   switch(Richtung) {
  3433.     case Hoch:
  3434.     case Runter:
  3435.       SchiebeMusterLaufgeschwindigkeit(AlleSpalten);
  3436.       SchiebeMusterLaufgeschwindigkeit(LeerMuster);
  3437.       SchiebeZahlLaufgeschwindigkeit(Zahl);
  3438.       break;
  3439.     case Links:
  3440.     case Rechts:
  3441.       SchiebeMusterLaufgeschwindigkeit(LeerMuster);
  3442.       SchiebeMusterLaufgeschwindigkeit(AlleSpalten);
  3443.       SchiebeMusterLaufgeschwindigkeit(LeerMuster);
  3444.       SchiebeZahlLaufgeschwindigkeit(Zahl);
  3445.       break;
  3446.   }
  3447.   ZeigeMatrixLaufgeschwindigkeit();
  3448. }
  3449.  
  3450. //---------------------------------------------------------------------------
  3451.  
  3452. void ZeigeZahlMassband(char Zahl) {
  3453.   ZahlMassbandLaufgeschwindigkeit(Zahl);
  3454.   ZeigeMatrixZeigedauer();
  3455. }
  3456.  
  3457. //---------------------------------------------------------------------------
  3458.  
  3459. void ZeigeBisZahlMassband(char Zahl) {
  3460.   for (char z=0; z<=Zahl; z++) {
  3461.     SetzeNeueLaufgeschwindigkeit(max(MaxVariLaufgeschwindigkeit-abs(Zahl-z), MinVariLaufgeschwindigkeit));
  3462.     ZahlMassbandLaufgeschwindigkeit(z);
  3463.     ZurueckZurAltenLaufgeschwindigkeit();
  3464.   }
  3465.   ZeigeMatrixZeigedauer();
  3466. }
  3467.  
  3468. //---------------------------------------------------------------------------
  3469.  
  3470. void ZahlKarteAuflegenLaufgeschwindigkeit(char Zahl) {
  3471.   SetzeZahlSchattenMatrix(Zahl);
  3472.   KarteAuflegenLaufgeschwindigkeit();
  3473. }
  3474.  
  3475. //---------------------------------------------------------------------------
  3476.  
  3477. void ZeigeBisZahlKarteAuflegen(char Zahl) {
  3478.   for (char z=0; z<=Zahl; z++) {
  3479.     SetzeNeueLaufgeschwindigkeit(max(MaxVariLaufgeschwindigkeit-abs(Zahl-z), MinVariLaufgeschwindigkeit));
  3480.     ZahlKarteAuflegenLaufgeschwindigkeit(z);
  3481.     ZurueckZurAltenLaufgeschwindigkeit();
  3482.   }
  3483.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  3484. }
  3485.  
  3486. //---------------------------------------------------------------------------
  3487.  
  3488. void ZeigeZahlEineKarteAuflegen(char Zahl) {
  3489.   SetzeZahlSchattenMatrix(Zahl);
  3490.   KarteAuflegenLaufgeschwindigkeit();
  3491.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  3492. }
  3493.  
  3494. //---------------------------------------------------------------------------
  3495.  
  3496. void ZeigeZahlenEineKarteAuflegen() {
  3497.   if (Richtung==Rechts) TauscheZahlen();
  3498.   ZeigeZahlEineKarteAuflegen(Zahl1);
  3499.   ZeigeZahlEineKarteAuflegen(Zahl2);
  3500.   ZeigeZahlEineKarteAuflegen(LeerZahl);
  3501. }
  3502.  
  3503. //---------------------------------------------------------------------------
  3504.  
  3505. void ZahlKarteWegnehmenLaufgeschwindigkeit(char Zahl) {
  3506.   if (Richtung==Rechts) TauscheZahlen();
  3507.   SetzeZahlSchattenMatrix(Zahl);
  3508.   KarteWegnehmenLaufgeschwindigkeit();
  3509. }
  3510.  
  3511. //---------------------------------------------------------------------------
  3512.  
  3513. void ZeigeBisZahlKarteWegnehmen(char Zahl) {
  3514.   for (char z=0; z<=Zahl; z++) {
  3515.     SetzeNeueLaufgeschwindigkeit(max(MaxVariLaufgeschwindigkeit-abs(Zahl-z), MinVariLaufgeschwindigkeit));
  3516.     ZahlKarteWegnehmenLaufgeschwindigkeit(z);
  3517.     ZurueckZurAltenLaufgeschwindigkeit();
  3518.   }
  3519.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  3520. }
  3521.  
  3522. //---------------------------------------------------------------------------
  3523.  
  3524. void ZeigeZahlEineKarteWegnehmen(char Zahl) {
  3525.   SetzeZahlSchattenMatrix(Zahl);
  3526.   KarteWegnehmenLaufgeschwindigkeit();
  3527.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  3528. }
  3529.  
  3530. //---------------------------------------------------------------------------
  3531.  
  3532. void ZeigeZahlenEineKarteWegnehmen() {
  3533.   ZeigeZahlEineKarteWegnehmen(Zahl1);
  3534.   ZeigeZahlEineKarteWegnehmen(Zahl2);
  3535.   ZeigeZahlEineKarteWegnehmen(LeerZahl);
  3536. }
  3537.  
  3538. //---------------------------------------------------------------------------
  3539.  
  3540. void ZeigeZahlPunktlauf(char x1, char y1, char LaufArt, char Zahl) {
  3541.   SetzeZahlSchattenMatrix(Zahl);
  3542.   char x2=RechteSpalte-x1; char y2=UntereZeile-y1;
  3543.   char SollPunkt=PunktEin; if (Zahl==LeerZahl) SollPunkt=PunktAus;
  3544.   if (bitRead(LaufArt,0)) {x1=RechteSpalte-x1; x2=RechteSpalte-x2; } // x spiegeln
  3545.   if (bitRead(LaufArt,1)) {y1=UntereZeile-y1;  y2=UntereZeile-y2; }  // y spiegeln
  3546.   char x=x1, y=y1;
  3547.   char Abbruch=false;
  3548.   while(Abbruch==false) {
  3549.     char Punkt;
  3550.     if (Zahl!=LeerZahl)
  3551.       Punkt=HolePunkt(SchattenMatrix,x,y);
  3552.     else
  3553.       Punkt=HolePunkt(HauptMatrix,x,y);
  3554.     if (Punkt==PunktEin) {
  3555.       char xs=x, ys=y, xz=x, yz=y;
  3556.       if (Zahl!=LeerZahl) {
  3557.         if (bitRead(LaufArt,2)==0) ys=y2; else xs=x2;
  3558.       } else {
  3559.         if (bitRead(LaufArt,2)==0) yz=y1; else xz=x1;
  3560.       }
  3561.       PunktlaufLaufgeschwindigkeit(xs, ys, xz, yz, SollPunkt);
  3562.     }
  3563.     if (x==x2 && y==y2) Abbruch=true;
  3564.     if (bitRead(LaufArt,3)==0) { // Fuellrichtung
  3565.       if (x==x2) {
  3566.         x=x1; if (y<y2) y++; if (y>y2) y--;
  3567.       } else {
  3568.         if (x<x2) x++; if (x>x2) x--;
  3569.       }
  3570.     } else {
  3571.       if (y==y2) {
  3572.         y=y1; if (x<x2) x++; if (x>x2) x--;
  3573.       } else {
  3574.         if (y<y2) y++; if (y>y2) y--;
  3575.       }
  3576.     }
  3577.   }
  3578.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  3579. }
  3580.  
  3581. //---------------------------------------------------------------------------
  3582.  
  3583. void ZeigeZahlenPunktlauf(char x, char y, char Art) {
  3584.   SetzeNeueLaufgeschwindigkeit(Laufgeschwindigkeit/2);
  3585.   ZeigeZahlPunktlauf(x, y, Art, Zahl1);
  3586.   ZeigeZahlPunktlauf(x, y, Art, LeerZahl);
  3587.   ZeigeZahlPunktlauf(x, y, Art, Zahl2);
  3588.   ZeigeZahlPunktlauf(x, y, Art, LeerZahl);
  3589. }
  3590.  
  3591. //---------------------------------------------------------------------------
  3592.  
  3593. void ZeigeZahlSchiebeZeilen(byte Zeilen1, byte Richtung1, byte Richtung2, char Zahl) {
  3594.   SetzeZahlSchattenMatrix(Zahl);
  3595.   SchiebeZeilenLaufgeschwindigkeit(Zeilen1, Richtung1, Richtung2);
  3596.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  3597. }
  3598.  
  3599. //---------------------------------------------------------------------------
  3600.  
  3601. void ZeigeZahlenSchiebeZeilen(byte Zeilen, byte Richtung1, byte Richtung2) {
  3602.   ZeigeZahlSchiebeZeilen(Zeilen, Richtung1, Richtung2, Zahl1);
  3603.   ZeigeZahlSchiebeZeilen(Zeilen, Richtung1, Richtung2, Zahl2);
  3604.   ZeigeZahlSchiebeZeilen(Zeilen, Richtung1, Richtung2, LeerZahl);
  3605. }
  3606.  
  3607. //---------------------------------------------------------------------------
  3608.  
  3609. void ZeigeZahlSchiebeZeilenGleichzeitig(byte Zeilen1, byte Zeilen2, char Zahl) {
  3610.   SetzeZahlSchattenMatrix(Zahl);
  3611.   SchiebeZeilenGleichzeitigLaufgeschwindigkeit(Zeilen1, Zeilen2);
  3612.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  3613. }
  3614.  
  3615. //---------------------------------------------------------------------------
  3616.  
  3617. void ZeigeZahlenSchiebeZeilenGleichzeitig(byte Zeilen) {
  3618.   ZeigeZahlSchiebeZeilenGleichzeitig(Zeilen, Zeilen^AlleZeilen, Zahl1);
  3619.   ZeigeZahlSchiebeZeilenGleichzeitig(Zeilen, Zeilen^AlleZeilen, Zahl2);
  3620.   ZeigeZahlSchiebeZeilenGleichzeitig(Zeilen, Zeilen^AlleZeilen, LeerZahl);
  3621. }
  3622.  
  3623. //---------------------------------------------------------------------------
  3624.  
  3625. void ZeigeZahlRomEiner(char Zahl, char Offset, boolean Zwoelf) {
  3626.   if (Zwoelf==true && Zahl==0) Zahl=12;
  3627.   byte Muster=RomZiffern[Zahl];
  3628.   while (Muster!=0) {
  3629.     switch((Muster&0x03)+Offset) {
  3630.       case 1: SchiebeZeichenLinksLaufgeschwindigkeit(_I); break;
  3631.       case 2: SchiebeZeichenLinksLaufgeschwindigkeit(_V); break;
  3632.       case 3: SchiebeZeichenLinksLaufgeschwindigkeit(_X); break;
  3633.       case 5: SchiebeZeichenLinksLaufgeschwindigkeit(_X); break;
  3634.       case 6: SchiebeZeichenLinksLaufgeschwindigkeit(_L); break;
  3635.       case 7: SchiebeZeichenLinksLaufgeschwindigkeit(_C); break;
  3636.     }
  3637.     Muster=Muster>>2;
  3638.     if (Muster!=0) SchiebeAbstandLinksLaufgeschwindigkeit();
  3639.   }
  3640. }
  3641.  
  3642. //---------------------------------------------------------------------------
  3643.  
  3644. void ZeigeZahlRomEiner(char Zahl, char Offset) {
  3645.   ZeigeZahlRomEiner(Zahl, Offset, true);
  3646. }
  3647.  
  3648. //---------------------------------------------------------------------------
  3649.  
  3650. void ZeigeZahlRomischZehner(char Zahl) {
  3651.   if (Zahl>=10) ZeigeZahlRomEiner(Zahl/10, 4, false); // statt IVX XLC
  3652.   SchiebeAbstandLinksLaufgeschwindigkeit();
  3653.   ZeigeZahlRomEiner(Zahl%10, 0, false);
  3654. }
  3655.  
  3656. //---------------------------------------------------------------------------
  3657.  
  3658. void ZeigeZahlVorhang(const byte Muster[], char Zahl) {
  3659.   VorhangLaufgeschwindigkeit(Muster);
  3660.   ZeigeMatrixLaufgeschwindigkeit();
  3661.   SetzeZahlSchattenMatrix(Zahl);
  3662.   Balken=Muster[2];
  3663.   RichtungUmkehr();
  3664.   KopiereLaufgeschwindigkeit();
  3665.   RichtungUmkehr();
  3666.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  3667. }
  3668.  
  3669. //---------------------------------------------------------------------------
  3670.  
  3671. void ZeigeZahlenVorhang(const byte Muster[]) {
  3672.   ZeigeZahlVorhang(Muster, Zahl1);
  3673.   ZeigeZahlVorhang(Muster, Zahl2);
  3674.   ZeigeZahlVorhang(Muster, LeerZahl);
  3675. }
  3676.  
  3677. //---------------------------------------------------------------------------
  3678.  
  3679. void ZahlRadarLaufgeschwindigkeit(char Zahl) {
  3680.   SetzeZahlSchattenMatrix(Zahl);
  3681.   KopiereLaufgeschwindigkeit();
  3682. }
  3683.  
  3684. //---------------------------------------------------------------------------
  3685.  
  3686. void ZeigeZahlRadar(char Zahl) {
  3687.   ZahlRadarLaufgeschwindigkeit(Zahl);
  3688.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  3689. }
  3690.  
  3691. //---------------------------------------------------------------------------
  3692.  
  3693. void ZeigeBisZahlRadar(char Zahl) {
  3694.   char z=AlteZahl;
  3695.   byte RichtungRadar=Richtung;
  3696.   do {
  3697.     if (z<Zahl) {z++; Richtung=RichtungRadar;}
  3698.     if (z>Zahl) {z--; Richtung=RichtungRadar^1;}
  3699.     SetzeNeueLaufgeschwindigkeit(max(MaxVariLaufgeschwindigkeit-abs(Zahl-z), MinVariLaufgeschwindigkeit));
  3700.     ZahlRadarLaufgeschwindigkeit(z);
  3701.     ZurueckZurAltenLaufgeschwindigkeit();
  3702.   } while(z!=Zahl);
  3703.   ZeigeMatrixZeigedauer();
  3704.   AlteZahl=Zahl;
  3705.   Richtung=RichtungRadar;
  3706. }
  3707.  
  3708. //---------------------------------------------------------------------------
  3709.  
  3710. void ZeigeZahlenRadar() {
  3711.   Balken=AlleSpalten;
  3712.   SetzeNeueLaufgeschwindigkeit(Laufgeschwindigkeit/2);
  3713.   ZeigeBisZahlRadar(Zahl1);
  3714.   ZeigeBisZahlRadar(Zahl2);
  3715.   ZeigeZahlRadar(LeerZahl);
  3716. }
  3717.  
  3718. //---------------------------------------------------------------------------
  3719.  
  3720. void ZeigeZahlKopiereDiagonal(byte Spiegel, char Zahl) {
  3721.   SetzeZahlSchattenMatrix(Zahl);
  3722.   KopiereDiagonalLaufgeschwindigkeit(Spiegel);
  3723.   ZeigeMatrixZeigedauer(Zahl!=LeerZahl);
  3724. }
  3725.  
  3726. //---------------------------------------------------------------------------
  3727.  
  3728. void ZeigeZahlenKopiereDiagonal(byte Spiegel) {
  3729.   ZeigeZahlKopiereDiagonal(Spiegel, Zahl1);
  3730.   ZeigeZahlKopiereDiagonal(Spiegel, Zahl2);
  3731.   ZeigeZahlKopiereDiagonal(Spiegel, LeerZahl);
  3732. }
  3733.  
  3734. //---------------------------------------------------------------------------
  3735.  
  3736. void ZeigeZahlRaute(byte Richtung1, byte Richtung2, char Zahl) {
  3737.   LoescheHauptMatrix();
  3738.   SetzeZahlSchattenMatrix(Zahl);
  3739.   RauteLaufgeschwindigkeit(Richtung1, Richtung2);
  3740.   ZeigeMatrixZeigedauer();
  3741.   LoescheSchattenMatrix();
  3742.   RauteLaufgeschwindigkeit(Richtung1, Richtung2);
  3743. }
  3744.  
  3745. //--------------------------------------------------------------------------
  3746.  
  3747. void ZeigeZahlenRaute(byte Richtung1, byte Richtung2) {
  3748.    if (Random(2)==0) Richtung1=Richtung1+2; else Richtung2=Richtung2+2;
  3749.    ZeigeZahlRaute(Richtung1, Richtung2, Zahl1);
  3750.    ZeigeZahlRaute(Richtung1, Richtung2, Zahl2);
  3751. }
  3752.  
  3753. //---------------------------------------------------------------------------
  3754.  
  3755. void ZeigeZahlBinaer01(char Zahl, boolean Bcd, boolean LH) {
  3756.   if (Bcd) Zahl=BinBcd(Zahl);
  3757.   for (char BitPos=MSB; BitPos>=LSB; BitPos--) {
  3758.     char Zeichen=bitRead(Zahl,BitPos);
  3759.     if (LH==true) Zeichen=Zeichen+_L; // statt 0,1 L,H benutzen
  3760.     SchiebeZeichenLinksLaufgeschwindigkeit(Zeichen);
  3761.     if (BitPos>0) SchiebeAbstandLinksLaufgeschwindigkeit();
  3762.     if (BitPos==4 && Bcd==1) SchiebeAbstandLinksLaufgeschwindigkeit();
  3763.   }
  3764. }
  3765.  
  3766. //---------------------------------------------------------------------------
  3767.  
  3768. void ZeigeZahlGespiegeltRechts(char Zahl) {
  3769.   SetzeZahlSchattenMatrix(Zahl);
  3770.   SpiegelSpaltenSchattenMatrix();
  3771.   Richtung=Rechts;
  3772.   SchiebeLaufgeschwindigkeit();
  3773.   ZeigeMatrixZeigedauer();
  3774. }
  3775.  
  3776. //---------------------------------------------------------------------------
  3777.  
  3778. void ZeigeZahlenGespiegelt() {
  3779.   Richtung=Rechts;
  3780.   ZeigeZahlGespiegeltRechts(Zahl1);
  3781.   SchiebeDoppelpunktLaufgeschwindigkeit();
  3782.   ZeigeZahlGespiegeltRechts(Zahl2);
  3783.   SchiebeLeerRechtsLaufgeschwindigkeit();
  3784. }
  3785.  
  3786. //---------------------------------------------------------------------------
  3787.  
  3788. void ZeigeZahlKopfUeber(char Zahl) {
  3789.   SetzeZahlSchattenMatrix(Zahl);
  3790.   SpiegelSpaltenSchattenMatrix();
  3791.   SpiegelZeilenSchattenMatrix();
  3792.   Richtung=Rechts;  SchiebeLaufgeschwindigkeit();
  3793.   ZeigeMatrixZeigedauer();
  3794. }
  3795.  
  3796. //---------------------------------------------------------------------------
  3797.  
  3798. void ZeigeZahlenKopfueber() {
  3799.   Richtung=Rechts;
  3800.   ZeigeZahlKopfUeber(Zahl1);
  3801.   SchiebeDoppelpunktLaufgeschwindigkeit();
  3802.   ZeigeZahlKopfUeber(Zahl2);
  3803.   SchiebeLeerRechtsLaufgeschwindigkeit();
  3804. }
  3805.  
  3806. //---------------------------------------------------------------------------
  3807.  
  3808. void ZeigeZahlFibonacci(char Zahl) {
  3809.   Zahl=Zahl%12;
  3810.   if (Zahl==0) Zahl=12;
  3811.   char Summe, Zufall;
  3812.   do {
  3813.     Summe=0;
  3814.     Zufall=Random(32);
  3815.     if (bitRead(Zufall,0)==1) Summe=Summe+1;
  3816.     if (bitRead(Zufall,1)==1) Summe=Summe+1;
  3817.     if (bitRead(Zufall,2)==1) Summe=Summe+2;
  3818.     if (bitRead(Zufall,3)==1) Summe=Summe+3;
  3819.     if (bitRead(Zufall,4)==1) Summe=Summe+5;
  3820.   } while (Summe!=Zahl);
  3821.   if (bitRead(Zufall,0)==1) SetzePunktHauptMatrix(2,0,1);
  3822.   if (bitRead(Zufall,1)==1) SetzePunktHauptMatrix(2,1,1);
  3823.   if (bitRead(Zufall,2)==1) {
  3824.     for (char Spalte=0; Spalte<=1; Spalte++)
  3825.       SetzeSpalteHauptMatrix(Spalte,HoleSpalteHauptMatrix(Spalte)|0x03);
  3826.   }
  3827.   if (bitRead(Zufall,3)==1) {
  3828.     for (char Spalte=0; Spalte<=2; Spalte++)
  3829.       SetzeSpalteHauptMatrix(Spalte,HoleSpalteHauptMatrix(Spalte)|0x1C);
  3830.   }
  3831.   if (bitRead(Zufall,4)==1) {
  3832.     for (char Spalte=3; Spalte<=6; Spalte++)
  3833.       SetzeSpalteHauptMatrix(Spalte,0x1F);
  3834.   }
  3835.   ZeigeMatrix(byte(3*Zeigedauer));
  3836. }
  3837.  
  3838. //---------------------------------------------------------------------------
  3839. // Zeige Datum
  3840. //---------------------------------------------------------------------------
  3841.  
  3842. void ZeigeDatumUS() {
  3843.   SchiebeZeigeZahlLinks(Monat);
  3844.   SchiebeAbstandLinksLaufgeschwindigkeit();
  3845.   SchiebeZeichenLinksLaufgeschwindigkeit(Geteilt);
  3846.   SchiebeAbstandLinksLaufgeschwindigkeit();
  3847.   SchiebeZeigeZahlLinks(Tag);
  3848.   SchiebeAbstandLinksLaufgeschwindigkeit();
  3849.   SchiebeZeichenLinksLaufgeschwindigkeit(Geteilt);
  3850.   SchiebeAbstandLinksLaufgeschwindigkeit();
  3851.   if (ZufallBoolean1==1) {
  3852.     SchiebeZeigeZahlLinks(20); // Jahrhundert
  3853.     SchiebeAbstandLinksLaufgeschwindigkeit();
  3854.   }
  3855.   SchiebeZeigeZahlLinks(Jahr);
  3856.   SchiebeLeerLinksLaufgeschwindigkeit();
  3857. }
  3858.  
  3859. //---------------------------------------------------------------------------
  3860.  
  3861. void ZeigeTagImJahr(void) {
  3862.   int Tage=TagImJahr(Tag, Monat, Jahr);
  3863.   Nullunterdrueckung=true;
  3864.   Richtung=Links;
  3865.   SchiebeGrosserAbstandLaufgeschwindigkeit();
  3866.   if (Tage/100>0) {
  3867.     SchiebeZahlLaufgeschwindigkeit(Tage/100);
  3868.     SchiebeAbstandLinksLaufgeschwindigkeit();
  3869.     Nullunterdrueckung=false;
  3870.   }
  3871.   SchiebeZahlLaufgeschwindigkeit(Tage%100);
  3872.   SchiebeZeichenLinksLaufgeschwindigkeit(Punkt);
  3873.   SchiebeZeichenLinksLaufgeschwindigkeit(_T);
  3874.   SchiebeAbstandLinksLaufgeschwindigkeit();
  3875.   SchiebeZeichenLinksLaufgeschwindigkeit(_A);
  3876.   SchiebeAbstandLinksLaufgeschwindigkeit();
  3877.   SchiebeZeichenLinksLaufgeschwindigkeit(6);  // soll ein G sein
  3878.   Nullunterdrueckung=false;
  3879. }
  3880.  
  3881. //---------------------------------------------------------------------------
  3882.  
  3883. void ZeigeWocheImJahr(void) {
  3884.   char Woche=WocheImJahr();
  3885.   Richtung=Links;
  3886.   SchiebeGrosserAbstandLaufgeschwindigkeit();
  3887.   Nullunterdrueckung=true;
  3888.   SchiebeZeigeZahl(Woche);
  3889.   ZeigeText(WocheText, false, false);
  3890.   Nullunterdrueckung=false;
  3891. }
  3892.  
  3893. //---------------------------------------------------------------------------
  3894. // Zeige Uhrzeit
  3895. //---------------------------------------------------------------------------
  3896.  
  3897. void ZeigeUhrzeitKodiertaster() {
  3898.   ZeigeBisZahlKodiertaster(Stunden, 5); // Zehner nur bis 5
  3899.   ZeigeBisZahlKodiertaster(Minuten, 5); // Zehner nur bis 5
  3900.   SchiebeLeerLaufgeschwindigkeit();
  3901. }
  3902.  
  3903. //---------------------------------------------------------------------------
  3904.  
  3905. void ZeigeUhrzeitZaehle() {
  3906.   ZeigeBisZahlZaehle(Stunden);
  3907.   ZeigeBisZahlZaehle(Minuten);
  3908.   ZeigeSetzeZahlZehnerEiner(LeerZahl);
  3909. }
  3910.  
  3911. //---------------------------------------------------------------------------
  3912.  
  3913. void ZeigeUhrzeitHexadezimal() {
  3914.   ZeigeZahlHexadezimal(Stunden);
  3915.   SchiebeDoppelpunktLaufgeschwindigkeit();
  3916.   ZeigeZahlHexadezimal(Minuten);
  3917.   SchiebeLeerLinksLaufgeschwindigkeit();
  3918. }
  3919.  
  3920. //---------------------------------------------------------------------------
  3921.  
  3922. void ZeigeUhrzeitOktal() {
  3923.   ZeigeZahlOktal(Stunden);
  3924.   SchiebeDoppelpunktLaufgeschwindigkeit();
  3925.   ZeigeZahlOktal(Minuten);
  3926.   SchiebeLeerLinksLaufgeschwindigkeit();
  3927. }
  3928.  
  3929.  
  3930. //---------------------------------------------------------------------------
  3931.  
  3932. void ZeigeUhrzeitRomischEiner() {
  3933.   char RomMinuten=Minuten;
  3934.   char RomStunden=Stunden;
  3935.   RomMinuten=RomMinuten+2;
  3936.   if (RomMinuten>=60) { RomMinuten=RomMinuten-60; RomStunden++; } // Zeit runden
  3937.   ZeigeZahlRomEiner(RomStunden%12, 0);     // 12 Stunden Modus
  3938.   SchiebeDoppelpunktLaufgeschwindigkeit();
  3939.   ZeigeZahlRomEiner(RomMinuten/5, 0);      // nur 12 Werte (I, II, III, IV, V, VI, usw.)
  3940.   SchiebeLeerLinksLaufgeschwindigkeit();
  3941. }
  3942.  
  3943. //---------------------------------------------------------------------------
  3944.  
  3945. void ZeigeUhrzeitRomischZehner() {
  3946.   if (Stunden>0 && Minuten>0) { // sonst keine Anzeige bei Stunden oder Minuten
  3947.     ZeigeZahlRomischZehner(Stunden);
  3948.     SchiebeDoppelpunktLaufgeschwindigkeit();
  3949.     ZeigeZahlRomischZehner(Minuten);
  3950.     SchiebeLeerLinksLaufgeschwindigkeit();
  3951.   } else PauseOk=false;
  3952. }
  3953.  
  3954. //---------------------------------------------------------------------------
  3955.  
  3956. void ZeigeUhrzeitBinaer(boolean Bcd, boolean Spiegeln) {
  3957.   char AltSekunden=Sekunden;
  3958.   char Zaehler=0;
  3959.   while (Zaehler<10/ZeitRaffer && Abbruch==false) { // ###
  3960.     HoleUhr();
  3961.     if (AltSekunden!=Sekunden) {
  3962.       AltSekunden=Sekunden; Zaehler++;
  3963.     }
  3964.     if (Bcd==true) {
  3965.       SetzeZeileHauptMatrix(0,BinBcd(Stunden));
  3966.       SetzeZeileHauptMatrix(2,BinBcd(Minuten));
  3967.       SetzeZeileHauptMatrix(4,BinBcd(Sekunden));
  3968.     } else {
  3969.       SetzeZeileHauptMatrix(0,Stunden);
  3970.       SetzeZeileHauptMatrix(2,Minuten);
  3971.       SetzeZeileHauptMatrix(4,Sekunden);
  3972.     }
  3973.     if (Spiegeln==true) SpiegelSpalten(HauptMatrix);
  3974.     ZeigeMatrixLaufgeschwindigkeit();
  3975.   }
  3976. }
  3977.  
  3978. //---------------------------------------------------------------------------
  3979.  
  3980. void ZeigeUhrzeitZufall() {
  3981.   ZeigeBisZahlZufall(Stunden, 100, 20); // 20 Zahlen bis 100
  3982.   ZeigeBisZahlZufall(Minuten, 100, 10); // 10 Zahlen bis 100
  3983. }
  3984.  
  3985. //---------------------------------------------------------------------------
  3986.  
  3987. void ZeigeUhrzeitZufallZehnerEiner() {
  3988.   SetzeZahlHauptMatrix(0);
  3989.   ZeigeBisZahlZufallZehnerEiner(Stunden, 100, 10); // 10 Zahlen bis 100
  3990.   ZeigeBisZahlZufallZehnerEiner(Minuten, 100, 10); // 10 Zahlen bis 100
  3991.   ZeigeSetzeZahlZehnerEiner(LeerZahl);
  3992. }
  3993.  
  3994. //---------------------------------------------------------------------------
  3995.  
  3996.  
  3997. void ZeigeUhrzeitFlughafen() {
  3998.   SetzeNeueLaufgeschwindigkeit((Laufgeschwindigkeit*2)/3);
  3999.   ZeigeBisZahlFlughafen(Stunden, false);
  4000.   ZeigeBisZahlFlughafen(Minuten, false);
  4001.   SchiebeLeerLaufgeschwindigkeit();
  4002. }
  4003.  
  4004. //--------------------------------------------------------------------------
  4005.  
  4006. void ZeigeUhrzeitDaumenKino() {
  4007.   ZeigeBisZahlDaumenKinoZehnerEiner(Stunden, 5);  // Zehner nur bis 5
  4008.   ZeigeBisZahlDaumenKinoZehnerEiner(Minuten, 5);  // Zehner nur bis 5
  4009.   LoescheSchattenMatrix();
  4010.   if (Richtung>=Hoch) {
  4011.     if (ZufallZuerst==ZehnerZuerst)
  4012.       SchiebeZehnerLaufgeschwindigkeit();
  4013.     else
  4014.       SchiebeEinerLaufgeschwindigkeit();
  4015.     SchiebeLeerLaufgeschwindigkeit();
  4016.   }
  4017. }
  4018.  
  4019. //--------------------------------------------------------------------------
  4020.  
  4021. void ZeigeUhrzeitTacho() {
  4022.   Nullunterdrueckung=false;
  4023.   AlteZahl=0;
  4024.   ZeigeBisZahlTacho(Stunden);
  4025.   ZeigeBisZahlTacho(Minuten);
  4026.   SchiebeLeerLaufgeschwindigkeit();
  4027. }
  4028.  
  4029. //--------------------------------------------------------------------------
  4030.  
  4031. void ZeigeUhrzeitBinaer01(boolean Bcd, boolean LH) {
  4032.   ZeigeZahlBinaer01(Stunden,Bcd,LH);
  4033.   SchiebeDoppelpunktLaufgeschwindigkeit();
  4034.   ZeigeZahlBinaer01(Minuten,Bcd,LH);
  4035.   SchiebeLeerLinksLaufgeschwindigkeit();
  4036. }
  4037.  
  4038. //--------------------------------------------------------------------------
  4039.  
  4040. void ZeigeUhrzeitZaehleZehnerEiner(boolean NurVor) {
  4041.   ZeigeBisZahlZaehleZehnerEiner(Stunden, NurVor);
  4042.   ZeigeBisZahlZaehleZehnerEiner(Minuten, NurVor);
  4043.   ZeigeSetzeZahlZehnerEiner(LeerZahl);
  4044. }
  4045.  
  4046. //--------------------------------------------------------------------------
  4047.  
  4048. void ZeigeUhrFibonacci() {
  4049.   char FibonacciMinuten=Minuten;
  4050.   char FibonacciStunden=Stunden;
  4051.   FibonacciMinuten=FibonacciMinuten+2; // Zeit runden
  4052.   if (FibonacciMinuten>=60) {
  4053.     FibonacciMinuten=FibonacciMinuten-60;
  4054.     FibonacciStunden++;
  4055.   }
  4056.   ZeigeZahlFibonacci(FibonacciStunden);
  4057.   LoescheHauptMatrix();
  4058.   ZeigeMatrixLaufgeschwindigkeit();
  4059.   ZeigeZahlFibonacci(FibonacciMinuten/5); // nur 12 Werte
  4060. }
  4061.  
  4062. //--------------------------------------------------------------------------
  4063.  
  4064. const char UhrText[] PROGMEM={_U, _h, _r2, Ende};
  4065.  
  4066. void ZeigeUhrzeitMitText(boolean Textmitte) {
  4067.   Laufgeschwindigkeit=(Laufgeschwindigkeit*3)/2;
  4068.   SchiebeZeigeZahlLinks(Stunden);
  4069.   if (Textmitte==true)
  4070.     ZeigeText(UhrText, false, false); // 12 Uhr 34
  4071.   else
  4072.     SchiebeDoppelpunktLaufgeschwindigkeit(); // 12:34 Uhr
  4073.   if (Minuten>0) SchiebeZeigeZahlLinks(Minuten); // keine Minutenanzeige bei 0 (z.B. 14:00 => 14 Uhr)
  4074.   if (Textmitte==false) ZeigeText(UhrText, false, false);
  4075.   SchiebeLeerLinksLaufgeschwindigkeit();
  4076. }
  4077.  
  4078. //--------------------------------------------------------------------------
  4079.  
  4080. void ZeigeGemeinsam(byte Zufall) {
  4081.   switch (Zufall) {
  4082.     case   0: Richtung=Links; ZeigeZahlen(); break;
  4083.     case   1: Richtung=Rechts; TauscheZahlen(); ZeigeZahlen(); break;
  4084.     case   2: Richtung=Hoch; ZeigeZahlen(); break;
  4085.     case   3: Richtung=Runter; TauscheZahlen(); ZeigeZahlen(); break;
  4086.  
  4087.     case   4: ZeigeZahlenLinksLinksRechts(); break;
  4088.     case   5: ZeigeZahlenRechtsRechtsLinks(); break;
  4089.     case   6: ZeigeZahlenSenkrechtLinksSenkrecht(ZufallSenkrecht1, ZufallSenkrecht2); break;
  4090.     case   7: TauscheZahlen(); ZeigeZahlenSenkrechtRechtsSenkrecht(ZufallSenkrecht1, ZufallSenkrecht2); break;
  4091.  
  4092.     case   8: ZeigeZahlenZehnerLinksEiner(ZufallSenkrecht1, ZufallSenkrecht2); break;
  4093.     case   9: TauscheZahlen(); ZeigeZahlenEinerRechtsZehner(ZufallSenkrecht1, ZufallSenkrecht2); break;
  4094.     case  10: ZeigeZahlenZehnerLinksEinerLinks(); break;
  4095.     case  11: TauscheZahlen(); ZeigeZahlenEinerRechtsZehnerRechts(); break;
  4096.     case  12: ZeigeZahlenZehnerVonRechtsEiner(ZufallSenkrecht1); break;
  4097.     case  13: ZeigeZahlenEinerVonLinksZehner(ZufallSenkrecht1); break;
  4098.     case  14: ZeigeZahlenSchiebeZehnerEiner(ZufallSenkrecht1, ZufallSenkrecht2); break;
  4099.     case  15: Richtung=ZufallSenkrecht1; ZeigeZahlenSchiebeZehnerEinerGleichzeitig(); break;
  4100.     case  16: ZeigeZahlenSetzen(); break;
  4101.     case  17: ZeigeZahlenSetzenZehnerEiner(); break;
  4102.  
  4103.     case  18: Richtung=Zufall4Richtungen; ZeigeZahlenLaufenReinRaus(); break;
  4104.     case  19: ZeigeZahlenSchichteSpalten(ZufallWaagerecht1, ZufallSenkrecht2); break;
  4105.     case  20: ZeigeZahlenFuelleLeereSpalten(ZufallWaagerecht1, ZufallSenkrecht2); break;
  4106.     case  21: ZeigeZahlenSchichteZeilen(ZufallSenkrecht1, ZufallWaagerecht2); break;
  4107.     case  22: ZeigeZahlenFuelleLeereZeilen(ZufallSenkrecht1, ZufallWaagerecht2); break;
  4108.  
  4109.     case  23: Richtung=Zufall4Richtungen; Balken=ZufallBoolean1?-1:0x7F; ZeigeZahlenKopieren(); break;
  4110.     case  24: ZeigeZahlenKopiereZehnerEiner(ZufallSenkrecht1, ZufallSenkrecht2); break;
  4111.     case  25: Richtung=Random(4,6); ZeigeZahlenKopiereNachGleichzeitig(); break;
  4112.     case  26: Richtung=ZufallWaagerecht1; ZeigeZahlenKopiereNachGleichzeitig(); break;
  4113.  
  4114.     case  27: Richtung=ZufallSenkrecht1; ZeigeZahlenSchiebeSpalten124(MusterSpalten124[Random(6)]); break;
  4115.     case  28: ZeigeZahlenSchiebeSpalten25(MusterSpalten25[Random(6)], ZufallSenkrecht1, ZufallSenkrecht2); break;
  4116.     case  29: Richtung=ZufallSenkrecht1; ZeigeZahlenSchiebeSpalten25Gleichzeitig(MusterSpalten25[Random(6)]); break;
  4117.     case  30: ZeigeZahlenSchiebeZeilen(MusterZeilen[Random(2)], ZufallWaagerecht1, ZufallWaagerecht2); break;
  4118.     case  31: Richtung=ZufallWaagerecht1; ZeigeZahlenSchiebeZeilenGleichzeitig(MusterZeilen[Random(2)]); break;
  4119.  
  4120.     case  32: ZeigeZahlenPunkteZufall(); break;
  4121.     case  33: ZeigeZahlenZehnerEinerPunkteZufall(); break;
  4122.     case  34: ZeigeZahlenSpaltenZufall(0); break;
  4123.     case  35: ZeigeZahlenZeilenZufall(ZufallBoolean1); break;
  4124.  
  4125.     case  36: ZeigeZahlenTauschen(); break;
  4126.     case  37: ZeigeZahlenSchreibeZehnerEiner(); break;
  4127.  
  4128.     case  38: ZeigeZahlenKopierePunkte(6*ZufallBoolean1, 4*ZufallBoolean2, ZufallBoolean3); break;
  4129.     case  39: ZeigeZahlenPunktlauf(6*ZufallBoolean1, 4*ZufallBoolean2, Random(16)); break;
  4130.  
  4131.     case  40: ZeigeZahlenKopiereDiagonal(Zufall4Richtungen); break;
  4132.     case  41: Richtung=Zufall10Richtungen; ZeigeZahlenHinHer(); break;
  4133.     case  42: ZeigeZahlenRaute(ZufallWaagerecht1, ZufallWaagerecht2); break;
  4134.  
  4135.     case  43: Richtung=Random(3,5); ZeigeZahlenVorhang(MusterVorhang[Random(AnzahlVorhang)]); break;
  4136.     case  44: Richtung=Zufall4Richtungen; ZeigeZahlenEineKarteAuflegen(); break;
  4137.     case  45: Richtung=Zufall4Richtungen; ZeigeZahlenEineKarteWegnehmen(); break;
  4138.  
  4139.     case  46: ZeigeZahlenSpirale( 0, ZufallArt16); break;
  4140.     case  47: ZeigeZahlenSpirale( 1, ZufallArt16); break;
  4141.     case  48: ZeigeZahlenSpirale( 2, ZufallArt16); break;
  4142.     case  49: ZeigeZahlenSpirale( 3, ZufallArt16); break;
  4143.     case  50: ZeigeZahlenSpirale( 4, ZufallArt16); break;
  4144.     case  51: ZeigeZahlenSpirale( 5, ZufallArt16); break;
  4145.     case  52: ZeigeZahlenSpirale( 6, ZufallArt16); break;
  4146.     case  53: ZeigeZahlenSpirale( 7, ZufallArt16); break;
  4147.     case  54: ZeigeZahlenSpirale( 8, ZufallArt16); break;
  4148.     case  55: ZeigeZahlenSpirale( 9, ZufallArt16); break;
  4149.     case  56: ZeigeZahlenSpirale(10, ZufallArt16); break;
  4150.     case  57: ZeigeZahlenSpirale(11, ZufallArt16); break;
  4151.     case  58: ZeigeZahlenSpirale(12, ZufallArt16); break;
  4152.  
  4153.     case  59: ZeigeZahlenGespiegelt(); break;
  4154.     case  60: ZeigeZahlenKopfueber(); break;
  4155.  
  4156.     default: PauseOk=false;
  4157.   }
  4158. }
  4159. // const char MaxGleich=60;
  4160.  
  4161. //--------------------------------------------------------------------------
  4162.  
  4163. void ZeigeUhrzeitZufaellig(byte Zufall) {
  4164.   Vorbereitung();
  4165.  
  4166.   if (Zufall==0xFF) { do { Zufall=Random(MaxUhrzeit+1); } while (WarSchonDran(Zufall)==true); }
  4167.  
  4168.   if (Zufall<=MaxGleich) {
  4169.     ZeigeGemeinsam(Zufall);
  4170.   } else {
  4171.     switch(Zufall) {
  4172.       case  MaxGleich+ 1: ZeigeUhrzeitZufall(); break;
  4173.       case  MaxGleich+ 2: ZeigeUhrzeitZufallZehnerEiner(); break;
  4174.       case  MaxGleich+ 3: ZeigeUhrzeitZaehle(); break;
  4175.       case  MaxGleich+ 4: ZeigeUhrzeitHexadezimal(); break;
  4176.       case  MaxGleich+ 5: ZeigeUhrzeitOktal(); break;
  4177.       case  MaxGleich+ 6: Richtung=Zufall4Richtungen; ZeigeZahlenRadar(); break;
  4178.       case  MaxGleich+ 7: Richtung=ZufallSenkrecht1; ZeigeUhrzeitTacho(); break;
  4179.       case  MaxGleich+ 8: Richtung=Zufall4Richtungen; ZeigeUhrzeitDaumenKino(); break;
  4180.       case  MaxGleich+ 9: Richtung=ZufallSenkrecht1; ZeigeUhrzeitFlughafen(); break;
  4181.       case  MaxGleich+10: ZeigeUhrzeitRomischZehner(); break;
  4182.  
  4183.       case  MaxGleich+11: ZeigeUhrzeitZaehleZehnerEiner(ZufallBoolean1); break;
  4184.       case  MaxGleich+12: ZeigeUhrzeitBinaer01(ZufallBoolean1,ZufallBoolean2); break;
  4185.  
  4186.       case  MaxGleich+13: ZeigeUhrzeitRomischEiner(); break;
  4187.       case  MaxGleich+14: Richtung=ZufallSenkrecht1; ZeigeUhrzeitKodiertaster(); break;
  4188.       case  MaxGleich+15: ZeigeUhrzeitBinaer(ZufallBoolean1, ZufallBoolean2); break;
  4189.       case  MaxGleich+16: ZeigeUhrzeitMitText(ZufallBoolean1); break;
  4190.       case  MaxGleich+17: ZeigeUhrFibonacci(); break;
  4191.  
  4192.       default: PauseOk=false;
  4193.     }
  4194.   }
  4195.   MachePause();
  4196. }
  4197.  
  4198. //---------------------------------------------------------------------------
  4199.  
  4200. void ZeigeUhrzeitZufaellig2x() {
  4201.   if (bitRead(AktTasten,XJ2_Bit)==1) {
  4202.     ZeigeUhrzeitZufaellig(0xFF);
  4203.     ZeigeUhrzeitZufaellig(0xFF);
  4204.   }
  4205. }
  4206.  
  4207. //---------------------------------------------------------------------------
  4208. // Zeige Temperatur
  4209. //---------------------------------------------------------------------------
  4210.  
  4211. void SchiebeGradCelsius() {
  4212.   SchiebeZeigeZahl(GradCelsius);
  4213. }
  4214.  
  4215. //---------------------------------------------------------------------------
  4216.  
  4217. void AbspannGradCelsiusLinks() {
  4218.   SchiebeAbstandLinksLaufgeschwindigkeit();
  4219.   Richtung=Links; SchiebeGradCelsius();
  4220.   SchiebeLeerLaufgeschwindigkeit();
  4221. }
  4222.  
  4223. //---------------------------------------------------------------------------
  4224.  
  4225. void ZeigeTemperaturTacho() {
  4226.   Nullunterdrueckung=true;
  4227.   ZeigeBisZahlTacho(Temperatur);
  4228.   SchiebeZeigeZahl(GradCelsius);
  4229.   SchiebeLeerLaufgeschwindigkeit();
  4230. }
  4231.  
  4232. //---------------------------------------------------------------------------
  4233.  
  4234. void ZeigeTemperaturDaumenKino() {
  4235.   ZeigeBisZahlDaumenKinoZehnerEiner(Temperatur, 9); // Zehner bis 9
  4236.   ZeigeZahlSchiebeZehnerEiner(Richtung, Richtung, GradCelsius);
  4237.   ZeigeZahlSchiebeZehnerEiner(Richtung, Richtung, LeerZahl);
  4238. }
  4239.  
  4240. //---------------------------------------------------------------------------
  4241.  
  4242. void ZeigeTemperaturFlughafen() {
  4243.   ZeigeBisZahlFlughafen(Temperatur, false); // nicht leeren
  4244.   SchiebeZeigeZahl(GradCelsius);
  4245.   SchiebeLeerLaufgeschwindigkeit();
  4246. }
  4247.  
  4248. //---------------------------------------------------------------------------
  4249.  
  4250. void ZeigeTemperaturZufall() {
  4251.   ZeigeBisZahlZufall(Temperatur, 100, 20);  // 20 Zahlen bis 100
  4252.   ZeigeBisZahlZufall(GradCelsius, 100, 10); // 10 Zahlen bis 100
  4253.   ZeigeSetzeZahlHauptMatrix(LeerZahl);
  4254. }
  4255.  
  4256. //---------------------------------------------------------------------------
  4257.  
  4258. void ZeigeTemperaturZufallZehnerEiner() {
  4259.   SetzeZahlHauptMatrix(0);
  4260.   ZeigeBisZahlZufallZehnerEiner(Temperatur, 100, 20);  // 20 Zahlen bis 100
  4261.   ZeigeBisZahlZufallZehnerEiner(GradCelsius, 100, 10); // 10 Zahlen bis 100
  4262.   ZeigeSetzeZahlZehnerEiner(LeerZahl);
  4263. }
  4264.  
  4265. //---------------------------------------------------------------------------
  4266.  
  4267. void ZeigeTemperaturZaehler() {
  4268.   Nullunterdrueckung=true;
  4269.   ZeigeBisZahlZaehle(Temperatur);
  4270.   ZeigeSetzeZahlZehnerEiner(GradCelsius);
  4271.   ZeigeSetzeZahlZehnerEiner(LeerZahl);
  4272. }
  4273.  
  4274. //---------------------------------------------------------------------------
  4275.  
  4276. void ZeigeTemperaturHexadezimal() {
  4277.   ZeigeZahlHexadezimal(Temperatur);
  4278.   AbspannGradCelsiusLinks();
  4279. }
  4280.  
  4281. //---------------------------------------------------------------------------
  4282.  
  4283. void ZeigeTemperaturOktal() {
  4284.   ZeigeZahlOktal(Temperatur);
  4285.   AbspannGradCelsiusLinks();
  4286. }
  4287.  
  4288. //---------------------------------------------------------------------------
  4289.  
  4290. void ZeigeTemperaturMassband() {
  4291.   ZeigeBisZahlMassband(Temperatur);
  4292.   ZeigeZahlMassband(GradCelsius);
  4293.   ZeigeZahlMassband(LeerZahl);
  4294. }
  4295.  
  4296. //---------------------------------------------------------------------------
  4297.  
  4298. void ZeigeTemperaturKarteAuflegen() {
  4299.   ZeigeBisZahlKarteAuflegen(Temperatur);
  4300.   ZeigeZahlEineKarteAuflegen(GradCelsius);
  4301.   ZeigeZahlEineKarteAuflegen(LeerZahl);
  4302. }
  4303.  
  4304. //---------------------------------------------------------------------------
  4305.  
  4306. void ZeigeTemperaturKarteWegnehmen() {
  4307.   ZeigeBisZahlKarteWegnehmen(Temperatur);
  4308.   ZeigeZahlEineKarteWegnehmen(GradCelsius);
  4309.   ZeigeZahlEineKarteWegnehmen(LeerZahl);
  4310. }
  4311.  
  4312. //---------------------------------------------------------------------------
  4313.  
  4314. void ZeigeTemperaturRadar() {
  4315.   Balken=AlleSpalten;
  4316.   ZeigeBisZahlRadar(Temperatur);
  4317.   ZeigeZahlRadar(GradCelsius);
  4318.   ZeigeZahlRadar(LeerZahl);
  4319. }
  4320.  
  4321. //---------------------------------------------------------------------------
  4322.  
  4323. void ZeigeTemperaturKelvin(boolean NurKelvin) {
  4324.   if (NurKelvin==false) {
  4325.     SchiebeZeigeZahl(Temperatur);
  4326.     SchiebeAbstandLaufgeschwindigkeit();
  4327.     SchiebeGradCelsius();
  4328.     SchiebeAbstandLaufgeschwindigkeit();
  4329.     SchiebeZeichenLaufgeschwindigkeit(Gleich);
  4330.     SchiebeAbstandLaufgeschwindigkeit();
  4331.   }
  4332.   SchiebeZeichenLaufgeschwindigkeit(Kelvin/100); // Hunderter
  4333.   ZeigeMatrixZeigedauer();
  4334.   SchiebeAbstandLaufgeschwindigkeit();
  4335.   SchiebeZeigeZahl(Kelvin%100);                  // Einer und Zehner
  4336.   SchiebeAbstandLaufgeschwindigkeit();
  4337.   SchiebeZeichenLaufgeschwindigkeit(_K);
  4338.   SchiebeLeerLaufgeschwindigkeit();
  4339. }
  4340.  
  4341. //---------------------------------------------------------------------------
  4342.  
  4343. void ZeigeTemperaturFahrenheit(boolean NurFahrenheit) {
  4344.   if (NurFahrenheit==false) {
  4345.     SchiebeZeigeZahl(Temperatur);
  4346.     SchiebeAbstandLaufgeschwindigkeit();
  4347.     SchiebeGradCelsius();
  4348.     SchiebeAbstandLaufgeschwindigkeit();
  4349.     SchiebeZeichenLaufgeschwindigkeit(Gleich);
  4350.     SchiebeAbstandLaufgeschwindigkeit();
  4351.   }
  4352.   SchiebeZeigeZahl(Fahrenheit);
  4353.   SchiebeAbstandLaufgeschwindigkeit();
  4354.   SchiebeZeichenLaufgeschwindigkeit(Grad);
  4355.   SchiebeAbstandLaufgeschwindigkeit();
  4356.   SchiebeZeichenLaufgeschwindigkeit(_F);
  4357.   ZeigeMatrixZeigedauer();
  4358.   SchiebeLeerLaufgeschwindigkeit();
  4359. }
  4360.  
  4361. //---------------------------------------------------------------------------
  4362.  
  4363.  
  4364. void ZeigeTemperaturBinaer01(boolean Bcd, boolean LH) {
  4365.   ZeigeZahlBinaer01(Temperatur,Bcd,LH);
  4366.   AbspannGradCelsiusLinks();
  4367. }
  4368.  
  4369. //---------------------------------------------------------------------------
  4370.  
  4371. void ZeigeTemperaturRomischZehner() {
  4372.   ZeigeZahlRomischZehner(Temperatur);
  4373.   AbspannGradCelsiusLinks();
  4374. }
  4375.  
  4376. //---------------------------------------------------------------------------
  4377.  
  4378. void ZeigeTemperaturCountZehnerEiner(boolean NurVor) {
  4379.   ZeigeBisZahlZaehleZehnerEiner(Temperatur, NurVor);
  4380.   ZeigeSetzeZahlZehnerEiner(GradCelsius);
  4381.   ZeigeSetzeZahlZehnerEiner(LeerZahl);
  4382. }
  4383.  
  4384. //---------------------------------------------------------------------------
  4385.  
  4386. void ZeigeTemperaturZufaellig(byte Zufall) {
  4387.   if (bitRead(AktTasten,XJ3_Bit)==1) {
  4388.     Vorbereitung();
  4389.     HoleTemperatur();
  4390.  
  4391.     if (Zufall==0xFF) { do { Zufall=Random(MaxTemperatur+1); } while (WarSchonDran(Zufall)==true); }
  4392.  
  4393.     Zahl1=Temperatur; Zahl2=GradCelsius;
  4394.  
  4395.     if (Zufall<=MaxGleich) {
  4396.       ZeigeGemeinsam(Zufall);
  4397.     } else {
  4398.       switch(Zufall) {
  4399.         case MaxGleich+ 1: ZeigeTemperaturZufall(); break;
  4400.         case MaxGleich+ 2: ZeigeTemperaturZufallZehnerEiner(); break;
  4401.         case MaxGleich+ 3: ZeigeTemperaturZaehler(); break;
  4402.         case MaxGleich+ 4: ZeigeTemperaturHexadezimal(); break;
  4403.         case MaxGleich+ 5: ZeigeTemperaturOktal();  break;
  4404.         case MaxGleich+ 6: Richtung=Zufall4Richtungen; ZeigeTemperaturRadar(); break;
  4405.         case MaxGleich+ 7: Richtung=ZufallSenkrecht1; ZeigeTemperaturTacho(); break;
  4406.         case MaxGleich+ 8: Richtung=ZufallSenkrecht1; ZeigeTemperaturDaumenKino(); break;
  4407.         case MaxGleich+ 9: Richtung=ZufallSenkrecht1; ZeigeTemperaturFlughafen(); break;
  4408.         case MaxGleich+10: ZeigeTemperaturRomischZehner(); break;
  4409.  
  4410.         case MaxGleich+11: ZeigeTemperaturCountZehnerEiner(ZufallBoolean1); break;
  4411.         case MaxGleich+12: ZeigeTemperaturBinaer01(ZufallBoolean1,ZufallBoolean2); break;
  4412.  
  4413.         case MaxGleich+13: Richtung=Zufall4Richtungen; ZeigeTemperaturMassband(); break;
  4414.         case MaxGleich+14: Richtung=Zufall4Richtungen; ZeigeTemperaturKarteAuflegen(); break;
  4415.         case MaxGleich+15: Richtung=Zufall4Richtungen; ZeigeTemperaturKarteWegnehmen(); break;
  4416.         case MaxGleich+16: ZeigeTemperaturKelvin(ZufallBoolean1); break;
  4417.         case MaxGleich+17: ZeigeTemperaturFahrenheit(ZufallBoolean1); break;
  4418.  
  4419.         default: PauseOk=false;
  4420.       }
  4421.     }
  4422.     MachePause();
  4423.   }
  4424. }
  4425.  
  4426. //---------------------------------------------------------------------------
  4427. // zeige Intermezzo
  4428. //---------------------------------------------------------------------------
  4429.  
  4430. //0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
  4431.  
  4432. const char  Drehen90[AnzahlLeds] PROGMEM = {
  4433.   0, 5,12,19,26,33, 6, 7, 4,11,18,25,32,13,14, 3,10,17,24,31,20,21, 2, 9,16,23,30,27,28, 1, 8,15,22,29,34};
  4434.  
  4435. const char Drehen45[AnzahlLeds] PROGMEM = {
  4436.   0, 3, 4, 5,12,19, 6, 7, 2,10,11,18,26,13,14, 1, 9,17,25,33,20,21, 8,16,23,24,32,27,28,15,22,29,30,31,34};
  4437.  
  4438. const char Umlauf1[AnzahlLeds] PROGMEM = {
  4439.   0, 2, 3, 4, 5,12, 6, 7, 1,10,11,18,19,13,14, 8, 9,17,25,26,20,21,15,16,23,24,33,27,28,22,29,30,31,32,34};
  4440.  
  4441. const char Umlauf2[AnzahlLeds] PROGMEM = {
  4442.   0, 2, 3, 4, 5,12, 6, 7, 1,16, 9,10,19,13,14, 8,23,17,11,26,20,21,15,24,25,18,33,27,28,22,29,30,31,32,34};
  4443.  
  4444. const char AnzahlWinkel=4;
  4445. const char *const WinkelArten[AnzahlWinkel] PROGMEM = {Umlauf1, Umlauf2, Drehen45, Drehen90};
  4446.  
  4447. //const char PalText[] PROGMEM = {0x11, 0x1F, 0x11, 0x00, 0x06, 0x0F, 0x1E, 0x0F, 0x06, 0x40, 0x1F, 0x05, 0x02, 0x00, 0x1E, 0x05, 0x1E, 0x00, 0x1F, 0x10, 0x10, 0x00, 0x00, 0x00, 0x09, 0x10, 0x16, 0x10, 0x09, 0x20, Ende};
  4448. const char EGSMuster[] PROGMEM = {0x11, 0x1F, 0x11, 0x00, 0x00, 0x06, 0x0F, 0x1E, 0x0F, 0x06, 0x40, 0x00, 0x1F, 0x15, 0x15, 0x11, 0x00, 0x40, 0x0E, 0x11, 0x15, 0x1D, 0x00, 0x40, 0x12, 0x15, 0x15, 0x09, 0x00, 0x40, Ende};
  4449.  
  4450. const char LeerBild[AnzahlSpalten]      PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  4451. const char KleinHerzBild[AnzahlSpalten] PROGMEM = {0x00, 0x00, 0x06, 0x0C, 0x06, 0x00, 0x00};
  4452. const char GrossHerzBild[AnzahlSpalten] PROGMEM = {0x00, 0x06, 0x0F, 0x1E, 0x0F, 0x06, 0x00};
  4453. const char LeerHerzBild[AnzahlSpalten]  PROGMEM = {0x00, 0x06, 0x09, 0x12, 0x09, 0x06, 0x00};
  4454. const char *const HerzenBilder[] = {LeerHerzBild, GrossHerzBild, KleinHerzBild, LeerBild};
  4455.  
  4456. const char Gesicht1Bild[7]  PROGMEM = {0x00, 0x09, 0x10, 0x16, 0x10, 0x09, 0x00}; // :-)
  4457. const char Gesicht2Bild[7]  PROGMEM = {0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00}; // :-
  4458. const char Gesicht3Bild[7]  PROGMEM = {0x00, 0x09, 0x10, 0x16, 0x10, 0x08, 0x00}; // .-)
  4459. const char *const GesichterBilder[] = {Gesicht2Bild, Gesicht3Bild, LeerBild};
  4460.  
  4461. const char Raute1Bild[AnzahlSpalten]    PROGMEM = {0x00, 0x04, 0x0E, 0x1F, 0x0E, 0x04, 0x00};
  4462. const char Raute2Bild[AnzahlSpalten]    PROGMEM = {0x00, 0x04, 0x0A, 0x11, 0x0A, 0x04, 0x00};
  4463. const char Quadrat1Bild[AnzahlSpalten]  PROGMEM = {0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00};
  4464. const char Quadrat2Bild[AnzahlSpalten]  PROGMEM = {0x00, 0x1F, 0x11, 0x11, 0x11, 0x1F, 0x00};
  4465. const char *const RautenBilder[] = {Raute1Bild, Raute2Bild, LeerBild, Quadrat1Bild, Quadrat2Bild};
  4466.  
  4467. const char Hampel1Bild[AnzahlSpalten]   PROGMEM = {0x00, 0x04, 0x1E, 0x0F, 0x1E, 0x04, 0x00};
  4468. const char Hampel2Bild[AnzahlSpalten]   PROGMEM = {0x00, 0x11, 0x0E, 0x0F, 0x0E, 0x11, 0x00};
  4469.  
  4470. const char AnzahlAutoMuster=6;
  4471. const char Auto1Muster[8] PROGMEM = {0x0C, 0x1C, 0x0F, 0x0D, 0x0F, 0x1F, 0x0F, Ende};
  4472. const char Auto2Muster[8] PROGMEM = {0x0C, 0x1A, 0x0E, 0x0E, 0x0E, 0x1E, 0x0E, Ende};
  4473. const char Auto3Muster[8] PROGMEM = {0x0E, 0x1D, 0x0F, 0x0C, 0x0C, 0x1C, 0x0E, Ende};
  4474. const char Auto4Muster[8] PROGMEM = {0x0F, 0x1D, 0x0F, 0x0C, 0x0C, 0x1C, 0x0E, Ende};
  4475. const char Auto5Muster[8] PROGMEM = {0x0C, 0x1A, 0x0E, 0x08, 0x08, 0x18, 0x0E, Ende};
  4476. const char Auto6Muster[8] PROGMEM = {0x0C, 0x1A, 0x0E, 0x0A, 0x0E, 0x1E, 0x0E, Ende};
  4477.  
  4478. const char *const AutoMuster[AnzahlAutoMuster] = {
  4479.   Auto1Muster, Auto2Muster, Auto3Muster, Auto4Muster, Auto5Muster, Auto6Muster};
  4480.  
  4481. const char AnzahlAnhaengerMuster=3;
  4482. const char Anhaenger1Muster[8] PROGMEM = {0x08, 0x08, 0x0E, 0x1A, 0x0A, 0x1A, 0x0E, Ende};
  4483. const char Anhaenger2Muster[8] PROGMEM = {0x08, 0x08, 0x0E, 0x1E, 0x0E, 0x1E, 0x0E, Ende};
  4484. const char Anhaenger3Muster[8] PROGMEM = {0x08, 0x08, 0x0C, 0x18, 0x08, 0x18, 0x0C, Ende};
  4485.  
  4486. const char *const AnhaengerMuster[AnzahlAnhaengerMuster] = {
  4487.   Anhaenger1Muster, Anhaenger2Muster, Anhaenger3Muster};
  4488.  
  4489. const char AnzahlUbootBilder=4;
  4490. const char UBootBilder[4*AnzahlUbootBilder][7]  PROGMEM = {
  4491.   {0x1C, 0x14, 0x1C, 0x08, 0x08, 0x08, 0x08},
  4492.   {0x1C, 0x14, 0x1C, 0x08, 0x0C, 0x08, 0x10},
  4493.   {0x1C, 0x14, 0x1C, 0x08, 0x08, 0x1C, 0x00},
  4494.   {0x1C, 0x14, 0x1C, 0x08, 0x18, 0x08, 0x04},
  4495.  
  4496.   {0x04, 0x0A, 0x0E, 0x0E, 0x04, 0x04, 0x04},
  4497.   {0x04, 0x0A, 0x0E, 0x0E, 0x04, 0x02, 0x01},
  4498.   {0x04, 0x0A, 0x0E, 0x0E, 0x04, 0x04, 0x04},
  4499.   {0x04, 0x0A, 0x0E, 0x0E, 0x04, 0x08, 0x10},
  4500.  
  4501.   {0x08, 0x14, 0x14, 0x17, 0x14, 0x14, 0x08},
  4502.   {0x08, 0x14, 0x15, 0x17, 0x15, 0x14, 0x08},
  4503.   {0x08, 0x15, 0x15, 0x17, 0x15, 0x15, 0x08},
  4504.   {0x08, 0x14, 0x15, 0x17, 0x15, 0x14, 0x08},
  4505.  
  4506.   {0x18, 0x14, 0x1F, 0x1C, 0x08, 0x08, 0x1C},
  4507.   {0x18, 0x15, 0x1F, 0x1D, 0x08, 0x08, 0x1C},
  4508.   {0x19, 0x15, 0x1F, 0x1D, 0x09, 0x08, 0x1C},
  4509.   {0x18, 0x15, 0x1F, 0x1D, 0x08, 0x08, 0x1C}};
  4510.  
  4511. const char HalloText[] PROGMEM={_H, _A2, _L, _L, _O2, Ende};
  4512.  
  4513. //---------------------------------------------------------------------------
  4514.  
  4515. void SetzeZeilenMuster(char Matrix[], char MusterZeilen[]) {
  4516.   for (char Zeile=ObereZeile; Zeile<=UntereZeile; Zeile++)
  4517.     SetzeZeile(Matrix, Zeile, MusterZeilen[Zeile]);
  4518. }
  4519.  
  4520. //---------------------------------------------------------------------------
  4521.  
  4522. void SetzeZeilenMusterHauptMatrixLaufgeschwindigkeit(char Zeilen[]) {
  4523.   SetzeZeilenMuster(HauptMatrix, Zeilen);
  4524.   ZeigeMatrixLaufgeschwindigkeit();
  4525. }
  4526. //---------------------------------------------------------------------------
  4527.  
  4528. void Drehe(byte Richtung, const char Winkel[], char Oft) {
  4529.   SetzeNeueLaufgeschwindigkeit(Laufgeschwindigkeit*2);
  4530.   ZeigeMatrixLaufgeschwindigkeit();
  4531.   while (Oft>0){
  4532.     KopiereGanzeMatrix(SchattenMatrix, HauptMatrix);
  4533.     for (char Led=0; Led<AnzahlLeds; Led++) {
  4534.       if (Richtung==Links)
  4535.        SetzePunktNrHauptMatrix(Led,HolePunktNr(SchattenMatrix,pgm_read_byte(Winkel+Led)));
  4536.       else
  4537.        SetzePunktNrHauptMatrix(pgm_read_byte(Winkel+Led),HolePunktNr(SchattenMatrix,Led));
  4538.     }
  4539.     ZeigeMatrixLaufgeschwindigkeit();
  4540.     Oft--;
  4541.   }
  4542.   ZurueckZurAltenLaufgeschwindigkeit();
  4543. }
  4544.  
  4545. //---------------------------------------------------------------------------
  4546.  
  4547. void DreheZeilenMuster(char Muster[], byte Richtung, char const Winkel[], char Oft) {
  4548.   SetzeZeilenMusterHauptMatrixLaufgeschwindigkeit(Muster);
  4549.   ZeigeMatrixZeigedauer();
  4550.   Drehe(Richtung, Winkel, Oft);
  4551. }
  4552.  
  4553. //---------------------------------------------------------------------------
  4554.  
  4555. const char AnzahlRotor=4;
  4556. void Rotor(byte Richtung, char Rot, char const Winkel[], char Oft) {
  4557.   char Muster[AnzahlRotor][AnzahlZeilen] = {
  4558.   {0x08, 0x08, 0x08, 0x00, 0x00},
  4559.   {0x22, 0x14, 0x08, 0x00, 0x00},
  4560.   {0x08, 0x08, 0x08, 0x08, 0x08},
  4561.   {0x36, 0x22, 0x3E, 0x22, 0x36}};
  4562.   if (Winkel!=Drehen90 || Rot<2) {
  4563.     DreheZeilenMuster(Muster[Rot], Richtung, Winkel, Oft);
  4564.     ZeigeMatrixZeigedauer();
  4565.     LoescheHauptMatrix();
  4566.     ZeigeMatrixZeigedauer();
  4567.   }
  4568. }
  4569.  
  4570. //---------------------------------------------------------------------------
  4571.  
  4572. void ZeigeBild(const char Bild[], char Spiegel=0) {
  4573.   LoescheHauptMatrix();
  4574.   for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++) {
  4575.     char SetzSpalte=Spalte-BildVersatz;
  4576.     if (SetzSpalte>=LinkeSpalte && SetzSpalte<=RechteSpalte)
  4577.       SetzeSpalteHauptMatrix(SetzSpalte,pgm_read_byte(Bild+Spalte));
  4578.   }
  4579.   if (bitRead(Spiegel,0)==1) SpiegelSpalten(HauptMatrix);
  4580.   if (bitRead(Spiegel,1)==1) SpiegelZeilen(HauptMatrix);
  4581.   ZeigeMatrixLaufgeschwindigkeit();
  4582. }
  4583.  
  4584. //---------------------------------------------------------------------------
  4585.  
  4586. void Blinken(char Oft) {
  4587.   Oft=Oft*2; // jeweils aus und wieder ein
  4588.   LoescheSchattenMatrix();
  4589.   while(Oft>0) {
  4590.     TauscheMatrix();
  4591.     ZeigeMatrixZeigedauer2();
  4592.     Oft--;
  4593.   }
  4594. }
  4595.  
  4596. //---------------------------------------------------------------------------
  4597.  
  4598. void BlinkenBild(const char Bild[], char Oft) {
  4599.   ZeigeBild(Bild);
  4600.   Blinken(Oft);
  4601. }
  4602.  
  4603. //---------------------------------------------------------------------------
  4604.  
  4605. void BlinkenBilder(const char Bild1[], const char Bild2[], char Oft) {
  4606.   SetzeNeueLaufgeschwindigkeit(Laufgeschwindigkeit*4);
  4607.   if (Bild1!=Bild2) {
  4608.     while(Oft>0) {
  4609.       ZeigeBild(Bild1);
  4610.       ZeigeBild(Bild2);
  4611.       Oft--;
  4612.     }
  4613.     ZeigeBild(Bild1);
  4614.   } else PauseOk=false;
  4615.   ZurueckZurAltenLaufgeschwindigkeit();
  4616. }
  4617.  
  4618. //---------------------------------------------------------------------------
  4619.  
  4620. void ZeigeMusterstreifen(char const *Musterstreifen, word BlinkMuster, boolean Leeren) {
  4621.   SetzeNeueLaufgeschwindigkeit(10*ZeitLupe/ZeitRaffer);
  4622.   char Muster;
  4623.   char BlinkOft;
  4624.   do {
  4625.     Muster=pgm_read_byte(Musterstreifen);
  4626.     if (Muster!=Ende) {
  4627.       SchiebeMusterLaufgeschwindigkeit(Muster);
  4628.       if (bitRead(Muster,5)==1) ZeigeMatrix(byte(2*Zeigedauer));
  4629.       if (bitRead(Muster,6)==1) {
  4630.         BlinkOft=BlinkMuster&0x03;
  4631.         if (BlinkOft>0) {
  4632.           ZeigeMatrixZeigedauer();
  4633.           Blinken(BlinkOft);
  4634.         }
  4635.         BlinkMuster=BlinkMuster>>2;
  4636.       }
  4637.     }
  4638.     Musterstreifen++;
  4639.   } while(Muster!=Ende);
  4640.   if (Leeren==true) {
  4641.     SchiebeLeerLaufgeschwindigkeit();
  4642.     ZeigeMatrix(Pausendauer);
  4643.   }
  4644.   ZurueckZurAltenLaufgeschwindigkeit();
  4645. }
  4646.  
  4647.  
  4648. //---------------------------------------------------------------------------
  4649.  
  4650. void DreieckSinusWelle(byte Oft, boolean Sinus) {
  4651.   char WellenWert=bit(MitteZeile);
  4652.   char RichtungWelle=1;
  4653.   Richtung=Links;
  4654.   while(Oft>0) {
  4655.     SchiebeMusterLaufgeschwindigkeit(WellenWert);
  4656.     if (RichtungWelle==1) WellenWert=WellenWert<<1; else WellenWert=WellenWert>>1;
  4657.     if (WellenWert==bit(ObereZeile) || WellenWert==bit(UntereZeile)) {
  4658.       RichtungWelle=-RichtungWelle;
  4659.       if (Sinus==true) SchiebeMusterLaufgeschwindigkeit(WellenWert);
  4660.     }
  4661.     Oft--;
  4662.   }
  4663.   SchiebeLeerLinksLaufgeschwindigkeit();
  4664. }
  4665.  
  4666. //---------------------------------------------------------------------------
  4667.  
  4668. const char AnzahlWuerfelBilder=6;
  4669. void Wuerfeln(byte Oft) {
  4670.   Laufgeschwindigkeit=2;
  4671.   char Muster[AnzahlWuerfelBilder][AnzahlZeilen] = {
  4672.     {0x00, 0x00, 0x08, 0x00, 0x00},
  4673.     {0x20, 0x00, 0x00, 0x00, 0x02},
  4674.     {0x20, 0x00, 0x08, 0x00, 0x02},
  4675.     {0x22, 0x00, 0x00, 0x00, 0x22},
  4676.     {0x22, 0x00, 0x08, 0x00, 0x22},
  4677.     {0x22, 0x00, 0x22, 0x00, 0x22}};
  4678.   static char WuerfelZahl=0;
  4679.   while(Oft>0) {
  4680.     SetzeZeilenMusterHauptMatrixLaufgeschwindigkeit(Muster[WuerfelZahl]);
  4681.     WuerfelZahl++; if (WuerfelZahl>=AnzahlWuerfelBilder) WuerfelZahl=0;
  4682.     if (Oft<17) Laufgeschwindigkeit=Laufgeschwindigkeit+2; // ausrollen
  4683.     Oft--;
  4684.   }
  4685.   ZeigeMatrixZeigedauer();
  4686.   Blinken(3);
  4687. }
  4688.  
  4689. //---------------------------------------------------------------------------
  4690.  
  4691. const char AnzahlDreierMuster=3;
  4692. void DreierMuster(byte Nr, byte Oft) {
  4693.   char Muster[AnzahlDreierMuster][3][AnzahlZeilen] = {
  4694.     {{0x00, 0x00, 0x1C, 0x00, 0x00},
  4695.      {0x00, 0x3E, 0x22, 0x3E, 0x00},
  4696.      {0x7F, 0x41, 0x41, 0x41, 0x7F}},
  4697.     {{0x00, 0x08, 0x08, 0x08, 0x7F},
  4698.      {0x00, 0x1C, 0x08, 0x08, 0x7F},
  4699.      {0x1C, 0x3E, 0x1C, 0x08, 0x7F}},
  4700.     {{0x3E, 0x08, 0x3E, 0x41, 0x3E},
  4701.      {0x1C, 0x08, 0x3E, 0x41, 0x3E},
  4702.      {0x08, 0x08, 0x3E, 0x41, 0x3E}}};
  4703.   char BildFolge[] = {0,1,2,1};
  4704.   while(Oft>0) {
  4705.     for (char BildNr=0; BildNr<sizeof(BildFolge); BildNr++) {
  4706.       SetzeZeilenMusterHauptMatrixLaufgeschwindigkeit(Muster[Nr][BildFolge[BildNr]]);
  4707.     }
  4708.     Oft--;
  4709.   }
  4710. }
  4711.  
  4712. //---------------------------------------------------------------------------
  4713.  
  4714. const char AnzahlViererMuster=2;
  4715. void ViererMuster(byte Nr, byte Oft) {
  4716.   char Muster[AnzahlViererMuster][4][AnzahlZeilen] = {
  4717.     {{0x08, 0x08, 0x08, 0x08, 0x08},
  4718.      {0x14, 0x14, 0x1C, 0x14, 0x14},
  4719.      {0x22, 0x22, 0x3E, 0x22, 0x22},
  4720.      {0x41, 0x41, 0x7F, 0x41, 0x41}},
  4721.     {{0x08, 0x08, 0x08, 0x08, 0x08},
  4722.      {0x1C, 0x14, 0x14, 0x14, 0x1C},
  4723.      {0x3E, 0x22, 0x22, 0x22, 0x3E},
  4724.      {0x7F, 0x41, 0x41, 0x41, 0x7F}}};
  4725.   char BildFolge[] = {0,1,2,3,2,1};
  4726.   while(Oft>0) {
  4727.     for (char BildNr=0; BildNr<sizeof(BildFolge); BildNr++) {
  4728.       SetzeZeilenMusterHauptMatrixLaufgeschwindigkeit(Muster[Nr][BildFolge[BildNr]]);
  4729.     }
  4730.     Oft--;
  4731.   }
  4732. }
  4733.  
  4734. //---------------------------------------------------------------------------
  4735.  
  4736. const char AnzahlFuenferMuster=3;
  4737. void FuenferMuster(byte Nr, byte Oft) {
  4738.   char Muster[AnzahlFuenferMuster][5][AnzahlZeilen] = {
  4739.     {{0x7F, 0x08, 0x08, 0x08, 0x08},
  4740.      {0x08, 0x7F, 0x08, 0x08, 0x08},
  4741.      {0x08, 0x08, 0x7F, 0x08, 0x08},
  4742.      {0x08, 0x08, 0x08, 0x7F, 0x08},
  4743.      {0x08, 0x08, 0x08, 0x08, 0x7F}},
  4744.     {{0x3E, 0x2A, 0x6B, 0x08, 0x08},
  4745.      {0x00, 0x3E, 0x6B, 0x08, 0x08},
  4746.      {0x00, 0x00, 0x7F, 0x08, 0x08},
  4747.      {0x00, 0x00, 0x63, 0x3E, 0x08},
  4748.      {0x00, 0x00, 0x63, 0x22, 0x3E}},
  4749.     {{0x70, 0x10, 0x1C, 0x04, 0x07},
  4750.      {0x00, 0x70, 0x1C, 0x07, 0x00},
  4751.      {0x00, 0x00, 0x7F, 0x00, 0x00},
  4752.      {0x00, 0x07, 0x1C, 0x70, 0x00},
  4753.      {0x07, 0x04, 0x1C, 0x10, 0x70}}};
  4754.   char BildFolge[] = {2,1,0,1,2,3,4,3};
  4755.   while(Oft>0) {
  4756.     for (char BildNr=0; BildNr<sizeof(BildFolge); BildNr++) {
  4757.       SetzeZeilenMusterHauptMatrixLaufgeschwindigkeit(Muster[Nr][BildFolge[BildNr]]);
  4758.     }
  4759.     Oft--;
  4760.   }
  4761. }
  4762.  
  4763. //---------------------------------------------------------------------------
  4764.  
  4765. const char AnzahlSiebenerMuster=2;
  4766. void SiebenerMuster(byte Nr, byte Oft) {
  4767.   char Muster[AnzahlSiebenerMuster][7][AnzahlZeilen] = {
  4768.     {{0x01, 0x01, 0x7F, 0x01, 0x01},
  4769.      {0x02, 0x02, 0x7F, 0x02, 0x02},
  4770.      {0x04, 0x04, 0x7F, 0x04, 0x04},
  4771.      {0x08, 0x08, 0x7F, 0x08, 0x08},
  4772.      {0x10, 0x10, 0x7F, 0x10, 0x10},
  4773.      {0x20, 0x20, 0x7F, 0x20, 0x20},
  4774.      {0x40, 0x40, 0x7F, 0x40, 0x40}},
  4775.     {{0x0F, 0x09, 0x7F, 0x48, 0x78},
  4776.      {0x0E, 0x0A, 0x3E, 0x28, 0x38},
  4777.      {0x0C, 0x0C, 0x1C, 0x18, 0x18},
  4778.      {0x08, 0x08, 0x08, 0x08, 0x08},
  4779.      {0x18, 0x18, 0x1C, 0x0C, 0x0C},
  4780.      {0x38, 0x28, 0x3E, 0x0A, 0x0E},
  4781.      {0x78, 0x48, 0x7F, 0x09, 0x0F}}};
  4782.  
  4783.   char BildFolge[] = {3,2,1,0,1,2,3,4,5,6,5,4};
  4784.   while(Oft>0) {
  4785.     for (char BildNr=0; BildNr<sizeof(BildFolge); BildNr++) {
  4786.       SetzeZeilenMusterHauptMatrixLaufgeschwindigkeit(Muster[Nr][BildFolge[BildNr]]);
  4787.     }
  4788.     Oft--;
  4789.   }
  4790. }
  4791.  
  4792. //---------------------------------------------------------------------------
  4793.  
  4794. void AlleEinAlleAus(byte Oft) {
  4795.   while(Oft>0) {
  4796.     Mischen(AnzahlLeds);
  4797.     for(char Led=0; Led<AnzahlLeds; Led++) {
  4798.       char x=ZufallsZahlen[Led]%AnzahlSpalten;
  4799.       char y=ZufallsZahlen[Led]/AnzahlSpalten;
  4800.       SetzePunktHauptMatrix(x, y, !HolePunkt(HauptMatrix,x,y));
  4801.       ZeigeMatrixLaufgeschwindigkeit();
  4802.     }
  4803.     Oft--;
  4804.   }
  4805. }
  4806.  
  4807. //---------------------------------------------------------------------------
  4808.  
  4809. void Regen(byte Oft) {
  4810.   char ZufallSpalte;
  4811.   Richtung=Runter;
  4812.   while(Oft>0) {
  4813.     SchiebeSpaltenKodiertRunter1x(HauptMatrix,AlleSpalten,0);
  4814.     ZufallSpalte=Random(AnzahlSpalten);
  4815.     if (HoleSpalteHauptMatrix(ZufallSpalte)==LeerMuster) {
  4816.       SetzeSpalteHauptMatrix(ZufallSpalte, bit(ObereZeile));
  4817.       Oft--;
  4818.     }
  4819.     ZeigeMatrixLaufgeschwindigkeit();
  4820.   }
  4821.   SchiebeLeerLaufgeschwindigkeit();
  4822. }
  4823.  
  4824. //---------------------------------------------------------------------------
  4825.  
  4826. const char AnzahlAufAbMuster=3;
  4827. void AufAb(byte Nr, byte Oft) {
  4828.   SetzeNeueLaufgeschwindigkeit(Laufgeschwindigkeit*2);
  4829.   char StartRichtungen[AnzahlAufAbMuster][AnzahlSpalten] = {
  4830.     {   1,    1,    1,    1,    1,    1,    1},
  4831.     {   1,   -1,    1,   -1,    1,   -1,    1},
  4832.     {  -1,    0,    1,    0,   -1,    0,    1}};
  4833.  
  4834.   char Startwerte[AnzahlAufAbMuster][AnzahlSpalten] = {
  4835.    { 0x01, 0x02, 0x04, 0x08, 0x04, 0x02, 0x01},
  4836.    { 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01},
  4837.    { 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04}};
  4838.  
  4839.   char Richtungen[AnzahlSpalten];
  4840.   for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++) {
  4841.     SetzeSpalteHauptMatrix(Spalte, Startwerte[Nr][Spalte]);
  4842.     Richtungen[Spalte]=StartRichtungen[Nr][Spalte];
  4843.   }
  4844.   while(Oft>0) {
  4845.     ZeigeMatrixLaufgeschwindigkeit();
  4846.     for (char Spalte=LinkeSpalte; Spalte<=RechteSpalte; Spalte++) {
  4847.        if (Richtungen[Spalte]== 1) HauptMatrix[Spalte]=HauptMatrix[Spalte]<<1;
  4848.        if (Richtungen[Spalte]==-1) HauptMatrix[Spalte]=HauptMatrix[Spalte]>>1;
  4849.        if (Oft>7) { // rauslaufen lassen
  4850.          if ((HauptMatrix[Spalte]&0x11)!=0) Richtungen[Spalte]=-Richtungen[Spalte];
  4851.        }
  4852.     }
  4853.     Oft--;
  4854.   }
  4855. }
  4856.  
  4857. //---------------------------------------------------------------------------
  4858.  
  4859. void UBoot(byte Ofs) {
  4860.   SetzeNeueLaufgeschwindigkeit(Laufgeschwindigkeit/2);
  4861.   BildVersatz=-7;
  4862.   Ofs=Ofs*4;
  4863.   char Spiegel=ZufallBoolean2;
  4864.   for (char Schiebung=0; Schiebung<15; Schiebung++) {
  4865.     ZeigeBild(UBootBilder[0+Ofs], Spiegel);
  4866.     ZeigeBild(UBootBilder[1+Ofs], Spiegel);
  4867.     ZeigeBild(UBootBilder[2+Ofs], Spiegel);
  4868.     ZeigeBild(UBootBilder[3+Ofs], Spiegel);
  4869.     ZeigeBild(UBootBilder[0+Ofs], Spiegel);
  4870.     BildVersatz++;
  4871.   }
  4872. }
  4873.  
  4874. //---------------------------------------------------------------------------
  4875.  
  4876. void Autos(byte Anzahl) {
  4877.   while(Anzahl>0) {
  4878.     byte MitAnhaenger=Random(4);
  4879.     Richtung=ZufallBoolean2;
  4880.     ZeigeMusterstreifen(AutoMuster[Random(AnzahlAutoMuster)], Random(4), false);
  4881.     if (MitAnhaenger==0) ZeigeMusterstreifen(AnhaengerMuster[Random(AnzahlAnhaengerMuster)], Random(4), false);
  4882.     SchiebeGrosserAbstandLaufgeschwindigkeit();
  4883.     Anzahl--;
  4884.   }
  4885.   SchiebeLeerLaufgeschwindigkeit();
  4886. }
  4887.  
  4888. //---------------------------------------------------------------------------
  4889.  
  4890. void ZeigeIntermezzoZufaellig(byte Zufall) {
  4891.   if (bitRead(AktTasten,XJ4_Bit)==1) {
  4892.     Vorbereitung();
  4893.     const char * Winkel=(const char*)pgm_read_word(&(WinkelArten[Random(AnzahlWinkel)]));
  4894.  
  4895.     if (Zufall==0xFF) Zufall=Random(MaxIntermezzo+1);
  4896.  
  4897.     switch(Zufall) {
  4898.       case  0: BlinkenBilder(HerzenBilder[Random(2)], HerzenBilder[Random(1,4)], Random(4,7)); break;
  4899.       case  1: BlinkenBilder(Gesicht1Bild, GesichterBilder[Random(3)], Random(4,7)); break;
  4900.       case  2: BlinkenBilder(RautenBilder[Random(2)+3*ZufallBoolean1], RautenBilder[Random(3)+2*ZufallBoolean1], Random(4,7)); break;
  4901.       case  3: BlinkenBilder(Hampel1Bild, Hampel2Bild, Random(4,7)); break;
  4902.       case  4: Rotor(ZufallBoolean1, Random(AnzahlRotor), Winkel, 16*Random(2,4)); break;
  4903.       case  5: Richtung=Links; ZeigeMusterstreifen(EGSMuster, 0x01*Random(4)+0x54*Random(4), true); break;
  4904.       case  6: Richtung=Links; ZeigeMusterstreifen(EGSMuster+11, 0x15*ZufallBoolean1+0x2A*ZufallBoolean2, true); break;
  4905.       case  7: Richtung=ZufallBoolean1; Autos(Random(1,6)); break;
  4906.       case  8: ZeigeText(HalloText, true, true); break;
  4907.       case  9: DreieckSinusWelle(29,ZufallBoolean1); break;
  4908.       case 10: AufAb(Random(3),30); break;
  4909.       case 11: Regen(60); break;
  4910.       case 12: AlleEinAlleAus(2); break;
  4911.       case 13: Wuerfeln(Random(50,57)); break;
  4912.       case 14: DreierMuster(Random(AnzahlDreierMuster),10); break;
  4913.       case 15: ViererMuster(Random(AnzahlViererMuster), 10); break;
  4914.       case 16: FuenferMuster(Random(AnzahlFuenferMuster),10); break;
  4915.       case 17: SiebenerMuster(Random(AnzahlSiebenerMuster),10); break;
  4916.       case 18: UBoot(Random(AnzahlUbootBilder)); break;
  4917.  
  4918.       default: PauseOk=false;
  4919.     }
  4920.     MachePause();
  4921.   }
  4922. }
  4923.  
  4924. //---------------------------------------------------------------------------
  4925.  
  4926. void ZeigeDatumLinks(byte Art, byte Art2) {
  4927.   if (Art<=7) {
  4928.     if (bitRead(Art,0)==1) {
  4929.       SchiebeZeichenLinksLaufgeschwindigkeit(WochenTagTexte[WTag][0]);
  4930.       SchiebeAbstandLinksLaufgeschwindigkeit();
  4931.       SchiebeZeichenLinksLaufgeschwindigkeit(WochenTagTexte[WTag][1]);
  4932.       ZeigeMatrixZeigedauer();
  4933.       SchiebeZeichenLinksLaufgeschwindigkeit(Punkt);
  4934.     }
  4935.  
  4936.     SchiebeZeigeZahlLinks(Tag);
  4937.     SchiebeZeichenLinksLaufgeschwindigkeit(Punkt);
  4938.  
  4939.     SchiebeZeigeZahlLinks(Monat);
  4940.     SchiebeZeichenLinksLaufgeschwindigkeit(Punkt);
  4941.  
  4942.     if (bitRead(Art,1)==1) {
  4943.       if (bitRead(Art,2)==1) {
  4944.         SchiebeZeigeZahlLinks(20);  // Jahrhundert
  4945.         SchiebeAbstandLinksLaufgeschwindigkeit();
  4946.       }
  4947.       SchiebeZeigeZahlLinks(Jahr);
  4948.       SchiebeAbstandLinksLaufgeschwindigkeit();
  4949.     }
  4950.    if (Art2==1) ZeigeTagImJahr();
  4951.    if (Art2==2) ZeigeWocheImJahr();
  4952.   }  else {
  4953.     ZeigeDatumUS();
  4954.   }
  4955.   Richtung=Links;
  4956.   SchiebeGrosserAbstandLaufgeschwindigkeit();
  4957. }
  4958.  
  4959. //---------------------------------------------------------------------------
  4960.  
  4961. void ZeigeUhrzeitLinks() {
  4962.   SchiebeZeigeZahlLinks(Stunden);
  4963.   SchiebeZeichenLaufgeschwindigkeit(Doppelpunkt);
  4964.   SchiebeZeigeZahlLinks(Minuten);
  4965.   SchiebeLeerLinksLaufgeschwindigkeit();
  4966. }
  4967.  
  4968. //---------------------------------------------------------------------------
  4969.  
  4970. void ZeigeNeueUhrzeitLinks() {
  4971.   HoleUhr();
  4972.   ZeigeUhrzeitLinks();
  4973. }
  4974.  
  4975. //---------------------------------------------------------------------------
  4976.  
  4977. void ZeigeTemperaturLinks() {
  4978.   HoleTemperatur();
  4979.   SchiebeZeigeZahlLinks(Temperatur);
  4980.   AbspannGradCelsiusLinks();
  4981. }
  4982.  
  4983. //---------------------------------------------------------------------------
  4984.  
  4985. void Trio(byte Art1, byte Art2) {
  4986.   ZeigeDatumLinks(Art1, Art2);
  4987.   ZeigeUhrzeitLinks();
  4988.   ZeigeTemperaturLinks();
  4989.   MachePause();
  4990. }
  4991.  
  4992. //---------------------------------------------------------------------------
  4993.  
  4994. void setup() {
  4995.   Wire.begin();
  4996.   for (char Zeile=ObereZeile; Zeile<=UntereZeile; Zeile++) {
  4997.     pinMode(ZeilenPins[Zeile], OUTPUT);
  4998.     digitalWrite(ZeilenPins[Zeile], LOW);
  4999.   }
  5000.   for (char i=0; i<3; i++) {
  5001.     pinMode(DecoderPins[i], OUTPUT);
  5002.     digitalWrite(DecoderPins[i], LOW);
  5003.   }
  5004.  
  5005.   pinMode(WeckerPin, OUTPUT);
  5006.   digitalWrite(WeckerPin, HIGH); // Piezzotest
  5007.   delay(100);
  5008.   digitalWrite(WeckerPin, LOW);
  5009.  
  5010.   pinMode(TastenPin, INPUT_PULLUP);
  5011.   do {
  5012.     Multiplexen(MaxAnzeigeDauer/2);
  5013.   } while ((AktTasten&TastenMaske)!=0);
  5014.  
  5015.   Modus=0;
  5016.   Abbruch=false;
  5017.   if (HoleUhr()==false) SpeichereWecker(); // Batteriespannung war wohl weg
  5018.   HoleWecker();
  5019.   randomSeed((Stunden*60+Minuten)*60+Sekunden);
  5020.   Vorbereitung(); //
  5021. // alles zum Testen neuer Muster (auskommentiert)
  5022. //  while(!Abbruch) { for(byte i=0; i<=MaxUhrzeit; i++) ZeigeUhrzeitZufaellig(i); } // XJ2 stecken
  5023. //  while(!Abbruch) { for(byte i=0; i<=MaxTemperatur; i++) ZeigeTemperaturZufaellig(i); } // XJ3 stecken
  5024. //  while(!Abbruch) { for(byte i=0; i<=MaxIntermezzo; i++) ZeigeIntermezzoZufaellig(i); } // XJ4 stecken
  5025. //  while(!Abbruch) { ZeigeUhrzeitZufaellig(46); }  // XJ2 stecken
  5026. //  while(!Abbruch) { ZeigeTemperaturZufaellig(MaxGleich+13); } // XJ3 stecken
  5027. //  while(!Abbruch) { ZeigeIntermezzoZufaellig(18);  }
  5028. }
  5029.  
  5030. //---------------------------------------------------------------------------
  5031.  
  5032. void loop() {
  5033.   Vorbereitung();
  5034.   switch (Modus) {
  5035.     case 0:
  5036.       if (WeckerSchellt>0) {
  5037.           ZeigeNeueUhrzeitLinks();
  5038.       } else {
  5039.         if ((AktTasten&JumperMaske)==0){ // keine Jumper gesteckt
  5040.           Trio(7, 0); // mit Tag, Jahr 4 stellig, ohne Zusatz
  5041.         } else {
  5042.           if (bitRead(AktTasten,XJ1_Bit)) Trio(Random(9), Random(8));
  5043.           ZeigeUhrzeitZufaellig2x();
  5044.           ZeigeTemperaturZufaellig();
  5045.           ZeigeUhrzeitZufaellig2x();
  5046.           ZeigeIntermezzoZufaellig(0xFF);
  5047.           ZeigeUhrzeitZufaellig2x();
  5048.           ZeigeTemperaturZufaellig();
  5049.           ZeigeUhrzeitZufaellig2x();
  5050.         }
  5051.       }
  5052.       break;
  5053.     case ZeitStellModus:    Stelle(Jahr, JahrTrenner, 0, 99); break;
  5054.     case ZeitStellModus+1:  Stelle(Monat, MonatTrenner, 1, 12); break;
  5055.     case ZeitStellModus+2:  Stelle(Tag, TagTrenner, 1, MaxTage[Monat-1]); break;
  5056.     case ZeitStellModus+3:  Stelle(Stunden, StundenTrenner, 0, 23); break;
  5057.     case ZeitStellModus+4:  Stelle(Minuten, MinutenTrenner, 0, 59); break;
  5058.     case ZeitStellModus+5:  SpeichereUhr(); Modus=0; break;
  5059.  
  5060.     case WeckerStellModus:   Stelle(WeckerWTag, WeckerWTagTrenner, Montag, Sonntag); break;
  5061.     case WeckerStellModus+1: Stelle(WeckerEinAus[WeckerWTag], WeckerEinAusTrenner, WeckerAus, WeckerEin); break;
  5062.     case WeckerStellModus+2: Stelle(WeckerStunden[WeckerWTag], WeckerStundenTrenner, 0, 23); break;
  5063.     case WeckerStellModus+3: Stelle(WeckerMinuten[WeckerWTag], WeckerMinutenTrenner, 0, 59); break;
  5064.     case WeckerStellModus+4: SpeichereWecker(); Modus=0; break;
  5065.  
  5066.     default: Modus=0;
  5067.   }
  5068.   Abbruch=false;
  5069. }
  5070.  
  5071. //---------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment